第二章80X86指令系统1_第1页
第二章80X86指令系统1_第2页
第二章80X86指令系统1_第3页
第二章80X86指令系统1_第4页
第二章80X86指令系统1_第5页
已阅读5页,还剩80页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 第二章第二章 80X86指令系统指令系统2.2.1 2.2.1 指令格式指令格式汇编语言程序由若干汇编语言程序由若干“语句语句”组成,每个组成,每个“语句语句”占用一占用一行。行。三种类型语句:三种类型语句:指令语句:包含一条符号指令,与一条机器指令相对应,指令语句:包含一条符号指令,与一条机器指令相对应, 汇编以后成为这条机器指令的二进制代码,这汇编以后成为这条机器指令的二进制代码,这 个代码被称为个代码被称为“目标目标(Object)”;伪指令语句:一条说明性的语句。有的伪指令语句汇编后伪指令语句:一条说明性的语句。有的伪指令语句汇编后 没有没有“结果结果”,有的伪指令汇编后产生,有的伪

2、指令汇编后产生“目标目标” 。注释行:注释行: 书写说明性文字,不进行书写说明性文字,不进行“汇编汇编”,也不产生,也不产生“目标目标”。80X8680X86指令格式指令格式标号标号: 程序员给这一行起的名字,后面跟上冒号,代表这一行的程序员给这一行起的名字,后面跟上冒号,代表这一行的地址。标号用字母开始,不要使用保留字作为标号。地址。标号用字母开始,不要使用保留字作为标号。操作码是这条指令需要完成的操作,用指令助记符表示。操作码是这条指令需要完成的操作,用指令助记符表示。操作数操作数 是指令的操作对象,指令的操作数可以有是指令的操作对象,指令的操作数可以有03个。个。两个操作数时,右面的操作

3、数称为两个操作数时,右面的操作数称为“源操作数源操作数”,左面的操作数称,左面的操作数称为为“目的操作数目的操作数”。;注释;注释 用来添加一些说明,例如说明本行指令的功能。用来添加一些说明,例如说明本行指令的功能。 标号标号: 操作码操作码 操作数操作数 ;注释注释 8086的指令系统的指令系统 我们已经知道计算机是通过执行指令序列我们已经知道计算机是通过执行指令序列来解决问题的,因而每种计算机都有一组指令来解决问题的,因而每种计算机都有一组指令集供给用户使用,这组指令集就称为计算机的集供给用户使用,这组指令集就称为计算机的指令系统。本章说明指令系统。本章说明8086的指令系统以及在指的指令

4、系统以及在指令中为取得操作数地址所使用的寻址方式令中为取得操作数地址所使用的寻址方式(Addressing mode)。)。指令的组成指令的组成 计算机中的指令由操作码字段和计算机中的指令由操作码字段和操作数字段两部分组成。操作码字段指操作数字段两部分组成。操作码字段指示计算机所要执行的操作,比如加、减示计算机所要执行的操作,比如加、减运算;操作数字段指示指令执行过程中运算;操作数字段指示指令执行过程中所需要的操作数,它既可以是操作数本所需要的操作数,它既可以是操作数本身,也可以是操作数地址或地址的一部身,也可以是操作数地址或地址的一部分,还可以是指向操作数地址的指针或分,还可以是指向操作数地

5、址的指针或其他有关操作数的信息。其他有关操作数的信息。 操作数字段可以有一个、二个或操作数字段可以有一个、二个或三个,通常称为一地址、二地址或三三个,通常称为一地址、二地址或三地址指令。地址指令。 例如,单操作数指令就是一地址指令,例如,单操作数指令就是一地址指令,它只需要指定一个操作数,如加它只需要指定一个操作数,如加1指令只需要指令只需要指出需要加指出需要加1 的操作数。大多数运算型指令可的操作数。大多数运算型指令可使用三地址指令:除给出参加运算的两个操作使用三地址指令:除给出参加运算的两个操作数外,还指出运算结果的存放地址。也可使用数外,还指出运算结果的存放地址。也可使用二地址指令,此时

