Assume指令解析
assume的用法和固定搭配
assume的用法和固定搭配一、什么是“assume”?在英语中,“assume”是一个常用的动词,其基本含义是“假设”、“承担”或“担任”的意思。
它可以用于许多不同的场合和情景中,表达各种各样的想法、行为和感受。
本文将分析“assume”的不同用法和固定搭配,以帮助读者更好地理解并运用该词。
二、表示假设或推测的用法1. assume that...在表示假设或推测时,我们经常使用形如“assume that...”的结构来引导从句。
例如:“Let's assume that the meeting will start at 9 a.m.”(让我们暂且假设会议将在上午九点开始)。
这个结构提供了一个前提条件,并且让我们忽略了这种可能性是否真实。
2. assume someone is...如果你对某人做出推测或猜测,可以使用类似于“assume someone is...”的句式。
例如:“I assumed he was a doctor because he was wearing a white lab coat and had a stethoscope around his neck.”(我以为他是一个医生,因为他穿着白大褂,在脖子上挂着听诊器)。
“Assume”在此处表示基于观察或其他信息所作出的合理猜测。
三、表示担任职责的用法1. assume responsibility“Assume responsibility”是一个非常常见的固定搭配,它表示“承担责任”。
例如:“As the team leader, she assumed responsibility for the project's success.”(作为团队领导,她承担了项目成功的责任)。
“Assume responsibility”通常被用于强调某人愿意或必须承担他们应尽的职责。
2. assume a role同样,在表达具体角色时,我们可以使用“assume a role”的形式。
汇编语言学习assume的作用详解
汇编语⾔学习assume的作⽤详解assume 的作⽤是关联段名与段寄存器。
如果你在数据段中定义了变量名,⽐如:x db 0⽽你在代码中,需要直接使⽤这个变量名,⽐如:mov al, x那么,汇编程序在汇编时,就会报告错误。
因为,mov指令中遇到 x 这个变量名时,汇编程序不知道它要⽤哪个段寄存器作为段地址。
所以:若要⽤变量名直接访问,或使⽤语句标号(⽐如你例⼦中的标号 start)就必须要在assume伪指令中将这些变量或标号所在段的段名,与段寄存器名关联,否则会出错。
如果你不使⽤段中的变量名,可以不关联这个段的段名与寄存器。
如果你访问变量时,都指定了段跨越前缀,关联也不是必须的。
⽐如你可以⽤ mov al, ds:x访问变量 x 。
这⼏天在看王爽⼤⼤的汇编语⾔。
对于assume伪指令却很是不懂。
⽐如已经定义了assume cs:code,ds:data但⽤debug观察的时候,发现ds段寄存器却没有相关联的数据。
必须在cs中写明: mov ax,datamov ds,ax然后才能发现ds中有正确的数据。
于是疑惑,assume不是已经关联了ds嘛?上⽹求助 = =、然后找到答案。
编写程序,是写给编译软件的。
由编译软件,编译成机器码,再去控制CPU。
但是,编译软件,对assume语句,并不⽣成机器码。
所以,必须有mov ax,data,mov ds,ax,CPU才能受控。
---assume语句,是伪指令,仅仅是写给编译软件的。
编译软件,并不把它⽣成机器码。
assume对除了CS以外的其它段寄存器,仅仅只是关联了段名,以便在访问段内变量时程序可以知道⽤哪个段寄存器,并没有在程序加载时将段地址装⼊段寄存器。
所以,将段地址装⼊段寄存器的⼯作,必须由⽤户在程序中⾃⼰编写代码,并在程序开始运⾏时执⾏代码完成装⼊⼯作。
仅仅对CS段寄存器,会在关联段名的同时,在程序加载时⾃动将段地址装⼊段寄存器。
----补充:前天知道了答案后,我以为assume ds:data 之类的指没有什么⽤,只是给程序员看的。
assume用法句首 -回复
assume用法句首-回复题目:[Assume用法句首]的意义和应用领域分析引言:语言的灵活运用是人类思维表达的一种方式,而其中的假设性语句在不同语境下具有不同的表达方式和功能。
本文旨在探讨“Assume用法句首”的意义和应用领域,并分析其在学术论文、市场研究和日常交流中的重要性。
第一部分:Assume用法句首的含义在日常生活或学术领域中,我们常常使用“assume”一词来表达对某个前提的假设或假定的情况。
它可以用于引出假设的先验条件,指导对某个问题的分析或论证过程,并为后续推理提供基础。
第二部分:Assume用法句首的学术应用在学术研究中,假设性语句的运用尤为重要。
通过使用“assume”来引出假设条件,学者可以在研究中严谨地推导结论。
例如,在数学和物理领域,假设常常被用于构建数学模型或简化实验研究过程。
通过明确假设条件,研究人员可以分析现象背后的关系并预测结果,从而推动学科的进展。
第三部分:Assume用法句首在市场研究中的应用在市场营销领域,“assume”一词也被广泛应用于调查和研究中。
研究人员需要通过假设性语句来推测潜在消费者的喜好和购买意愿,以指导市场营销策略的制定。
例如,在新产品开发过程中,研究人员可以使用“assume”来引出假设条件,如消费者对产品外观、品质和价格的期望,以帮助企业了解市场需求并制定相应的营销策略。
第四部分:Assume用法句首在日常交流中的应用在日常交流中,假设性语句也经常用于推理、交流和辩论的过程中。
人们通过“assume”来提出假设或设定条件,以探究问题的可能性和解决方案。
例如,在交谈中,人们可以使用“assume”来提出自己的观点并引发讨论。
这种假设性语句的运用不仅可以促进交流,还可以推动思考和解决问题的过程。
结论:Assume用法句首作为一种假设性语句的表达方式,在学术领域、市场研究和日常交流中发挥着重要的作用。
通过引出假设条件,我们能够更清晰地分析问题和推理过程,并为进一步的思考和解决方案提供基础。
英语语法词汇详解assume
英语语法词汇详解assumeassume英[əˈsjuːm]美[əˈsuːm]v.假设;臆断;承担;就;呈现;具有;假装;僭取;夺取第三人称单数:assumes现在分词:assuming过去式:assumed过去分词:assumed英文释义:1. to think or accept that something is true but without having proof of it认为或接受某事是真实的,但没有证据2. assume something (formal) to take or begin to have power or responsibility承担某事(正式的)或开始拥有权力或责任3. assume something (formal) to begin to have a particular quality or appearance假定某事(正式)开始具有特定的性质或外观4. assume something (formal) to pretend to have a particular feeling or quality假定某事(正式)假装有特殊的感觉或品质举个例子:1.It would be wrong to assume that he is simply playing at right-wing politics.说他只是把右翼政治当作儿戏玩玩而已那就错了。
2.The court will assume that they have acted bona fide.法庭会假定他们的行为是诚实的。
3.Don't assume all women are cut from the same cloth.不要以为所有的女子都一样。
4.He was too young to assume the purple. 他太年轻,不宜身居要职。
常用短语:1.assume that假定;假设;想当然的认为2.assume responsibility承担责任;担起责任;负起责任3.assume leadership承担领导4.assume liability承担责任5.assume control取得控制6.assume an air of装出...的样子7.assume presidency 出任总统职位8.assume expression 做出……的样子9.assume role承担角色10.assume share假定份额11.assume manner 假定方式。
汇编中ASSUME用法
重点:ASSUME并不分配内存,前面提到的确定对应关系其实就是为了以后能用上段里面的变量。
要不以后用到段里面定义的变量时就不知道基地址是什么了。
告诉编译器哪一个段和哪一个段寄存器相关联。
但是如果进一步想一下细节,大家不一定都清楚。
下面将我们熟知的一句话变为两句话,这样它的含义就更加清楚了:
1.assume为我们指定默认的段寄存器
2.若不使用assume,那么我们在程序中访问数据时必须人为地明确指定相应的段寄
存器
如何修改Vs2008的字体
虚拟外设应用展示报告
汇编语言中ASSUME简介
2011-10-15 17:34:45| 分类:微机接口| 标签:faq8086微机接口|举报|字号大中小订阅
汇编语言中的ASSUME伪指令(directive)
ASSUME伪指令通知汇编程序为代码段、数据段、附加段以及堆栈段选择什么名字。
没有ASSUME伪指令时,汇编程序假设不分段,并自动把段超越前缀用于所有寻址存储器数据的伪指令。
ASSUME语句只能用于完整的段定义。
Emu8086中编译器忽略 assume . 必须明确的指明段超越前缀,否则默认为DS。
汇编语言伪指令参考
00
FLDA DW 2542H
02
02
FLDB DB 36H
03
03
FLDC DW 212EH
05
05
FLDD DD 00000705H 09
第17章 汇编语言伪指令参考资料
开始,地址计数器定为00。因为FLDA是两个字节 长,所以地址计数器就增加为02,以指出下一个数据 项的地址。因为FLDB是一个字节长,所以地址计数器 再增加为03,依次类推。你可以用ORG伪指令直接改 变地址计数器的内容,再根据其内容以指出下一个数 据项的地址,其一般格式为:
第14章讨论MACRO宏处理时有INCLUDE的实例。
第17章 汇编语言伪指令参考资料
5. LABEL伪指令 LABEL伪指令可以重新定义一个已定义名称的类 型。其一般格式为:
name LABEL type 通过LABEL我们可以使用如BYTE、WORD或 DWORD等类型,来重新定义数据字段及结构 (Structure)和记录(Record)名称的类型,亦可用LABEL 来重新定义调用指令的类型是NEAR或FAR。LABEL 还可以把一个字段同时定义为DB和DW。下面说明 BYTE及WORD这两种类型的使用。
关键字NOTHING可以用来取消前面ASSUME所指 定的某一个段寄存器,例如:
ASSUME ES :NOTHING
第17章 汇编语言伪指令参考资料
假若没有指定DS寄存器或使用NOTHING取消了它, 那么为了要存取数据段内的数据项时,就必须明确规 定使指令操作数以DS寄存器为参考对象,即要指明操 作数相应的段寄存器,例如:
第17章 汇编语言伪指令参考资料
(3) 若没有NAME也没有TITLE,则源程序的名称 就成为模块的名称。汇编程序会把所选用的名称交给 链接程序。
汇编言语——常用伪指令
(5)可以用ASSUME伪指令指定两个或两个以上的段寄存 器作为同一个段中标识符的缺省段寄存器。当数据定义与指令 写在同一个段中时,就会出现以CS、DS甚至ES一起作为一个 段的缺省段寄存器的情况。此时,有关数据的操作(取值、存 数等)优先以DS作为段寄存器。 (6)ASSUME可以在程序的不同行上出现多次,并且可以 对一个段寄存器进行两次或两次以上的对应关系指定。当程序 中用ASSUME指定了一个段寄存器是某个段的缺省段寄存器后, 在程序的后续行中一直有效,除非再次使用ASSUME伪指令改 变该段寄存器与段的对应关系。
【解】变量a的定义中出现的$是带引号的,表示ASCII码 值为24H的符号而不是偏移地址;定义变量b时用的两个$没有 加引号,表示偏移地址,按照地址分配原则,第一个$代表 0001H,第二个$代表0003H;在变量c的定义中,$出现在数值 表达式中,是当前偏移地址0005H,变量a的起始偏移地址是 0000H,两者相减的结果是5,并且不再有类型,因此可以作 为字节型变量的一项初值。图5.6是该数据段对应的内存图。 a b
5.3 ASSUME
ASSUME伪指令占一行,用于指出后续程序中所使用的变 量、标号等标识符在涉及到逻辑地址的段地址部分时,用哪 个段寄存器作为缺省段地址。 【格式】ASSUME R1:S1 , R2:S2 , ... 【说明】 (1)格式中的Ri代表段寄存器名。必须是DS、ES、SS、 CS四个之一,Si是段地址,只能是一个段名或者“SEG 变量 名”的形式。 (2)Ri:Si是一组对应关系,表示Si段中的标识符都使用Ri 作为缺省段寄存器。 。
5.6 $ $是汇编语言中的一个特殊符号,代表汇编程序在处理到$ 所在的位置时当前安排的偏移地址值。程序中出现的$可以作 为常量看待,但是不同位置上的$,其代表的值是不同的。与 一般的数据不同的是,通常所说的常量(数值)是没有类型的, 包括“OFFSET 变量名”也没有类型,但$所表示的数据一定 是字型。$一般作为字型变量定义时的一个初值使用。 【例5.18】分析下面数据段中各$符所表示的值。 data SEGMENT a DB '$' b DW $,$ c DB $-a data ENDS
汇编语言中ASSUME的用法
关于汇编中ASSUME的讨论对于汇编中ASSUME的作用及,一直都没有弄清楚,下面是百度汇编吧中对这一问题的讨论:(篇幅过长,没时间细看的,请重点看24楼,72楼和补充知识。
)问题来源:百度汇编吧:ASSUME的作用?在实际应用中我糊涂了!ASSUME DS: DATA <---- 既然已经将DATA分配给DSASSUME ES: EXTR......MOV AX, DATA <---- 为什么还要把DATA的地址赋值给DSMOV DS, AXMOV AX, EXTRMOV ES, AX对于问题的回答中,自己认为比较合理的部分,节选如下:24楼,无名人士:在数据段中定义的每一个变量标志符其实都代表了一个偏移量(也称为有效地址),这个偏移量与数据段段值相结合就指向某个内存地址。
在程序中使用ASSUME伪指令是用来指明一个默认的段地址。
一旦你把某个数据段的段名指定给某个段寄存器(比如ASSUME DS,DATA1),这之后当你使用这个数据段(DATA1)内定义的变量,编译程序就自动把它与这个段寄存器(DS)里的段值(表示一个段地址)结合起来使用。
所以,assume并不分配内存,前面提到的确立对应关系其实就是为了以后能用上段里面的变量.要不以后用到段里面定义的变量时就不知道基地址是什么了29楼:我们汇编英文版这样说的:When the program loader leads an .exe program from disk into memory for execution,it constructs a 256-byte(100h)psp(program segment prefix)on a paragraph boundary in available internal memory and stores the porgram immediately following the boundary. the loader then..initializes the address of the code segment in cs..initializes the address of the stacd segment in ss and..initializes the address of the psp in ds and es (我的注释:把psp的值赋给ds和es)看到最后一句了吗,这就是说 assume cs:data,ds:data,ss:data 这句其实已经分别给cs,ds 和ss段寄存器相应赋值了,但是随后加载器又把psp的地址赋给了ds和es寄存器,而我们要的ds地址不是psp,这是在代码执行之前完成的,所以我们要在代码中显示地指明MOV AX,DATA MOV DS,AX ,而不用指明cs,ds及ss的寄存器。
assume介词
assume介词摘要:1.了解assume的含义和用法2.分析assume在不同语境下的作用3.探讨如何正确使用assume4.总结assume的优缺点正文:在日常英语交流中,assume这个介词经常被使用,但它却经常被误解。
assume的意思是“假定,认为”,它表示对某人或某物的行为、态度或情况的推测。
本文将详细解析assume的用法,帮助大家更好地理解和使用这个词汇。
一、了解assume的含义和用法assume这个词汇通常用于表明在缺乏确切证据的情况下,对某人或某物的行为、态度或情况作出推测。
例如:“He assumed that she was busy because she didn"t answer his call.(他假设她忙所以没接电话。
)”在这里,assume表示的是对对方行为的猜测,而不是对事实的陈述。
二、分析assume在不同语境下的作用1.在不确定情况下使用assume当我们面对不确定情况时,可以使用assume来表示我们的猜测。
例如:“I assumed you were going to the party, but I see you"re not.”(我以为你要去派对,但现在看来你不去。
)在这里,assume表达的是对对方行为的猜测,而不是肯定的事实。
2.assume作为推测的礼貌用语在某些情况下,我们为了避免直接提问或质疑对方,可以使用assume表达一种礼貌的推测。
例如:“I assume you know what time the meeting starts.”(我想你应该知道会议什么时候开始。
)这里,assume用于表示一种对对方已知信息的礼貌推测。
三、探讨如何正确使用assume1.避免滥用assume虽然assume在日常交流中很常用,但滥用这个词汇可能会导致误解。
在使用assume时,要注意它仅仅是一种推测,而不是事实。
因此,要根据实际情况谨慎使用。
汇编-伪指令
[汇编]伪指令(一)段定义伪指令段定义伪指令是表示一个段开始和结束的命令,80x86有两种段定义的方式:完整段定义和简化段定义,分别使用不同的段定义伪指令来表示各种段。
1 完整的段定义伪指令完整段定义伪指令的格式如下:段名SEGMENT...段名ENDS段名由用户命名。
对于数据段、附加段和堆栈段来说,段内一般是存储单元的定义、分配等伪指令语句;对于代码段中则主要是指令及伪指令语句。
定义了段还必须说明哪个段是代码段,哪个段是数据段。
ASSUME伪指令就是建立段和段寄存器关系的伪指令,其格式为:ASSUME段寄存器名: 段名,…段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。
·定位类型:说明段的起始边界值(物理地址)。
·组合类型:说明程序连接时的段组合方法。
·类别:在单引号中给出连接时组成段组的类型名。
连接程序可把相同类别的段的位置靠在一起。
例4.1; * * * * * * * * * * * * * * * * * * * * * * *data_seg1 segment ; 定义数据段...data_seg1 ends; * * * * * * * * * * * * * * * * * * * * * * *data_seg2 segment ; 定义附加段...data_seg2 ends; * * * * * * * * * * * * * * * * * * * * * * *code_seg segment ; 定义代码段assume cs:code_seg, ds:data_seg1, es:data_seg2start: ; 程序执行的起始地址; set DS register to current data segmentmov ax, data_seg1 ; 数据段地址mov ds, ax ; 存入DS寄存器; set ES register to current extra segmentmov ax, data_seg2 ; 附加段地址mov es, ax ; 存入ES寄存器...code_seg ends ; 代码段结束; * * * * * * * * * * * * * * * * * * * * * * * * * *end start由于ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中,还必须把段地址装入相应的段寄存器中:MOV AX,DATA_SEG1 ; 数据段地址MOV DS,AX ; 存入DS寄存器MOV AX,DATA_SEG2 ; 附加段地址MOV ES,AX ; 存入ES寄存器如果程序中还定义了堆栈段STACK_SEG,也需要把段地址装入SS中:MOV AX,STACK_SEG ; 堆栈段地址MOV SS,AX ; 存入ES寄存器注意,在程序中不需要用指令装入代码段的段地址,因为在程序初始化时,装入程序已将代码段的段地址装入CS寄存器了。
伪指令
方括号中为可选项,规定了逻辑段的一些其他特性
例:
DATA1 A DATA1 DATA2 DATA2 DATA3 C DATA3
DB
DB
DB
SEGMENT 1,2,3 ENDS SEGMENT 200 DUP(0) ENDS SEGMENT ?,?,? ENDS
STACK
CODE
SEGMENT
ASSUME DS:DATA1,ES:DATA3 CS:CODE,SS:DATA2 START: MOV AX,DATA1 MOV DS,AX MOV AX,DATA3 MOV ES,AX ┆ Q1: MOV AL,A Q2: MOV C,AL
A C8H
STR1 ‘H’
SUM
- -
‘I’
20H ‘O’ ‘K’ ‘!’
TABLE
3 3 3 7 3
0DH
0AH
‘$’ DATA1 0 0 0 0
3
3 7
……
为 0, 1,
10, 14
2. 段定义伪指令
因8086/8088 CPU的存储器是分段的,这就需要有段 定义语句。 与段有关的伪指令主要有: SEGMENT、ENDS、ASSUME 段定义伪指令的格式如下: 段名 SEGMENT [定位类型] [组合类型] [’类别’] ┇ 段名 ENDS
在前缀开始处安排了一条 INT 20H, 在过程结束时通过RET返回DOS。
AX,DATA DS,AX ;DATA → DS ES,AX ;DATA → ES ┇ ;具体程序 RET ;返回指令 MAIN ENDP ;过程结束 CODE ENDS ;代码段结束 END START ;源程序结束
MOV MOV MOV
字节变量的应用 X
MASM符号
MSAM符号全集" "∶教材符号+、-、*、/∶算术运算符。
&∶宏处理操作符。
宏扩展时不识别符号和字符串中的形式参数,如果在形式参数前面加上一个& 记号,宏汇编程序就能够用实在参数代替这个形式参数了。
$∶地址计数器的值——记录正在被汇编程序翻译的语句地址。
每个段均分配一个计数器,段内定义的所有标号和变量的偏移地址就是当前汇编地址计数器的值。
?∶操作数。
在数据定义语句中,操作数用?,其作用是分配并保留存储空间,但不存入确定的数据。
=∶等号伪指令——符号定义。
对符号进行定义和赋值,功能与EQU相似,但允许(重复)再定义。
:∶修改属性运算符(操作符)——段操作符。
用来临时给变量、标号或地址表达式指定一个段属性(不用缺省的段寄存器),自动生成一个“跨段前缀字节”。
注意,段寄存器CS和ES不能被跨越,堆栈操作时也不能跨越SS。
;∶注释符号。
%∶特殊宏操作符,用来将其后的表达式(通常是符号常数,不能是变量名和寄存器名)转换成它所代表的数值,并将此数值的ASCII码嵌入到宏扩展中。
( )∶1.运算符——用来改变运算符的优先级别。
2.教材符号,表示括号内存储单元(或寄存器)的内容。
< >∶宏调用时用来将带间隔符(如空格,逗号等)的字符串(作为实参)括起来。
[ ]∶1.运算符。
方括号括起来的数是数组变量的下标或地址表达式。
带方括号的地址表达式必须遵循下列原则,①只有BX、BP、SI、DI这四个寄存器可在方括号内出现;②BX或BP可单独出现在各方括号中,也可以与常数、SI或DI一起出现在方括号内,但不允许BX和BP出现在同一个方括号内;③SI和DI可以单独出现在各方括号内,也可以与常数、BP或BX一起出现在方括号内,但不允许SI和DI出现在同一个方括号内;④一个方括号内包含多个寄存器时,它们只能作加法运算;⑤若方括号内包含基址指针BP,则隐含使用堆栈段寄存器SS提供段基址,否则均隐含使用数据段寄存器DS提供段基址。
汇编语言指令英文全称
汇编指令英文全称1.通用数据传送指令MOV----> moveMOV dest,src ;dest←srcMOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。
MOVSX---->extended move with sign dataMOVZX---->extended move with zero dataPUSH---->pushPOP---->pop进栈出栈指令PUSHA---->push allPOPA---->pop allPUSHAD---->push all dataPOPAD---->pop all dataBSWAP---->byte swapXCHG---->exchange交换指令用来将源操作数和目的操作数内容交换,操作数可以是字、也可以是字节,可以在通用寄存器与通用寄存器或存储器之间对换数据,但不能在存储器与存储器之间对换数据。
mov ax,1234h ;ax=1234hmov bx,5678h ;bx=5678hxchg ax,bx ;ax=5678h,bx=1234hxchg ah,al ;ax=7856hCMPXCHG---->compare and changeXADD---->exchange and addXLAT---->translate换码指令用于将BX指定的缓冲区中、AL指定的位移处的数据取出赋给AL。
2.输入输出端口传送指令IN---->inputOUT---->output3.目的地址传送指令LEA---->load effective addres有效地址传送指令mov bx,0400hmov si,3chlea bx,[bx+si+0f62h] ;BX=139EH这里BX得到的是主存单元的有效地址,不是物理地址,也不是该单元的内容。
assume的作用探讨
/blog/user/postcontent.jsp?neighborId=1050&kindId=8386&postId=11871&readSg=1&vs= 1ASSUME是把你自己定义的DATA段和CPU中的CS段连起来的意思,这样,CS就指向了你所定义的DATA 段了。
见《汇编语言》(王爽)P73p278 16.2小节中的内容。
/bbs/pasteinfo.jsp?part=1&level=free&kind=1220&qkSg=2&qID=7172&readSg=1关于assume的作用,许多人都简单的解释说,这是告诉编译器哪一个段和哪一个段寄存器相关联。
举个简单例子来说:assume cs:code, ds:data这是告诉编译器cs和code关联,ds和data关联,后来又看到这样的代码mov ax, datamov ds, ax让许多人一头雾水,既然ds和data关联了,怎么又要把data的值送到ds,这到底是怎么回事?这里,先不做过多的说明,我们先看看下面这个例子:下面的程序,把data段中的字符串拷贝到dseg段中,并且调用dos的21h中断的9号功能来显示dseg段中的字符串:;segtest.asmdata segmentmsg db 'Hello, how are you ?', 0dh, 0ah, 24hdata endsdseg segmenthello db 32 dup(0)db 0dh, 0ah, 24hdseg endscode segmentassume cs:code, ds:dseg, es:datastart:mov ax, dsegmov ds, ax ; 把dseg段的段地址送入dsmov ax, datamov es, ax ; 把data段的段地址送入esmov si, offset msg ; 把源字符串的偏移送入simov di, offset hello ; 把目标字符串的偏移送入dicploop:mov al, msg[si]; (1)这里是一个寄存器相对寻址,那么这个物理地址是怎么形成的呢?cmp al, 24hjz okmov hello[di], al; (2)这里又是一个寄存器相对寻址,这个物理地址又是怎么形成的?inc siinc dijmp short cploopok:mov dx, offset hellomov ah, 9hint 21hmov ax, 4c00hint 21hcode endsend start对于(1)和(2)中两个地址的形成我们来分析一下:这两个都是寄存器相对寻址,即有效地址都是一个寄存器加上一个16位的偏移量对于(1) EA = (si) + msg的偏移地址物理地址就是: (段寄存器)×16+EA段寄存器有四个cs, ds, es, ss, 那么编译器怎么知道用哪一个呢?这里就显示出了assume的作用,是assume告诉了编译器,data段中的标号的段地址要从es中取得,即这一句:es:data 告诉了编译器在data segment和data ends之间的所有的标号都要使用es作为段寄存器来寻址,于是当编译器看到这个msg标号的时候,它就知道了这里物理地址的形成是用(es)×16+EA同理,对于(2),当编译器看到hello这个标号的时候,它就知道要取ds中的值作为段地址。
汇编语言指令
汇编语言(王爽版)用到的伪指令,指令等一寄存器(reg):AX,BX,CX,DX,ah,al,bh,bl,ch,cl,dh,dl,SI,DI,SP,BP,IP。
段寄存器(sreg):CS,SS,DS,ES。
1 CS——代码段寄存器(Code Segment Register),其值为代码段的段值;2 DS——数据段寄存器(Data Segment Register),其值为数据段的段值;3 SS——堆栈段寄存器(Stack Segment Register),其值为堆栈段的段值;4 ES——附加段寄存器(Extra Segment Register),其值为附加数据段的段值;5 BP为基指针(Base Pointer)寄存器,用它可直接存取堆栈中的数据;6 SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶。
7 寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。
累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;8 寄存器BX称为基地址寄存器(Base Register)。
它可作为存储器指针来使用;9 寄存器CX称为计数寄存器(Count Register)。
在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;10 寄存器DX称为数据寄存器(Data Register)。
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
11 SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。
16位标志寄存器——共用了9个标志位,它们主要用来反映CPU的状态和运算结果的特征。
标志位的分布如下表所示。
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0OF DF IF TF SF ZF AF PF CF 1、进位标志CF(Carry Flag)主要用来反映运算是否产生进位或借位。
期末考试试题答案_微机原理与接口技术_(3)
一、单项选择题 (在下列每小题的四个备选答案中,选出一个正确的答案,并将号码填在括号内。
每小题1分,共10分)1、8086/8088 的时钟信号是由( C )提供。
A. 8259B. 8255C. 8284D. 82532、指令 MOV AX , 0283H[BX][SI] 中源操作数的寻址方式为( B )。
A. 寄存器间接寻址B. 基址变址相对寻址C. 基址寻址D. 变址寻址3、某存储单元的段基址为3806H,段内偏移地址为2948H,该存储单元的物理地址为( B )。
A. 4100HB. 3A9A8HC.3B008HD. 3AA08H4、某存储器芯片有地址线15根,数据线8根、该存储器芯片的存储容量为( D )。
A. 15K×8B. 32K×256C. 1K×8D. 32K×85、某存储器芯片容量为2K×4bit、若用它组成16K×8bit存储器组,所用芯片数以及用于组内寻址的地址线为( B )。
A. 2片、11根B. 16片、14根C. 8片、16根D. 16片、8根6、 DMAC 8237具有( C ) 独立通道。
A . 八个B . 二个C . 四个D . 三个7、可编程中断控制器8259A每片具有( C ) 优先权控制。
A . 4级B . 2级C . 8级D . 6级8、若要某系统的8253的2通道输出波形为占空比1:1的方波、分频系数为1000、二进制计数,其工作方式命令字为( B )。
A. A6HB. B6HC. B4HD. C7H9、8237片内寻址的端口有( D )个。
A. 4B. 2C. 8D. 1610、8259片内寻址的端口有( B )个。
A. 4B. 2C. 8D. 16二、填空题:(每空1分,共计40分)1、指令ASSUME在程序中出现时表示:( 段寄存器与段之间的对应关系 )。
2、编语言源程序中的语句结构由4部分组成,每个部分称为项(也可称为域或埸),各项名称分别为:( 标号或变量名 )、( 操作码 )、( 操作数 )、( 注释 )。
伪 指 令
<>
2.标号定义伪指令
格式:标识符 LABEL 类型 功能:给其后的内存单元定义一个新的类型属性
说明:给该伪指令后面的一个变量或标号定义另外一种属性,但不 重新分配内存空间,便于以多种形式访问定义的变量或标号。
例如: WORD_ARY LABEL WORD
BYTE_ARY DB 100 DUP (0)
其汇编后的存储格式如图。
(4,5),6)
<>
1.3 段定义伪指令
8086/8088的存储器采用分段技术来组织,存储器的物理地址是 由段地址和偏移地址组合而成。因此,8086/8088的程序设计必须按 段来组织、使用存储器,每一个数据或代码都应存储于一个指定的段 当中,与段定义有关的伪指令是:SEGMENT┅ENDS,ASSUME和ORG
MY_DATA SEGMENT ;定义一个数据段,内部有三个变量
ORG 100H ;数据段的变量从100H开始定义
X DB 10 ;偏移地址为100H
Y DB 6 ;偏移地址为101H
Z DB ? ;偏移地址为102H
MY_DATA
ENDS
;段定义结束
MY_STACK
SEGMENT
;定义一个100字的堆栈
分别使用两个变量名,对一个存储空间,实现字节地址存取一个字节,
或字地址同时存取两个字节数据。
又比如:
FAR_LAB LABEL FAR ;定义下面程序为远调用,可被其它段调用。
NEAR_LAB:PUSH AX ;段内标号,只能被同一段内的程序调用。
┋
;程序体
<>
1.2 变量定义伪指令
变量定义就是为数据分配一个确定的存储单元,同时,为了程序使用 该单元方便,给这个存储单元取了一个唯一的名字(变量名)。定义 的存储单元可以是字节、字、双字、三字、四字和十字节
第4章 伪指令与源程序格式汇总
第4章伪指令与源程序格式汇编语言程序的语句有三种,即指令、伪指令,还可以有宏指令。
关于宏指令将在第7章介绍,本章介绍部分常用的伪指令(又称伪操作)。
这些伪指令在程序中是必不可少的,主要用来定义数据变量和程序结构。
本章还介绍指令中的操作数和运算符,通过本章的学习,可以学会使用简便而有效率的指令格式,正确定义数据变量,熟知源程序的格式,编写完整的汇编语言程序。
4.1 伪指令伪指令和指令不同的是,指令是在程序运行期间由计算机的CPU来执行的,而伪指令是在汇编程序对源程序进行汇编期间由汇编程序处理的操作。
它们可以完成如定义数据、定义程序模式、分配存储区、指示程序结束、处理器选择等功能。
这里只介绍一些常用的伪指令。
有些和宏汇编有关的伪指令在介绍宏汇编时再作说明。
4.1.1 处理机选择伪指令由于80x86的所有处理器都支持8086指令系统,但每一种高档的机型又都增加了一些新的指令。
为了能使用这些新增指令,在编写程序时要用处理机选择伪指令对所用的处理机作出选择,也就是说,要告诉汇编程序应该选择哪一种指令系统。
处理机选择伪指令有以下几种:.8086 选择8086指令系统.286 选择8O286指令系统.286P 选择保护方式下的80286指令系统.386 选择80386指令系统.386P 选择保护方式下的8O386指令系统.486 选择80486指令系统.486P 选择保护方式下的8O486指令系统.586 选择Pentium指令系统.586P 选择保护方式下的Pentium指令系统指令中的点‘.’是需要的。
这类伪指令一般放在整个程序的最前面。
如不给出,则汇编程序认为其默认选择是8086指令系统。
4.1.2 段定义伪指令我们结合第2章已介绍的程序实例2来看段定义,注意有分号的注释行,程序如下:例4.1data segment ;定义数据段datastring db ‘hello,world!$’data endscode segment ;定义代码段codeassume cs:code,ds:data ;指定段寄存器和段的关系start:mov ax,data ;对ds赋data段基地址mov ds,axmov dx,offset stringmov ah,9int 21hmov ah,4chint 21hcode endsend start ;汇编结束, 程序起始点start:1.段定义伪指令汇编程序在把源程序转换为目标程序时,必须确定标号和变量(代码段和数据段的符号地址)的偏移地址,连接程序对针目标程序把不同的段和模块连接在一起,确定各个段的段地址。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Assume指令解析
刚学习80X86汇编的时候,有一条称为段分配伪指令Assume,我刚开始看这个的时候,就一直没看懂什么意思,老师也仅仅就说了一下,必须得这样,至于更深层次的讨论就没有,所以关于assume指令一直是懵懵懂懂的。
这些天才回过头来看的话,貌似有一点感悟!很久没写点文章了,就写下自己对于assume的理解吧。
很多书上说的是assume指令使段寄存器与某个段关联起来,但是assume指令是伪指令,还必须通过指令来赋值给段寄存器。
这话第一次看的时候,确实很迷茫。
在这里我试着从另外的一个角度去理解assume指令。
还是先来个例子(为了突出重点,例子都是很简单,甚至仅为测试而写,没有实际意义)DA TA SEGMENT ;数据段
MESS DB "HELLO",0DH,0AH,'$'
DA TA ENDS
;
CODE SEGMENT ;代码段
ASSUME CS:CODE,DS:DA TA
START: MOV AX,DA TA
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9 ;显示信息HELLO
INT 21H
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
在这个程序中,红色指令对应的是取得MESS的偏移地址,当我们对于MESS进行访问时候,汇编程序识别呢?我看可以这么理解哈,首先看到MESS的时候,汇编程序察觉这个是在DATA段中定义的变量,但是要访问它的时候,必须知道它的确切地址才行,所以在DATA段中,必须知道DATA的段地址,这个时候程序开始的前两条语句就已经给DS 赋予了值,但是我们如何得知DS和DATA的关系呢?这个时候就是assume的作用了,它就是告诉汇编程序,用指定的段寄存器寻址相应的逻辑段,建立段寄存器与段的默认关系。
所以程序的开始用的是两个assume指令使代码段与数据段和指定的寄存器关联起来,程序的段地址知道了,偏移地址就是汇编程序地址计数器在进行汇编的时候自动算出来的,这个不用我们担心!
另外在dos装入EXE程序的时候,DS和ES被初始化为PSP(程序段前缀)的段地址,而不是用本身的数据段和附加数据段,所以源程序中必须重新初始化DS和ES。
CS:IP指向源程序的代码段,cs必须被关联到指定的段,否则程序不能运行(代码段必须用ASSUME CS:CODE指明,否则编译器不知道代码从何处开始执行,编译不通过)。
SS:SP指向程序的堆栈段,如果程序未设堆栈,则SS为PSP的段地址加上256个字节,SP为00h。
上面说的可能还是不太清楚,写2个例子在下面看哈或许更明白些吧
DA TA SEGMENT ;数据段
MESS DB "HELLO",0DH,0AH,'$'
DA TA ENDS ;
CODE SEGMENT ;代码段
ASSUME CS:CODE,ES:DATA ;用ES关联,一样的效果
; ASSUME CS:CODE,DS:DATA
START: MOV AX,DA TA
MOV ES,AX
mov al,mess + 1
or al,20h ;大写变小写
mov mess+1,al
MOV AX,ES
MOV DS,AX
MOV DX,OFFSET MESS
MOV AH,9 ;显示信息HELLO
INT 21H
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
结果输出的是HeLLO
我们可以把红色代码换成ASSUME CS:CODE,DS:DATA,输出结果是HELLO,即没有变化。
我们可以看下反汇编的代码就一切明白了。
这个是没有改动的,可以看到访问变量mess的时候,自动加上了es段寄存器,这个就是assume的作用。
如果改成ASSUME CS:CODE,DS:DA TA,那么访问mess的话,则自动关联到ds寄存器,但是我们的程序中ds的值没有赋值,即ds的值还是原来程序段前缀的段地址,所以我们写的大小写转换不是在操作我们的数据,而是PSP中的某个数据,看下图:
相信说到这了,大家应该有一点稍微清晰的认识吧!(原文参看了部分书籍的介绍)。