1、第3章 汇编语言程序设计基础,指令系统是微处理器(CPU)所能执行的指令的集合,它与微处理器有密切的联系,不同的微处理器有不同的指令系统。在本章中我们主要讲解Intel公司生产的8086/8088CPU的寻址方式以及各种指令系统,并通过具体实例讲述了各条指令的功能和使用方法,我们在这章里还要学习汇编语言程序设计的基本方法。,通过本章的学习,应当掌握以下内容: 操作数的寻址方式常用指令的格式、功能、以及对标志位的影响 了解汇编语言的基本知识和特点。 熟悉汇编语言的程序结构、段定义以及语句的格式。 掌握汇编语言常用伪指令的使用方法。 熟练掌握汇编语言程序设计的基本方法:顺序结构、 分支结构、循环结
2、构和子程序结构。 掌握程序设计中的宏指令和常用的系统功能的调用方法。,3、1 8086指令系统 3.1.1 8086指令的寻址方式,操作码 地址码,汇编指令:,操作码:指令的操作类型; 地址码:指令所需的操作数或操作数的地址;操作数可以有一个,也可以有两个,一个源操作数,一个目的操作数。 例: MOV AX,CX ;将CX的内容送入AX中。,本章主要介绍8086/8088的指令系统以及在指令中为取得操作数地址所使用的寻址方式。,指令的寻址方式是指在指令中操作数的表示方式。 大多数指令操作数的表示方式实际是操作数存放的位置。 操作数存放的位置包括:指令中的立即数CPU内部的寄存器CPU外部的内存
3、储器。 操作数的地址在许多情况下是计算机在执行指令时根据指令的寻址方式通过计算产生的。 一般来说,指令的寻址方式越丰富,指令系统的功能就越强,编程的灵活性就越好。,8086的寻址方式有:立即寻址、寄存器寻址、存储器寻址、串操作寻址、外设I/O端口寻址、程序转移操作寻址。 存储器寻址又包括:直接寻址、寄存器间接寻址、基址寻址、变址寻址、基址变址寻址。 注意:寻址方式只能产生存储器的有效地址EA-段内偏移地址,由EA在BIU中在和段寄存器组合才能产生20位的物理地址。,1 、 立即寻址方式:当操作数据就在指令中的地址码部分时,操作数与操作码一起在一条指令中即为“立即寻址”。指令中的这种操作数称为立
4、即数,它可以随指令取指一起被取入CPU立即执行。立即数可以为8位或16位。 数据例 :MOV AL,5 ;源操作数为立即寻址 指令执行后,AL=05H,8位数据05H存入AL寄存器。例 :MOV AX,3064H ;源操作数为立即寻址 指令执行后,AX=3064H,16位数据3064H存入AX寄存器。,OP,立即数,在指令中立即数可用16进制数(以H结尾),2进制数(以B结尾)和10进制数(用D或不加特殊符号)表示。 也可以使用单引号括起来的ASCII码表达的字符和字符串。 注意,如果16进制数以字母AF打头,则必须在前面加上一个“0”,这是汇编程序的要求. 如:0B5H- 16进制数B5H,
5、0只用于识别,不保存。B5H-机器把它视为一个变量名。,8位立即数: MOV AL,43H;16进制立即数MOV AL,01000011B ; 2进制立即数 MOV AL,67; 10进制立即数 16位立即数 :MOV AX,4142H ;16进制立即数 MOV AX,0100000101000010B; 2进制立即数MOV AX,16706; 10进制立即数 32位立即数 :MOV EAX,12345678H 字符或字符串立即数:MOV AL,AMOV AX,AB,立即数寻址方式由于操作数可以在取指令时就取入CPU,在CPU执行的时候不用等待取数据,所以执行速度很快。 立即数寻址常用于已知常
6、数的场合。例如:初始化程序中的赋初值。运算时已知的常数。 注意:用单引号可以对字符的ASCII码进行立即数表示。 例:MOV AL , A;执行后AL=41H,2、 寄存器寻址方式 寄存器寻址方式中指令的地址码是寄存器名,在对应寄存器中的内容就是操作数数据,寄存器包括8位或16位通用寄存器和段寄存器。寄存器可用作8086操作数的寄存器如下表所示。,OP,寄存器名,数据,8086寄存器寻址中的寄存器,注意:(1)当指令中的源操作数和目的操作数都是寄存器时,必须采用同样字长的寄存器,否则汇编时会出错;(2)两个操作数不能同时为段寄存器;(3)目的操作数不能是代码段寄存器,例如指令MOV CS,AX
7、。,寄存器寻址由于数据在CPU内部,所以指令的执行速度也很快。常将一些常用的数据调入到寄存器中,程序执行时就可以减少CPU访问内存的次数,提高程序的执行速度。 例如:MOV AL,DL;AL DLADD AX,BX;AX AX+BXMOV DS,AX;DS AXINC BX ; BX BX+1,3 存储器寻址方式 在内存寻址方式中,操作数是某个内存单元的内容(值),指令中给出的是内存单元的有效地址EA(即偏移地址),段地址通常在隐含的某个段寄存器中。 EA是由EU根据存储器寻址方式计算产生的一个16位偏移地址,该地址送入BIU后,在BIU里进行地址变换产生20位的存储器物理地址。BIU由EA可
8、以自动产生对应的段寄存器。,(1)直接寻址方式 在直接寻址方式中,指令的地址码直接给出操作数的偏移地址(有效地址EA),即:EA=直接段内偏移地址。 偏移地址有直接地址值和地址标号两种形式,段地址隐含的由DS 指定,也可以通过段超越指定其它段寄存器。,内存,例1:MOV AX,2000H将DS:2000H单元内容送入AX。AL (DS*10H+2000H)AH (DS*10H+2001H) 例2:MOV AX,ES:2000H将ES:2000H单元内容送入AX。AL (ES*10H+2000H)AH (ES*10H+2001H) 例3:MOV DL,2000H;DL (DS*10H+2000H
9、),也可以使用符号地址。 例: MOV AX,LABLE 或 MOV AX,LABEL 将标号为LABLE(存放操作数单元的符号地址) ,即DS:LABLE中的内容送入AX。 注意: 使用数字地址时必须加方括号; 使用符号地址时可以不加方括号,但符号地址必须是已定义的。 例如:ABC DB 25MOV AL , ABC ; AL 25,(2)寄存器间接寻址,寄存器间接寻址方式的操作数形式为:reg 指令的地址码给出一个间址寄存器,对应的寄存器中存放有操作数在内存单元的偏移地址,即:EA=BX或SI或DI 操作数的有效地址包含在基址寄存器BX或一个变址寄存器(SI或DI)中。寄存器间接寻址要用方
10、括号括起来,以便与寄存器寻址相区别。,寄存器间接寻址的示意图:,OP,间址寄存器,偏移地址,BX、SI、DI,内存,例如:MOV AX , BX ; 将DS:BX单元内容送入AX。AL (DS*10H+BX)AH (DS*10H+BX+1) 设BX=1000H,DS=5000H,则寻址的示意图为:,5000:0000H,5000:1000H,5000:1001H,5000:1002H,BB,AA,TAB:,AX,AH AL,AA BB,间接寻址,数据段起始,1000H,BX,内存,操作数在存储器中,指令中寄存器内容作为操作数所在单元的有效地址。(BX)(SI)(DI),有效地址 =,段寄存器为
11、DS,物理地址计算方法: 物理地址 = DS* 10H + BX或SI或DI 注意:间址寄存器只能用BX 、SI、 DI,例:已知:(DS)=2100H,(DI)=2000H指令: MOV AX,DI ;物理地址=DS * 10H + DI=2100H * 10H + 2000H=21000H + 2000H=23000H指令结果:将23000H单元内容送AL中,将23001H单元内容送AH中。,使用寄存器可形成地址指针,通过修改指针可实现程序对多个地址单元的间接访问。 例如:MOV CX , 100MOV BX , 2500HL: MOV AL , BXINC BXLOOP L,2500H
12、2501H 2502H 2503H 2504H ,内存,(3)、基址寻址方式 操作数在存储器内,指令中地址码给出一个基址寄存器,EA=基址寄存器+DISP(位移量)。 基址寄存器:BX-数据段 BP-堆栈段EA=BX+ DISP8/ DISP16 物理地址=DS*10H+ BX+ DISP8/ DISP16 EA=BP+ DISP8/ DISP16 物理地址=SS*10H+ BP+ DISP8/ DISP16,段寄存器为DS,段寄存器为SS,基址寻址示意图:,内存,例: 如果 DS=3000H, BX= 2000H, COUNT=3000H, 则执行指令 MOV AX,CONUTBX,求出此种
13、寻址方式对应的有效地址和物理地址。 有效地址= 2000H + 3000H = 5000H 物理地址=DS*10H + 5000H=30000H + 5000H =35000H 指令也可以写成: MOV AX, BX+CONUT;MOV DX, BP+3000H;基址寻址可用于访存地址的再定位,用于数组数据的访问。,(4)、变址寻址方式 操作数在存储器内,指令中地址码给出一个变址寄存器,EA=变址寄存器+DISP(位移量)。 变址寄存器:SI或DI-数据段EA=SI+ DISP8/ DISP16 物理地址=DS*10H+ SI+ DISP8/ DISP16 EA=DI+ DISP8/ DISP
14、16 物理地址=DS*10H+ DI+ DISP8/ DISP16,段寄存器为DS,变址寻址的示意图:,内存,例: 如果 DS=4000H, SI= 1000H, COUNT=500H, 则执行指令 MOV AX,CONUTSI,求出此种寻址方式对应的有效地址和物理地址。 有效地址= 1000H + 0500H = 1500H 物理地址=(DS)*10H + 1500H=40000H + 1500H =41500H 指令也可以写成: MOV AX, SI+CONUT;MOV DX, DI+3000H;变址寻址可用于访问数组数据,SI、DI可形成数组元素的下标,通过修改SI、DI中的变址值可以实
15、现对数组不同元素的访问。,例如:A DB a0,a1,a2,a3,a4,a5, ,a99;MOV SI , 0 ; SI执行数组元素a0MOV CX , 100 ;循环100次L: MOV AL , ASI;取数组元素INC SI;SI SI+1,指向下一元素LOOP L;循环,(4)、基址变址寻址方式: 操作数在存储器中,指令中地址码给出一个基址寄存器(BX或BP)、一个变址寄存器(SI或DI)。 EA=基址寄存器+变址寄存器 有以下4条寻址指令的EA: EA=BX+SI ;对应的段为DS EA=BX+DI ;对应的段为DS EA=BP+SI ;对应的段为SS EA=BP+DI ;对应的段为
16、SS,基址变址寻址的示意图:,OP,基址寄存器,变址寄存器,基地址,BX/BP,+,变址地址,SI/DI,内存,BX SIBP DI,有效地址 =,+,物理地址 = DS * 10H + BX+ SI或DI 物理地址 = SS * 10H + BP + SI或DI例: MOV AX,BX+DI 或 MOV AX,BXDI(DS:BX+DI) 字存储单元内容送AX。例: MOV AX,BP+SI 或 MOV AX,BPSI ( SS:BP+SI) 字存储单元内容送AX。,例:如果 DS=2100H, BX= 0158H, DI=10A5H, EA=11FDH, 则执行指令 MOV AL,BXDI
17、 有效地址:EA=BX+DI=0158H+10A5H=11FDH 物理地址=DS * 10H + 有效地址EA=21000H+11FDH=221FDH 执行结果:将221FDH单元内容送入寄存器AL中。,(5)、相对基址变址寻址方式: 操作数在存储器中,指令中地址码给出一个基址寄存器(BX或BP)、一个变址寄存器(SI或DI)、一个相对位移量D。 EA=基址寄存器+变址寄存器+DISP8/16 有以下4条寻址指令的EA: EA=BX+SI+DISP ;对应的段为DS EA=BX+DI+DISP ;对应的段为DS EA=BP+SI+DISP ;对应的段为SS EA=BP+DI +DISP ;对应
18、的段为SS,相对基址变址寻址的示意图:,OP,基址寄存器,变址寄存器,基地址,BX/BP,+,变址地址,SI/DI,内存,DISP,物理地址 = DS* 10H +BX+SI/DI+DISP8/16 物理地址 = SS* 10H +BP+SI/DI+DISP8/16 例:已知:DS=3000H,BX=2000H,SI=1000H,MK=0250H指令: MOV AX,MKBXSI或 MOV AX,MKBX+SI或 MOV AX,MK+BX+SI 有效地址=MK+BX+SI=0250H+2000H+0100H =3250H 物理地址=DS*10H +EA=30000H+3250H=33250H
19、执行结果:将33250H单元内容送AL,33251H内容送AH。,段超越:当操作数在内存单元时,系统根据隐含约定,自动将寄存器DS或SS的值作为段地址。然而,当操作数段地址不在隐含的段寄存器时,可以使用段超越前缀取代其隐含约定。 段超越前缀形式为-段寄存器名: 例如: MOV AX,ES:BP ;段地址在ES MOV AX,CS:BX SI ;段地址在CS,段地址的基本约定和允许超越的情况如表所示:,对8086内存寻址方式的注解 (1)在汇编后,指令中的变量名由具体的偏移地址所取代。 (2)在寄存器相对寻址与相对基址变址方式中,位移量disp可以是符号常量或变量,汇编后为一个常数,若是变量,则
20、取其偏移地址。 (3)在Microsoft宏汇编MASM(Microsoft Macro Assembler)中,内存操作数可以采用多种书写形式。 (4)操作数中使用变量的地方也可以用下列形式: 变量名整数表达式。,(5)计算出的有效地址以16位表示,若超过FFFFH,CPU将忽略所有溢出。 (6)记忆8086内存操作数形式的简易方法如下:BX 、SI、 DIBX+ disp 、 BP + disp SI+ disp 、 DI + disp BX+ SI、BX+ DIBP + SI 、 BP + DI BX+ SI + disp 、BX+ DI + disp BP + SI + disp 、
21、BP + DI + disp (7) 不允许:BX+ BP、 SI+ DI,4、程序转移寻址,段内转移:是指在同一段的范围之内进行转移,此时只需改变IP寄存器的内容,即用新的转移目标地址代替原有的IP的值就可达到转移的目的,程序中的转移地址为16位(一个字)IP。 段间转移:则是要转到另一个段去执行程序,此时不仅要修改IP寄存器的内容,还需要修改CS寄存器的内容才能达到目的,因此此时的转移目标地址应由新的段地址和偏移地址两部分组成,程序中的转移地址为32位(双字) CS、IP。,转移地址有二种产生方式:(1)相对产生:目标地址(偏移)=IP+DISP8/16-段内(2)绝对产生:由指令、寄存器
22、、存储器给出。-段内或段间。 转移地址有三种寻址方式:直接寻址(16位段内-相对、32位段间-绝对)寄存器间接寻址(16位段内-绝对)存储器间接寻址(16位段内、32位段间-绝对),直接寻址:直接给出转移地址:以标号(符号地址)表示。标号的类型属性有NEAR,FAR,SHORT。 寄存器寻址:给出寄存器名,寄存器的内容即转移的目的地址(仅段内用)。 存储器寻址:指令中给出内存的有效地址EA,转移去的目的地址在数据段的内存单元中。,(1)相对寻址-只能实现段内转移,以IP的内容为基准地址,转移地址是以基准地址为基础在加上一个位移量产生。 转移地址的偏移地址=IP+D,IP是转移地址的下条指令地址
23、的偏移值。 D为补码,可以是8位或16位。 D=8位:转移范围为-128-+127,称为段内短转移。位移量D只有一个字节,是2字节指令。 D=16位:转移范围为-32768-+32767,称为段内近转移。位移量D有二个字节,是3字节指令。,段内短转:加属性SHORT说明,为2字节指令。 段内近转:加属性NEAR说明,为默认值,是3字节指令。 例如:JMP SHORT A ; IPIP+D8如果该转移地址的偏移地址是2052H ,程序要转到A=205BH , D8=205B-(2052+2)=7(下条指令地址= 2052+2=2054H) 例如: JMP ADDR ; IPIP+D16 (下条指
24、令地址= 当前指令偏移地址+3) 寻址的示意图:P49-图3-1,(2)段内寄存器寻址:转移地址在通用寄存器中,执行时:IPreg,是一个段内转移。Reg为AX、BX、CX、DX、SP、BP、SI、DI 例如:设AX=250BH 执行指令:JMP AX ; IP AX , IP=250BH (3)段内存储区间接寻址:转移地址在由EA寻址的字存储单元中。执行时: IP(EA) , (EA) 是用WORD PTR说明的字单元。 例如: JMP WORD PTRBX ;执行时:IP (DS*10H+BX ) 注意:EA同数据寻址的寻址方式。,(4)段间直接转移寻址:32位的转移地址在转移指令的第2、
25、3字节和第4、5字节。,第2、3字节为转移的偏移地址,执行时送入IP. 第4、5字节为转移的段地址,执行时送入CS. 寻址示意图:P50 图3-2,转移指令,第1字节 第2字节 第3字节 第4字节 第5字节,(5)段内存储器间接转移:转移地址在由EA寻址的双字存储单元中。执行时: IP(EA) , CS (EA+2),EA 是用DWORD PTR说明的双字单元。 例如: JMP DWORD PTRBX ;执行时:IP (DS*10H+BX )CS (DS*10H+BX+2 ) 注意:EA同数据寻址的寻址方式。寻址到的前两个单元存的是转移的偏移 地址,后两个单元存的是转移的段地址。寻址的示意图:
26、P50 图3-3,3.1.2 8086指令系统简析8086/8088的指令系统可以分为6组共100多条:(1)数据传送指令; (2)算术运算指令; (3)逻辑指令与移位指令; (4)串操作指令; (5)控制转移指令; (6)处理机控制指令;1、 数据传送指令:共14条,可分为4组,见表3-1 数据传送指令是最简单、最常用的一类指令,它是负责把数据、地址、或立即数传送到寄存器或存储单元中 。,指令中常用的符号:,src/s: 源地址数,dest/d: 目的地址数 reg/r : 通用寄存器 mem/m: 存储器(内存),有EA决定存储单元。 sreg : 段寄存器 B: 字节数据 , W: 字数
27、据,数据传送指令表,(1)MOV(Move):传送指令 MOV指令的格式为:MOV dest,src ;destsrc 功能:将源操作数src复制到目的操作数dest中,结果目的操作数的内容等于源操作数的内容,源操作数src的内容不变。 对标志位的影响:无语法格式: MOV reg/mem/seg ,reg/mem/seg/data8/16,可以实现的传送: REGREG; 通用寄存器通用寄存器 REGDATA;通用寄存器立即数 REGMEM;通用寄存器存储器 REGSREG;通用寄存器段寄存器 MEM REG;存储器通用寄存器 MEMDATA;存储器立即数 MEMSREG;存储器段寄存器 S
28、REGREG; 段寄存器通用寄存器(除CS) SREGMEM; 段寄存器存储器(除CS),说明: (1)双操作数指令不允许两个操作数同时为段寄存器或存储器操作数。 MOV seg1 , seg2 ;错误MOV mem1 ,mem2 ;错误 (2)立即数不能传送到段寄存器中。MOV seg ,data ; 错误 (3)目的操作数不允许使用CS段寄存器。MOV CS , AX,(4)dest与src必须类型匹配,即同时是字节或字类型。以下几点要注意:寄存器具有明确的类型,例如,AL、AX分别为字节、字类型。若立即数没有明确的类型,MASM负责将立即数扩展为与目的操作数位数相同。有时MASM不能确定
29、内存操作数的类型,需要用byte ptr(字节属性说明)和word ptr(字属性说明)明确指出是字节或字类型。关于PTR的详细介绍在本章伪指令部分。(5)存储器数据由寻址方式产生的EA决定存储的单元。(6)不能直接传送时可以间接传送。 例:MOV DS , 2000H ; 错误 改为正确传送: MOV AX , 2000HMOV DS , AX,例:错误的MOV 指令如下所示: MOV AX,BL ;类型不匹配 MOV DS,1000H ;不允许立即数送段寄存器 MOV BX ,SI ;不允许内存操作数之间传送 MOV ES,CS ;不允许段寄存器之间传送 MOV CS,AX ;CS不能作为
30、目的操作数例:设A、B是已定义的字节变量,以下是一些错误和正确的指令。 MOV AX,A ;错误,类型不匹配 改为: MOV AX,WORD PTR A ;类型匹配 MOV B,0 ;正确,MASM可以判断出要送字节0,MOV指令传送示意(红色的线路不允许传送),REG,MEM,SREG,DATA,CS除外,CS除外,例:DS=3000H,SS=5000H,BX=1000H,BP=2000H,SI=3000H,DI=4000H,AX=1234H, (31000H)=5678H, (56000H)=35ACH,分别写出下列指令执行后的结果。 (1)MOV AL , BH ; ALBH,AL=10
31、H(2) MOV CX,AX; CXAX,CX=1234H(3) MOV DX,BX;DX (DS*10H+BX)DX (31000H),DX=5678H(4) MOV SI,BP+DI; SI (SS*10H+BP+DI) SI (56000H) , SI= 35ACH,(5) MOV SP,0100H;SP0100H,SP=0100H (6) MOV BXSI,AX;(DS*10H+BX+SI) AX(34000H) AX(34000H)=1234H (7) MOV BXSI,0A58DH; (34000H)=A58DH (8) MOV ES,BX;ES=1000H,(2) PUSH 、(
32、3) POP -堆栈操作指令 堆栈概念 - 存储器的一段区域,按“先进后出”的原则进行存取的特殊存储区域。 堆栈一端固定(栈底),另一端浮动(栈顶),数据只能从栈顶单元进出。 用于指示堆栈栈顶单元地址的寄存器-SP(在CPU内部)。 使用SP后,堆栈操作可以实现CPU自动管理存储地址指针(不用编程管理存储地址指针),该寻址也可称为隐含寻址。 堆栈的作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。,8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元,堆栈操作是字数据操作。 初始的时候需要设置栈底单元。 每
33、压入(PUSH)一次数据,首先SP SP-2,形成新的栈顶地址。(SS:SP) 数据信息 取出(POP)数据,首先数据(SS:SP) SP SP+2,形成 PUSH POP新的栈顶地址。,栈顶单元,SS:SP,栈底单元,堆栈操作指令:,指令格式: (2)进栈 PUSH src ;操作:SP SP-2 ;形成新栈顶(SS:SP) SRC;数据存入新栈顶 (3)出栈 POP DST ;操作:dest (SS:SP);从栈顶取出数据 SP SP+2;形成新栈顶,堆栈操作要求:,(1)必须是字操作。 例如:PUSH AX 例如:PUSH DL-不允许正确:PUSH DX ; DH、DL一起压栈,实际只
34、有DL是有效压入。 (2)src允许reg或内存单元。不允许为字节B、立即数、sreg (3) dest允许reg或内存单元。不允许为字节B、立即数、sreg,堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP, ,(执行PUSH AX之前,设AX=A=1234H),堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP, ,执行PUSH AX; SPSP-2;SP=01FCH (SS:SP) AX, , ,12H,堆栈,SS:01FB,SS:01FC,SS:01FD,SS:01FE,SP, ,执行POP AX; AX (SS:SP) ;AX=123
35、4H SPSP+2 ; SP=01FEH, ,12H,1,2,3,SS:01FF,SS:01FA,SS:01FF,SS:01FA,34H,SS:01FF,34H,8086/8088系统的堆栈具有如下特点:堆栈是在内存的堆栈段中,具有“先进后出”的特点;堆栈只有一个出入口,即当前栈顶为空时,栈顶和栈底指向同一内存单元;堆栈有两个基本操作:PUSH(进栈)和POP(出栈)。PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;堆栈操作只能作字操作;SS:SP在任何时候都指向当前的栈顶。,(4)换码指令XLAT XLAT-用于查表操作。 查表操作:对一些函数值的产生,为了提高速度,计算机不是通
36、过程序计算产生的,而是通过查表产生的。 例如:求X2 (0X 15)平方值分别为:0,1,4,9,16,25,36,49,64,81,100, 121,144,169,196,225 建表操作(字节表) TAB DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,TAB+1,TAB+2,TAB+3,TAB+4,TAB+5,TAB+6,TAB+7,TAB+8,TAB+9,TAB+10,TAB+11,TAB+12,TAB+13,TAB+14,TAB+15,TAB+0,产生X2的方法: 设指针BX=TAB 取查表值X 计算X2值表指针=BX+X
37、由(BX+X)单元取出X2值。 例如:x=6 表指针=BX+X=TAB+6 62= (BX+X)= (TAB+6)=36,实现的程序: TAB DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 ; 平方表参数X DB 6 ;X=要查询的值(0X 15)Y DB ? ; 保留一个空单元MOV BX,offset TAB ;BX指向表首单元MOV AL,X ; 取查表索引值,AL=6MOV AH,0 ;转为16位,AX=0006ADD BX,AX ; 计算表地址BX=TAB+0006MOV AL,BX ; AL(TAB+0006) ,AL=3
38、6MOV Y,AL ; (Y)=36,查表可以实现各种函数值的产生、代码变换、程序的多路分支等,用途很广。 在8086实现上字节表查询可采用换码指令XLAT。 XLAT的操作:AL(BX+AL) 要求(1)只能用于字节表。(2)查表的索引值送AL.(3) 查表得到的结果在AL中。,用XLAT实现的程序: TAB DB 0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225 ; 平方表参数X DB 6 ;X=要查询的值(0X 15)Y DB ? ; 保留一个空单元MOV BX,offset TAB ;BX指向表首单元MOV AL,X ; 取查表索引值,
39、AL=6XLAT ; AL(TAB+06) ,AL=36MOV Y,AL ; (Y)=36 使用XLAT可简化编程。,(5)、地址传送指令 将操作数所在存储器的地址送入目标寄存器。 指令格式: 有效地址送寄存器:LEA reg16 , mem ; reg16 mem 指针送寄存器和DS:LDS reg16 ,mem32 ; 把源操作数指定的4个相继字节到由指令指定的寄存器及DS寄存器中。该指令常指定SI寄存器。 指针送寄存器和ES:LES reg16 ,mem32 ; 把源操作数指定的4个相继字节送到由指令指定的寄存器及ES寄存器中。该指令常指定DI寄存器 。,LEA 指令与MOV 指令的区别
40、: LEA SI,BUFF;指令是将标号BUFF的偏移地址送入寄存器中; MOV SI,BUFF;指令是将标号BUFF所指存储单元的内容送入SI。,BUFF =,2000H,2001H,2002H,2003H,2004H,2005H,48,00,FE,FF,LEA SI,BUFF; 或:MOV SI,offset BUFF 执行后:SI=2002H MOV SI,BUFF; 执行后:SI=0048H,DS:,LDS或LES指令将源操作数指定的4个连续字节单元内容分别送入指令指定的寄存器以及DS或ES中。 其中:低16位送到一个指定的字寄存器,高16位送到DS或ES中。,57H,13H,68H,
41、24H,例:(DS)=C000H,(C2480H)=1357H,(C2482H)=2468H,DS:2480H,DS:2481H,DS:2482H,DS:2483H,13 57,24 68,SI,DS,LDS SI,2480,(6)XCHG(Exchange):交换指令 XCHG指令的格式为: XCHG opr1 , opr2 ;交换oprd1与oprd2的内容 语法格式为: XCHG reg/mem,reg/mem 例:XCHG BX ,BP+SI 如指令执行前:BX=6F30H,BP=0200H,SI=0046H,SS=2F00H,(2F246H)=5154H,OPR2的物理地址=2F00
42、0+0200+0046=2F246H 则指令执行后:BX=5154H(2F246H)=6F30H。,标志寄存器传送指令 指令格式: LAHF ; AH FR低字节 SAHF ; FR低字节 AH PUSHF; SP SP-2,(SS:SP) FR POPF ; FR (SS:SP) , SPSP+2,说明:LAHF/SAHF指令是寄存器AH与标志寄存器PSW的低字节之间完成的字节型数据传送。PUSHF/POPF指令是标志寄存器FR(PSW)与堆栈间进行的字型数据传送。注意:指令SAHF/POPF将影响标志位,其它传送指令执行后均不影响标志位。,2 算术运算指令 1、加法指令ADD/ADC 不带
43、进位的加:ADD dest,src; dest dest + src 带进位加法 : ADC dest,src; dest dest + src +CF 要求:(1) dest可以为reg 、memsrc可以为reg 、 mem、data(2)可以做W/B(字/字节)运算(3) dest、src不能同为mem。(4) 运算后影响标志位。(5)运算的数据由编程人员指定为是否有符号。,例:MOV AL , 25HADD AL , 58H ; AL=7DH00100101+0101100001111101 CF=0 结果无进位 ZF=0 结果非零 SF=0 结果为正 OF=0 结果无溢出,例:MOV
44、 AX , 5250HMOV BX , 0B58AHADD AX , BX ; AL=07DAH CF=1 ZF=0 SF=0 OF=0 例:MOV DH , 0MOV DL , 7FHADD DL , 0A0H ; DL=1FH ,CF=1ADC DH , 0 ; DH=1 ,DX=011FH,(2)、减法指令SUB/SBB 指令格式: 不带借位减:SUB dest,src ;dest dest-src 带带借位减:SBB dest,src ;dest dest-src -CF 要求:同ADD注意:减法运算是将减数自动求机器负数后做补码加,此时计算CF用的是:CF=D7C 或 D15C ,
45、即求出的结果有进位时-借位=0,求出的结果无进位时-借位=1.不采用将减数自动求机器负数后做补码加时,即直接做减运算的时候,可根据是否有借位产生CF.(手工计算),不带进/借位加减用于单字节或单字数据的加减运算。带进/借位加减用于多字节或多字数据的加减运算。运算时可将上一个数据加减运算时产生的进/借位在下一个数据运算时加进位或减借位。多字节或多字数据的加减运算做循环编程时初值CF必须置为零。以便在第一次使用ADC/SBB时CF=0。例如:89 45 58 A9 +75 67 47 7BFE AC A0 24,(3)增量/减量指令INC/DEC:INC dest ; dest dest +1DE
46、C dest ; dest dest -1 要求:dest可以为reg、 mem,(B/W)INC、 DEC指令不影响标志CF。常用于地址加1、减1或循环次数减一。对存储单元操作时注意需加属性说明。 例如:INC BX;地址指针加1(如果是字地址需要用二 条即加2或用ADD BX , 2)DEC CX;计数次数减1.INC BYTE PTR BX+SI;字节存储单元内容加1.INC WORD PTR BX+SI;字存储单元内容加1,(4)比较指令 CMP CMP dest , src ; dest src,执行后不保存结果,设标志寄存器。 注意:指令要求同SUB.该指令主要可用于比较-转移操作
47、。 例如:实现AX=0 转L,否则顺序执行。CMP AX , 0 ; AX-0JZ L ; 结果为0 则转L. ; 结果不为0 顺序执行L: ,(5)求补指令 NEG NEG dest ; dest dest+1 要求: dest可以为reg、mem.(B/W) 求补时是连同符号位一起按位变反,末位加一,不论正负,相当于求机器负数。 例如:MOV AL , 5AH ; AL=01011010NEG AL ; AL=10100110 mem求补时需加属性说明是字节或字单元。,运算指令执行后对标志位的影响:在标志寄存器FLAGS中有若干标志位,这些标志用来表CPU当前的操作方式和状态信息。 与普通应用程序有关的主要是FLAGS中的9个标志:6个状态标志(CF、OF、SF、ZF、AF、PF)3个控制信息标志(DF、IF、TF) 深入认识CF和OF CF表示无符号溢出,即运算结果超出了无符号数的表示范围。 OF表示带符号溢出,即运算结果超出了带符号数的表示范围。,