6、分别称两个操作数为源操作二地址指令,此时分别称两个操作数为源操作数(数(source)和目的操作数()和目的操作数(destination)。)。尽管在指令执行前这两个操作数都是输入操作尽管在指令执行前这两个操作数都是输入操作数,但指令执行后将把运算结果存放到目的操数,但指令执行后将把运算结果存放到目的操作数的地址之中。作数的地址之中。8086的大多数运算型指令的大多数运算型指令就采用这种二地址指令。就采用这种二地址指令。 8086的寻址方式包括与数据的寻址方式包括与数据有关的寻址方式和与转移地址有有关的寻址方式和与转移地址有关的寻址方式,关的寻址方式,CPU根据这些根据这些寻址方式以不同的方

7、法取得操作寻址方式以不同的方法取得操作数。数。与数据有关的寻址方式与数据有关的寻址方式 此类寻址方式用来确定操作数地址从而此类寻址方式用来确定操作数地址从而找到操作数。找到操作数。操作数寻址方式的讨论均以操作数寻址方式的讨论均以 MOV destination, source 为例,这是一条数据传送指令,第一操作数为为例,这是一条数据传送指令,第一操作数为目的操作数目的操作数destination,第二操作数为源操,第二操作数为源操作数作数source,指令执行的结果是把,指令执行的结果是把source送送到到destination中去。中去。1 立即寻址方式(立即寻址方式(Immediate

8、 addressing) 操作数直接存放在指令中,紧跟在操作操作数直接存放在指令中,紧跟在操作码之后,它作为指令的一部分存放在代码段码之后,它作为指令的一部分存放在代码段里,这种操作数称为立即数里,这种操作数称为立即数. 立即数可以是立即数可以是8位的或位的或16位的。如果是位的。如果是16 位数,则高位字节存放在高地址中,低位数,则高位字节存放在高地址中,低位字节存放在低地址中。位字节存放在低地址中。立即寻址方式常用于给寄存器赋初值,立即寻址方式常用于给寄存器赋初值,并且只能用于源操作数字段,不能用于目的并且只能用于源操作数字段,不能用于目的操作数字段。操作数字段。例例 MOV AL, 9H

9、指令执行后,(指令执行后,(AL)= 09H例例 MOV AX, 3064H指令执行后,(指令执行后,(AX)= 3064H下图表示了它的执行情况,图中指令存放下图表示了它的执行情况,图中指令存放在代码段中,在代码段中,OP表示该指令的操作码部分,表示该指令的操作码部分,3064H为立即数,它是指令的一个组成部分。为立即数,它是指令的一个组成部分。注意:不能直接给段寄存器和标志寄存注意:不能直接给段寄存器和标志寄存器赋予立即数。器赋予立即数。显然,下面的指令是错误的:显然,下面的指令是错误的:MOV DS, 1250H 2 存器寻址方式(存器寻址方式(Register addressing)它

10、使用寄存器来存放要处理的操作数,它使用寄存器来存放要处理的操作数,寄存器号由指令指定。寄存器号由指令指定。 对于对于16位操作数,寄存器可以是位操作数,寄存器可以是AX、BX、CX、DX、SI、DI、SP、BP、CS、DS、ES和和SS;对于;对于8位操作数,寄存器可位操作数,寄存器可以是以是AL、AH、BL、BH、CL、CH、DL、DH。由于操作数就在寄存器中,指令执行。由于操作数就在寄存器中,指令执行时不需要访问存储器,因此这是一种快速时不需要访问存储器,因此这是一种快速的寻址方式。的寻址方式。 例例 MOV AX, BX 如指令执行前(如指令执行前(AX)= 1234H,(,(BX)=

11、5678H;则指令执行后(则指令执行后(AX)= 5678H,(,(BX)保)保持不变。持不变。注意:源寄存器和目的寄存器的位数必注意:源寄存器和目的寄存器的位数必须一致。须一致。例如:例如:MOV CL, BX是一条错误指令。是一条错误指令。除上述两种寻址方式外,下面五除上述两种寻址方式外,下面五种寻址方式的操作数都在除代码段种寻址方式的操作数都在除代码段以外的存储区中。以外的存储区中。这里先引入有效地址这里先引入有效地址EA(Effective Address)的概念:在)的概念:在8086里,把操作数的偏移地址称为里,把操作数的偏移地址称为有效地址,下面五种计算有效地址,下面五种计算EA

12、的方法的方法体现了五种寻址方式。体现了五种寻址方式。 3 存储器寻址方式存储器寻址方式 (1)直接寻址方式(直接寻址方式(Direct addressing) 在这种寻址方式中,操作数存放在在这种寻址方式中,操作数存放在存储单元中,而这个存储单元的有效地存储单元中,而这个存储单元的有效地址就在指令的操作码之后,操作数的物址就在指令的操作码之后,操作数的物理地址可通过(理地址可通过((DS)16)再加上这个)再加上这个有效地址形成。有效地址形成。 例例 MOV AX, 2000H如果(如果(DS)= 3000H,则执行情况如图所示。,则执行情况如图所示。最后的执行结果为(最后的执行结果为(AX)

13、= 3050H。 在汇编语言指令中,可以用符在汇编语言指令中,可以用符号地址(变量名或标号)代替数值号地址(变量名或标号)代替数值地址。地址。例如:例如: MOV AX, DATA或或 MOV AX, DATA这里这里DATA是存放操作数单是存放操作数单元的符号地址。元的符号地址。 直接寻址方式默认操作数在数据段中,如直接寻址方式默认操作数在数据段中,如果操作数定义在其它段中,则应在指令中指定段果操作数定义在其它段中,则应在指令中指定段跨越前缀。跨越前缀。例如:例如: MOV AX, ES:NUMBER或或 MOV AX, ES:NUMBER这里这里NUMBER是附加段中的字变量。是附加段中的

14、字变量。直接寻址方式适合于处理单个变量。直接寻址方式适合于处理单个变量。 (2) 寄存器间接寻址方式(寄存器间接寻址方式(Register indirect addressing) 这种寻址方式通过基址寄存器这种寻址方式通过基址寄存器BX、BP或变址寄存器或变址寄存器SI、DI来保存操作数的有效地来保存操作数的有效地址。如果指令中使用的寄存器是址。如果指令中使用的寄存器是SI、DI和和BX,则操作数在数据段中,(则操作数在数据段中,((DS)16)再加上)再加上寄寄存器中的有效地址形成存器中的有效地址形成20位物理地址;如位物理地址;如果指令中使用的寄存器是果指令中使用的寄存器是BP,则操作数

15、在堆,则操作数在堆栈段中,(栈段中,((SS)16)再加上)再加上BP中的有效地中的有效地址形成址形成20位物理地址。位物理地址。 指令中也可以指定段跨越前缀来取指令中也可以指定段跨越前缀来取得其他段中的数据。得其他段中的数据。例如:例如:MOV AX, ES:BX 这种寻址方式可以用于表格处理。这种寻址方式可以用于表格处理。基址或变址寄存器初始化为表格的基址或变址寄存器初始化为表格的首地址,每取一个数据就修改寄存器的首地址,每取一个数据就修改寄存器的值,使之指向下一个数据。值,使之指向下一个数据。 例例 MOV AX, BX 如果(如果(DS)= 2000H, (BX)= 1000H,则物理

16、地址则物理地址 = 20000H + 1000H = 21000H执行情况如图所示,最后的执行结果为执行情况如图所示,最后的执行结果为(AX)= 50A0H。 (3) 寄存器相对寻址方式(寄存器相对寻址方式(Register relative addressing)(也称直接变址寻址方式(也称直接变址寻址方式) 这种寻址方式通过基址寄存器这种寻址方式通过基址寄存器BX、BP或变址寄存器或变址寄存器SI、DI与一个位移量相与一个位移量相加形成有效地址,计算物理地址的缺省加形成有效地址,计算物理地址的缺省段仍然是段仍然是SI、DI和和BX为为DS,BP为为SS。 这种寻址方式同样可用于表格处理。这

17、种寻址方式同样可用于表格处理。表格的首地址可设置为位移量,修改表格的首地址可设置为位移量,修改基址或变址寄存器的内容取得表格中的值。基址或变址寄存器的内容取得表格中的值。 例例 MOV AX, COUNTSI(也可表示为(也可表示为 MOV AX, COUNT+SI) 其中其中COUNT为为16位位移量的符号地址。位位移量的符号地址。如果如果 (DS)= 3000H,(,(SI)= 2000H,COUNT = 3000H则物理地址则物理地址 = 30000H + 2000H + 3000H = 35000H指令执行情况如图所示,最后的执行结果是(指令执行情况如图所示,最后的执行结果是(AX)=

18、 1234H。 (4) 基址变址寻址方式基址变址寻址方式 (Based indexed addressing)这是一种基址加变址来定位操作数这是一种基址加变址来定位操作数地址的方式,也就是说,操作数的有效地址的方式,也就是说,操作数的有效地址是一个基址寄存器(地址是一个基址寄存器(BP或或BX)和)和一个变址寄存器(一个变址寄存器(SI或或DI)的内容之和。)的内容之和。如基址寄存器为如基址寄存器为BX时,与时,与DS形成的物形成的物理地址指向数据段;如基址寄存器为理地址指向数据段;如基址寄存器为BP时,与时,与SS形成的物理地址指向堆栈段。形成的物理地址指向堆栈段。 注意:一条指令中同时使用

19、基址寄注意:一条指令中同时使用基址寄存器或变址寄存器是错误的。存器或变址寄存器是错误的。例如:例如:MOV CL, BX+BP 或或 MOV AX, SI+DI 均为非法指令。均为非法指令。 这种寻址方式同样适用于数组或表这种寻址方式同样适用于数组或表格处理。格处理。首地址可存放在基址寄存器中,而首地址可存放在基址寄存器中,而用变址寄存器来访问数组中的各个元素。用变址寄存器来访问数组中的各个元素。由于两个寄存器的值都可以修改,所以由于两个寄存器的值都可以修改,所以它比寄存器相对寻址方式更加灵活。它比寄存器相对寻址方式更加灵活。 例例 MOV AX, BXDI (或写为(或写为 MOV AX,

20、BX+DI)如)如 (DS ) = 2100H,(,(BX)= 0158H,(,(DI)= 10A5H则则 EA = 0158H +10A5H = 11FDH物理地址物理地址 = 21000H +11FDH = 221FDH指令执行情况如图所示,最后的执行结果是指令执行情况如图所示,最后的执行结果是(AX)= 1234H。 (5) 相对基址变址寻址方式(相对基址变址寻址方式(Relative based indexed addressing) 这种寻址方式与基址变址寻址方式类这种寻址方式与基址变址寻址方式类似,不同的是基址加变址再加上一个位移量似,不同的是基址加变址再加上一个位移量形成操作数的

21、有效地址。缺省段的使用仍然形成操作数的有效地址。缺省段的使用仍然是是DS与与BX组合,组合,SS与与BP组合。组合。 综上所述,有效地址可以由以下三种成综上所述,有效地址可以由以下三种成分组成:分组成: 位移量(位移量(Displacement)是存放在指令)是存放在指令中的一个中的一个8位或位或16位数,但它不是立即数,而位数,但它不是立即数,而是一个地址。是一个地址。 基址(基址(Base)是存放在基址寄存器)是存放在基址寄存器(BX或或BP)中的内容。它是有效地址中的基)中的内容。它是有效地址中的基址部分,通常用来指向数据段中数组或字符串址部分,通常用来指向数据段中数组或字符串的首地址。

22、的首地址。 变址(变址(Index)是存放在变址寄存器()是存放在变址寄存器(SI或或DI)中的内容。它通常用来访问数组中的某)中的内容。它通常用来访问数组中的某个元素或字符串中的某个字符。个元素或字符串中的某个字符。 有效地址的计算可用下式表示:有效地址的计算可用下式表示:EA = 基址基址 + 变址变址 + 位移量位移量这三种成分都可正可负,以保证指针移这三种成分都可正可负,以保证指针移动的灵活性。它们任意组合使用,可得到动的灵活性。它们任意组合使用,可得到不同的寻址方式。不同的寻址方式。例例 MOV AX, MASKBXSI(或(或 MOV AX, MASKBX+SI,或,或 MOV A

23、X, MASK+BX+SI) 如(如(DS)= 3000H,(,(BX)= 2000H,(,(SI)= 1000H,MASK = 0250H,则物理地址则物理地址 = 30000H + 2000H + 1000H + 0250H = 33250H指令执行情况如图所示,最后的执行结果是(指令执行情况如图所示,最后的执行结果是(AX)= 1234H。 8086的指令系统的指令系统 汇编语言的指令系统是程序设计的汇编语言的指令系统是程序设计的基础,这里主要介绍基础,这里主要介绍8086的指令系统。的指令系统。8086指令系统分为以下指令系统分为以下6组:组: 数据传送指令数据传送指令 算术指令算术指

24、令 逻辑指令逻辑指令 串处理指令串处理指令 控制转移指令控制转移指令 处理机控制指令处理机控制指令2.2 数据传送类指令数据传送类指令数据传送指令的功能是把数据、地数据传送指令的功能是把数据、地址传送到寄存器或存储器单元中。它分址传送到寄存器或存储器单元中。它分为为4类。类。 通用数据传送指令通用数据传送指令 累加器专用传送指令累加器专用传送指令 MOV 传送传送 IN 输入输入 PUSH进栈进栈 OUT 输出输出 POP 出栈出栈 XLAT换码换码 XCHG交换交换 地址传送指令地址传送指令 标志寄存器传送指令标志寄存器传送指令 LEA 有效地址送寄存器有效地址送寄存器 LAHF标志送标志送

25、AH LDS 指针送寄存器和指针送寄存器和DSSAHFAH送标志寄存器送标志寄存器 LES 指针送寄存器和指针送寄存器和ES PUSHF 标志进栈标志进栈 POPF标志出栈标志出栈2.2.1 通用数据传送指令通用数据传送指令MOVdst, src;传送指令(传送指令(move)执行操作:执行操作:(dst) (src)功能:功能: 将源操作数(字节或字)传送将源操作数(字节或字)传送到目的地址。到目的地址。P40例例 MOV AX,DATA_SEG MOV DS,AX 例例 MOV AL,E例例 MOV BX,OFFSET TABLE例例 MOV AX,YBPSI注意:注意: 目的操作数目的操

26、作数dst和源操作数和源操作数src不能同时用存储器寻址方式,这个限制不能同时用存储器寻址方式,这个限制适用于所有指令;适用于所有指令; 目的操作数目的操作数dst不能是不能是CS,也,也不能用立即数方式;不能用立即数方式; 目的操作数目的操作数dst和源操作数和源操作数src不允许同时为段寄存器;不允许同时为段寄存器; MOV指令不影响标志位。指令不影响标志位。源操作数可以是:寄存器、存储器、立即数;源操作数可以是:寄存器、存储器、立即数;目的操作数可以是:寄存器、存储器。目的操作数可以是:寄存器、存储器。IMRIMR(a)正确的数据传送操作(b)错误的数据传送操作SS数据的定义数据的定义

27、程序取得所需空间的方法有两种,一种是在加载程程序取得所需空间的方法有两种,一种是在加载程序的时候为程序分配,再就是程序在执行的过程中向系统序的时候为程序分配,再就是程序在执行的过程中向系统申请。课程中不讨论第二种方法。申请。课程中不讨论第二种方法。 若要一个程序在被加载的时候取得所需的空间,则若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中做出说明。通过在源程序中定义段来进必须要在源程序中做出说明。通过在源程序中定义段来进行内存空间的获取。行内存空间的获取。 为了程序设计上的清晰和方便,一般也都定义不同为了程序设计上的清晰和方便,一般也都定义不同的段来存放他们。的段来存放他们。 在

28、程序中定义要处理的数据,这些数据会被编译、在程序中定义要处理的数据,这些数据会被编译、连接程序作为程序的一部分写到可执行文件中。当可执行连接程序作为程序的一部分写到可执行文件中。当可执行文件中的程序被加载入内存时,这些数据也同时被加载入文件中的程序被加载入内存时,这些数据也同时被加载入内存。与此同时,要处理的数据也就自然而然地获得了存内存。与此同时,要处理的数据也就自然而然地获得了存储空间。储空间。 数据段数据段 数据定义数据定义 汇编语言程序定义的汇编语言程序定义的“数据数据” :(1) 变量(变量(Varible):有一个名字,运行过程中值可能发生变有一个名字,运行过程中值可能发生变化,可

29、以有化,可以有“初始值初始值”。(2) 常数(常数(Constant):常数可以直接写在指令内,也可以):常数可以直接写在指令内,也可以存放在数据段内。存放在数据段内。(3) 缓冲区(缓冲区(Buffer):从输入设备输入若干数据时,在数据):从输入设备输入若干数据时,在数据段里事先留出必要的存储单元,称为段里事先留出必要的存储单元,称为“输入缓冲区输入缓冲区”。输出一。输出一批数据时,把输出内容事先存放在若干内存单元中,称为批数据时,把输出内容事先存放在若干内存单元中,称为“输输出缓冲区出缓冲区”。数据段数据段DATA SEGMENT ; 在这里定义数据;在这里定义数据; ; DATA EN

30、DSDATA:程序员给这个段起的名字。程序员给这个段起的名字。SEGMENT:保留字,说明一个段从这里开始。:保留字,说明一个段从这里开始。ENDS:保留字,说明一个段到此结束。保留字,说明一个段到此结束。 ;分号后面的文字是分号后面的文字是“注释注释”,不参加汇编,不参加汇编语句语句” : 由一行文字构成,由一行文字构成, 是一条指令,是一条指令, 或者定义一组数据,或者定义一组数据, 或者是一条或者是一条“伪指令伪指令”。伪指令伪指令:说明性的语句:说明性的语句数据定义数据定义数据定义伪指令数据定义伪指令:变量名变量名 数据定义伪操作数据定义伪操作 数据数据 ,数据,数据数据定义伪操作:数

31、据定义伪操作: DB(Define Byte):每个数据占用一个字节():每个数据占用一个字节(8b) DW(Define Word):每个数据占用一个字():每个数据占用一个字(16b) DD(Define Double Word):每个数据占用一个双字):每个数据占用一个双字(32b) DQ(Define QuartWord):每个数据占用):每个数据占用8个字节个字节(64b) DT(Define TenByte):每个数据占用):每个数据占用10个字节(个字节(80b)数据定义举例(数据定义举例(1): 有符号数用它的补码存储有符号数用它的补码存储 字符用它的字符用它的ASCII代码存

32、储代码存储 db定义的数据在定义的数据在 -128255 之内之内 变量名代表这个单元的地址变量名代表这个单元的地址 ?表示一个尚未确定的值,用表示一个尚未确定的值,用0先行填充先行填充 DUP表示重复定义表示重复定义DATA SEGMENTXdb-1, 255, A, 3+2, ? db“ABC”, 0FFH, 11001010BYdb3 dup (?)DATA ENDS DATA SEGMENT X DB -1,255,A,3+2,? DB ABC,0FFH,11001010B Y DB 3 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:D

33、ATA START: MOV AX,DATA MOV ds,ax MOV AL,X MOV AH,4CH INT 21H CODE ENDS END START例例 Hello Worlddata segment STRING DB 0AH, 0DH, Hello Word!, 0AH, 0DH, $data endsCODE SEGMENTASSUME CS: CODE, DS: DATA START: MOVAX, DATA MOVDS, AX LEADX, STRING MOVAH, 9 INT 21H MOVAX, 4C00H INT 21HCODE ENDSENDSTART数据定义举

34、例(数据定义举例(2): DW定义的数据在(定义的数据在(-32768,+65535)内)内 出现在数据部分的变量名代表这个变量的偏出现在数据部分的变量名代表这个变量的偏 移地址移地址 多字节数据的高位存放在较高地址单元中多字节数据的高位存放在较高地址单元中DSEG SEGMENTZDW -2, -32768, 65535, ABWDD 12345678H, -400000DW Z, W-ZDSEG ENDS 变量变量X,Y,Z,W的属性的属性变量变量名名段属性段属性SEG偏移地址偏移地址OFFSET类类 型型TYPE长长 度度LENGTH大大 小小SIZEXDATA0000H111YDATA

35、000AH133ZDSEG0000H212WDSEG0008H212例例 编写程序,把编写程序,把4个元素的字节数组个元素的字节数组ARRAY清零。清零。DATASEGMENTARRAYDB4 DUP (?)DATAENDSCODESEGMENTASSUMECS: CODE, DS: DATASTART:MOVAX, DATAMOVDS, AXMOVARRAY, 0;第一个元素清零;第一个元素清零MOVARRAY+1, 0;第二个元素清零;第二个元素清零MOVARRAY+2, 0;第三个元素清零;第三个元素清零MOVARRAY+3, 0;第四个元素清零;第四个元素清零MOVAX, 4C00HI

36、NT21HCODEENDSENDSTARTMOV AX, 0LEA BX, ARRAY ;数组;数组ARRAY首地址装入首地址装入BXMOV WORD PTR BX, AX ;第一、第二个元素清零;第一、第二个元素清零MOV WORD PTR BX+2, AX ;第三、第四个元素清零;第三、第四个元素清零一次将两个元素同时清零:一次将两个元素同时清零:MOV WORD PTR ARRAY, 0 ;第一、第二个元素清零;第一、第二个元素清零MOV WORD PTR ARRAY+2, 0 ;第三、第四个元素清零;第三、第四个元素清零使用立即数指令代码较长。把这个立即数事先存放在寄存器中:使用立即数

37、指令代码较长。把这个立即数事先存放在寄存器中:MOV AX, 0MOV WORD PTR ARRAY, AX ;第一、第二个元素清零;第一、第二个元素清零MOV WORD PTR ARRAY+2, AX ;第三、第四个元素清零;第三、第四个元素清零把数组把数组ARRAY的首地址事先装入地址寄存器,程序更简捷:的首地址事先装入地址寄存器,程序更简捷:例例 字数组字数组X的最后的最后2个元素值送入个元素值送入Y数组对应单元数组对应单元DATASEGMENTXDW 55, 112, 37, 82YDW 4 DUP (?)DATAENDSCODESEGMENTASSUMECS: CODE, DS: D

38、ATASTART:MOV AX, DATAMOVDS, AXMOVDI, 4;第三个元素在数组内的位移;第三个元素在数组内的位移MOVAX, XDI;取出;取出X数组第三个元素数组第三个元素MOVYDI, AX;送入;送入Y数组第三个元素中数组第三个元素中MOVAX, XDI+2;取出;取出X数组第四个元素数组第四个元素MOVYDI+2, AX;送入;送入Y数组第四个元素中数组第四个元素中MOVAX, 4C00HINT 21HCODEENDSENDSTART2.2.2 交换指令交换指令 xchg dst, src2.2.3 2.2.3 堆栈堆栈 堆栈(堆栈(STACK)是用户使用的存储器的一部

39、分,用来存放临时性的)是用户使用的存储器的一部分,用来存放临时性的数据和其他信息,例如函数使用的局部变量、调用子程序的入口参数、数据和其他信息,例如函数使用的局部变量、调用子程序的入口参数、返回地址等。返回地址等。 堆栈的段基址必须放在堆栈的段基址必须放在SS中。中。堆栈段的堆栈段的“栈顶栈顶”地址(偏移地址)地址(偏移地址)放在放在SP寄存器中。寄存器中。SSSP堆栈段(栈 顶)栈 底已使用已使用 在在SEGMENT伪指令中增加伪指令中增加“STACK”表示该段是表示该段是“堆栈堆栈”。这。这个程序装入时,操作系统把个程序装入时,操作系统把SSEG的段基址置入的段基址置入SS,堆栈段的字节,

40、堆栈段的字节数(数(“栈底栈底”位置,本例中为位置,本例中为200= 0C8H)置入)置入SP。1. 堆栈段结构堆栈段结构 SSEG SEGMENT STACK ;堆栈段开始;堆栈段开始 DW100 DUP(?);大小为;大小为100个字个字 SSEG ENDS;堆栈段结束;堆栈段结束堆栈段的定义:堆栈段的定义: 从较大地址开始分配和使用(数据段、代码段从较小地址开从较大地址开始分配和使用(数据段、代码段从较小地址开 始分配和使用);始分配和使用); 由由SP中地址指出的存储单元称为中地址指出的存储单元称为“栈顶栈顶”,数据总是在,数据总是在“栈顶栈顶” 位置存入(称为位置存入(称为“压入压入

41、”)、取出(称为)、取出(称为“弹出弹出”);); 最先进入的数据最后被弹出(最先进入的数据最后被弹出(First In Last Out, FILO),), 最后进入的数据最先被弹出(最后进入的数据最先被弹出(Last In First Out, LIFO)堆栈段的特点堆栈段的特点:压入压入2B数据的操作数据的操作 SP(SP)2 SS: SP 数据数据 弹出弹出2B数据的操作数据的操作 目的操作数目的操作数SS: SP SP(SP) + 2 PUSH src ; 进栈指令(进栈指令(push onto the stack) 执行操作:执行操作: (SP) (SP)2 (SP+1)(SP)

42、(src)POP dst ; 出栈指令(出栈指令(pop from the stack) 执行操作:执行操作: (dst) (SP+1)(SP) (SP) (SP)+2 PUSH和和POP指令分别将数据存指令分别将数据存入堆栈或把堆栈中的数据取出。堆栈是入堆栈或把堆栈中的数据取出。堆栈是以以LIFO(后进先出)方式工作的一个存(后进先出)方式工作的一个存储区,程序中定义的堆栈段就是这样一储区,程序中定义的堆栈段就是这样一个个LIFO存储区。数据存入堆栈单元或从存储区。数据存入堆栈单元或从堆栈单元中取出都由堆栈指针堆栈单元中取出都由堆栈指针SP指示,指示,而而SP总是指向栈顶总是指向栈顶,所以进

43、栈和出栈指,所以进栈和出栈指令都会令都会自动修改自动修改SP。 PUSH指令执行时,指令执行时,SP的内容先的内容先减减2,然后将数据压入,然后将数据压入SP所指示的字单所指示的字单元,存储的方法同样是高元,存储的方法同样是高8位存入高地址位存入高地址字节,低字节,低8位存入低地址字节。位存入低地址字节。POP指指令执行时,将令执行时,将SP所指示的栈顶地址的内所指示的栈顶地址的内容取出放入目的地址,然后容取出放入目的地址,然后SP增增2,指,指向新的栈顶地址。向新的栈顶地址。 例例 PUSH AX;();()()()()()例例()()()()()?()?。注意:注意: PUSH和和POP指

44、令只能是字操作,指令只能是字操作,因此存取字数据后,因此存取字数据后,SP的修改必须是的修改必须是2或或2; PUSH和和POP指令不能使用立即数指令不能使用立即数方式;方式; POP指令的指令的dst不允许是不允许是CS寄存器;寄存器; PUSH和和POP指令都不影响标志位。指令都不影响标志位。 PUSH指令在程序中常用来暂存某些数指令在程序中常用来暂存某些数据,而据,而POP指令又可将这些数据恢复。指令又可将这些数据恢复。 例例 假设假设(DS)=1000H, (SS)=4000H, (SP)=100H, (BX)=2100H, (12100)=00A8H, 指出连续执行下列各条指令后,有

45、关寄存器、指出连续执行下列各条指令后,有关寄存器、存储单元以及堆栈的情况。存储单元以及堆栈的情况。PUSH DSPUSH BXPUSH BX? POP DIPOP WORD PTR DI+2POP DS 执行结果执行结果: (SP)=100H2=0FEH (SP)=0FE2=0FCH (SP)=0FC-2=0FAH (400FEH)=1000H (400FCH)=2100H (400FAH)=00A8H 执行结果执行结果: (SP)=0FA+2=0FCH (SP)=0FC+2=0FEH (SP)=0FE+2=100H (DI)=00A8H (100AAH)=2100H (DS)=1000H2.

46、2.4 有效地址传送指令有效地址传送指令 LEA(Load Effective Address, 装载有效地址装载有效地址)指令指令 LEA reg, src ; 有效地址送寄存器(有效地址送寄存器(load effective address)执行操作执行操作:(reg) offset of srcLEA指令把源操作数的有效地址送到指定的寄指令把源操作数的有效地址送到指定的寄存器,这个有效地址是由存器,这个有效地址是由src选定的一种存储器寻选定的一种存储器寻址方式确定的。址方式确定的。其他传送指令其他传送指令1. 地址传送指令地址传送指令LDS,LESLDS reg, src ; 指针送寄

47、存器和指针送寄存器和DS (load DS with point)执行操作执行操作: (reg) (src)(DS) (src+2) 把源操作数指定的把源操作数指定的4个相继字节送到由指令指定的寄存器及个相继字节送到由指令指定的寄存器及DS寄存器中,该指令常指定寄存器中,该指令常指定SI寄存器。寄存器。 LES reg, src ; 指针送寄存器和指针送寄存器和ES(load ES with point)执行操作执行操作: (reg) (src)(ES) (src+2) 把源操作数指定的把源操作数指定的4个相继字节送到由指令指定的寄存器及个相继字节送到由指令指定的寄存器及ES寄存器中,该指令常

48、指定寄存器中,该指令常指定DI寄存器。寄存器。CBW;将;将AL寄存器内容符号扩展成寄存器内容符号扩展成16b,送入,送入AXCWD;将;将AX寄存器内容符号扩展成寄存器内容符号扩展成32b, 送入送入DX(高位高位)和和AXCWDE;将;将AX寄存器内容符号扩展成寄存器内容符号扩展成32b,送入,送入EAXCDQ;将;将EAX寄存器内容符号扩展成寄存器内容符号扩展成64b, 送入送入EDX和和EAX2.2. 扩展传送指令扩展传送指令MOVZX,MOVSX,CBW,CWD,CWDE,CDQMOVZX,MOVSX,CBW,CWD,CWDE,CDQ扩展传送指令把扩展传送指令把8位的操作数扩展为位的操作数扩展为16/32位,或者把位,或者把16位的操作位的操作数扩展为数扩展为32位,送入目的寄存器。位,送入目的寄存器。设有(设有(EAX)= 0000 8060H CBW ;(;(AX)= 0060H CWD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论