第三章指令系统与寻址方式_第1页
第三章指令系统与寻址方式_第2页
第三章指令系统与寻址方式_第3页
第三章指令系统与寻址方式_第4页
第三章指令系统与寻址方式_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

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

文档简介

1、指令系统指令系统微处理器能执行的各种指令的集合。寻址方式寻址方式(Addressing Mode) 指令中关于如何求出存放操作数有效地址的方法。有效地址有效地址EA(Effective Address)根据寻址方式计算得到的地址。指令码的格式指令码的格式: 通常指令码由操作码字段和操作数字段两部分组成。操作码指示该指令执行的操作。操作数字段指示操作数的类型和操作数的寻址方式。操作码操作码操作数操作数操作数操作数操作码字段操作码字段操 作 数 字 段操 作 数 字 段3.1 8086/8088指令系统的寻址方式指令系统的寻址方式 操作数的种类操作数的种类指 令 中 操 作 的 对 象 称 为 操

2、 作 数 。8086/8088指令系统种操作数的种类分为两大类:数据操作数数据操作数转移地址操作数转移地址操作数数据操作数数据操作数数据操作数数据操作数:指令中操作的对象是数据。可分为:立即数操作数立即数操作数:操作数据在指令中。寄存器操作数寄存器操作数:操作数存放在寄存器中。存储器操作数存储器操作数:操作数存放在指定的存储单元中。i.I/O操作数操作数:操作数来自或送到I/O端口。转移地址操作数转移地址操作数指令操作的对象不是数据,而是要转移的目标地址。要转移的目标地址包含在指令中,或存放在寄存器中,或存放在存储单元中。对于数据操作数,有的指令有两个操作数,一个称为源操作数,在操作过程中其值

3、不改变。另一个称为目标操作数,操作后一般被操作结果代替。有的指令只有一个操作数,或没有操作数。对于转移地址操作数,其指令只有一个目标操作数,它是一个供程序转移的目标地址。 寻址方式寻址方式(Addressing Mode)立即数寻址方式立即数寻址方式 ( Immediate addressing )操作数直接包含在指令中,紧跟在操作码之后,作为指令的一部分,这种操作数称为立即数。立即数可以是8位的,也可以是16位的。如果是16位数,则高位字节存放在高地址单元中,低位字节存放在低地址单元中。立即数寻址方式只能作为源操作数,主要用来给寄存器或存储单元赋值。例例3.1MOV BL ,80HMOV A

4、X ,1090H指令执行后的结果为:(BL) = 80H ;(AX) = 1090H寄存器寻址方式寄存器寻址方式( Register addressing)操作数存放在指令指定的寄存器中,寄存器的名字可在指令中指出。对于16位操作数,寄存器可以是AX, BX, CX, DX, SI, DI, SP或BP。对于8位操作数,寄存器可以是AH, AL, BH, BL, CH, CL, DH或DL。由于操作数就在寄存器中,因而该方式可以取得较高的运行速度,通常用于CPU内部操作。例例3.2 MOV CL , DLMOV AX , BX如果 (DL) = 50H, (BX) = 1234H,则执行结果为

5、:(CL) = 50H(AX) = 1234H存储器寻址方式存储器寻址方式直接寻址方式直接寻址方式(Direct addressing)操作数的有效地址EA(16位偏移地址)在指令中直接给出,它紧接在指令的操作码之后,存放在存储器的代码段中。其高位字节存放在高地址单元中,低位字节存放在低地址单元中。而操作数本身一般存放在存储器的数据段中。例例 3.3MOV AL , 1064H如果当前(DS)=2000H,则操作数存储单元的物理地址为: 2000H10H+1064H =20000H+1064H =21064H若 (21064)=45H执行结果为: (AL)=45H。 如果没有特殊指明,直接寻址

6、方式的操作数一般在存储器的数据段,即隐含的段寄存器是DS。但是8086/8088也允许段超越,即允许使用CS, SS或ES作为段寄存器,此时需要在指令中特别标明。方法是,有关操作数的前面写上段寄存器名,再加上冒号“:”。例如例如,若以上指令改用ES作为段寄存器,则指令应表示成为一下形式: MOV AL , ES:1064H 在汇编语言指令中,可以用符号地址代替数值地址。例如: MOV AL , VALUE 或 MOV AL , VALUE 此时VALUE为存放操作数单元的符号地址。寄存器间接寻址方式寄存器间接寻址方式 (Register indirect addressing )操作数的有效地

7、址在指令中指定的寄存器SI、 DI、BX 或BP中,操作数本身在存储器中。若指定的寄存器为:SI、 DI、BX,默认的段寄存器是DS。若指定的寄存器是BP,默认的段寄存器是SS。书写指令时,用作间址的寄存器必须加上方括弧,以免与寄存器寻址方式混淆。例例3.4:MOV AX , SI如果 (DS)= 3000H , (SI ) = 2000H ,物理地址=30000H+2000H=32000H 。若 (32000H)=4050H执行结果为: (AX) =4050H又: MOV BP , AL如果 (SS)=5000H , (BP)=1000H ,物理地址=50000H+1000H=51000H

8、。执行结果为: (51000H)=50H 。无论用SI,DI,BX或者BP作为间址寄存器,都允许段超越。 例如例如: MOV ES:DI , AX MOV DX , DS:BP ADD AL , ES:BX SUB CS:SI , AX寄存器相对寻址方式寄存器相对寻址方式(Register relative addressing)(或称直接变址寻址方式 )操作数的有效地址EA是一个由指令中指定的8位或16位位移量disp (displacement)与基址或变址寄存器的内容相加之和。即EA =(SI)(DI)(BX)(BP)+8位disp16位disp位移量一般可用符号地址表示。在一般情况下,

9、若指令中指定的寄存器是SI, DI, BX,则存放操作数的段寄存器默认为DS;若指令中指定BP寄存器,则对应的段寄存器应为SS 。寄存器的相对寻址方式也允许段超越。例例3.5: MOV SI+10H , AX MOV CX , BX+COUNT如果 (DS)=3000H , (SI)=2000H, (BX)=1000H , COUNT=1050H, (AX)=4050H ,指令执行情况如图3.4所示。执行结果为: (32010H)=4050H (CX)=4030H寄存器相对寻址方式的寄存器的操作数在汇编语言中书写时可以是下述形式之一: MOV AL , BP+TABLE MOV AL , BP

10、+TABLE MOV AL , TABLEBP 以上三条指令实质上代表同一条指令。基址变址寻址方式基址变址寻址方式(Based indexed addressing)操作数的有效地址是由指令指定的一个基址寄存器(BX或BP)和一个变址寄存器(SI或DI)的内容之和。即:若基址寄存器为BX, 默认的段寄存器为DS, 若基址寄存器为BP, 默认的段寄存器为SS。允许段跨越。(SI)(DI)(BX)(BP)EA =+例例3.6: MOV BX+DI , AX如果: (DS)=3000H, (BX)=1000H, (DI)=1100H,EA=1000H+1100H=2100H;物理地址=30000H+

11、2100H=32100H;若(AX)=0050H , 则执行结果为: (32100H)=0050H 。指令: MOV AH , BPSI如果 (BP)=2000H, (SI)=1200H , (SS)=4000H, (43200H)=56H,物理地址=40000H+2000H+1200H=43200H,则执行结果为: (AH)=56H 。基址变址相对寻址方式基址变址相对寻址方式( Relative indexed addressing )操作数的有效地址是指令中指定的8位或16位位移量(disp)与一个基址寄存器和一个变址寄存器的内容之和。即:当基址寄存器为BX时, 使用DS段寄存器, 当基址

12、寄存器为BP时, 使用SS段寄存器。允许段超越。(SI)(DI)(BX)(BP)EA =+8位位disp16位位disp基址加变址相对寻址方式也可以表示成不同的形式: MOV AX , BX+SI+COUNT MOV AX , COUNTBXSI MOV AX , BX+COUNTSI MOV AX , BXCOUNTSI MOV AX , BX+SICOUNT MOV AX , COUNTSIBX例例3.7 MOV AX , MASKBXSI如果 (DS)=3000H , (BX)=2000H , (SI)=1000H , MASK=0520H , 则物理地址=30000H+2000H+10

13、00H+0520H =33520H若 (33520)=1234H执行结果为 (AX)=1234H 3.2 8086的汇编指令系统的汇编指令系统8086的指令系统包括100多条指令, 可分为以下六种类型:n数据传送指令数据传送指令n算术运算指令算术运算指令n位操作指令位操作指令n串操作指令串操作指令n程序控制指令程序控制指令1.处理器控制指令处理器控制指令 数据传送指令数据传送指令 数据传送指令负责把数据、地址或立即数传送到寄存器或存储单元中。通用传送指令通用传送指令MOV(Move)数据传送指令 格式: MOV dst , src 操作: (dst) (src) 其中dst表示目的操作数,sr

14、c表示源操作数。 说明:MOV 指令可以是字节(8位)操作,也可以是字(16位)操作。例例: MOV AX , 05H ; 字操作 MOV BL , A ; 字节操作dst , src的具体格式为: 表中: reg为寄存器操作数, m代表存储器操作数, im代表立即数。dst src说明说明reg1reg2reg1不能是IP与CSregimreg不能是CS,DS,ES,SS和IP mimregmreg不能是CS与IPmreg不允许dst与src同时皆为m 操作数。目的操作数dst不允许是立即数im 、段寄存器CS和IP 。MOV指令不影响状态标志位。例:例: MOV BX , AX MOV A

15、X , DATA_SEG MOV DS , AX MOV AX , COUNTBXSI MOV AL , EPUSH(Push onto the stack)进栈指令进栈指令格式格式:PUSH src操作操作:(SP) (SP) 2 (SP) 1, (SP) src说明说明: PUSH指令只能是字(16位)操作。src可以是reg 、 m, 但不能是im 。例例: PUSH AX PUSH CS PUSH SInPOP(Pop from stack)出栈指令出栈指令格式格式:POP dst操作操作:dst (SP) 1, (SP), (SP)(SP) 2说明说明: :POP指令只能字(16位)

16、操作dst可以是m,reg,但不能是CS、IP、im 。PUSH,POP指令不影响标志位XCHG(Exchange)数据交换指令数据交换指令 格式格式: XCHG OPR1,OPR2 操作:操作: (OPR1) (OPR2)OPR1,OPR2是两个操作数。它们可以是寄存器或存储器,但二者中必有一个是寄存器。不允许使用段寄存器和IP 。指令允许字或字节操作。不影响标志位。例例3.8XCHG BX , BP+SI如指令执行前:(BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H, (2F246H)=4154H。OPR2的物理地址=2F000H+0200H+0

17、046H =2F246H则指令执行后:(BX)=4154H , (2F246H)=6F30H累加器专用传送指令累加器专用传送指令XLAT(Translate)换码指令换码指令格式:格式: XLAT src_table 或 XLAT操作:操作: (AL) (BX)+(AL) XLAT指令用于转换代码。转换前,预先要构造一个字节表格,表格的内容是所要换取的代码,表格的首地址提前存入BX寄存器。需要转换的代码应该是相对表格首地址的位移量, 要提前存入AL寄存器中。该指令执行后可在AL中得到转换后的代码。src_table是表格首地址 (符号地址)例例3.9: (BX)=0040H, (AL)=0FH

18、, (DS)=F000H,所建表格如下图:2C存储器存储器F0040HF004FH(BX) (AL)=0FH指令: XALT把 F0000+0040+0F=F004FH单元的内容送AL寄存器。执行后(AL)=2CH。例例3.10:内存数据段有一张:内存数据段有一张16进制数的进制数的ASCII码表,首地址为码表,首地址为HEX-TABLE,如图所示,欲如图所示,欲查出第查出第10个元素(元素序号从个元素(元素序号从0开始),即开始),即A的的ASCII码。指令序列为:码。指令序列为:mov bx , 0ffset hex-table ; (bx) 表首址mov al , 0ah ; (al)

19、序号(位移量)xalt hex-table ; 查表转换执行后, (al)=41h (A的ASCII码) 指令指令: XLAT Hex_table执行结果把执行结果把A的的ASCII码送入在码送入在AL中中, 即即(AL)=41H存储器存储器30H(0)31H(1)39H(9)41H(A)46H(F)Hex-tableHex-table+10Hex-table+9Hex-table+1Hex-table+15图图 16进制数的进制数的ASCII码表码表IN(Input)输入指令输入指令 直接寻址方式直接寻址方式格式:格式: IN AL , PORT ; (字节) IN AX , PORT ;

20、(字)操作:操作:字节 (AL) (PORT) 字 (AX) (PORT+1,PORT)PORT是I/O端口地址(0255)间接寻址方式间接寻址方式格式:格式: IN AL , DX ; (字节) IN AX , DX ; (字)操作:操作: 字节 (AL) (DX) 字 (AX) (DX)+1,(DX)OUT(Output)输出指令输出指令直接寻址方式直接寻址方式格式格式: : OUT PORT , AL ;(字节) OUT PORT , AX ;(字)操作:操作:字节 (PORT) (AL) 字 (PORT+1, PORT) (AX)间接寻址方式间接寻址方式格式:格式:OUT DX , A

21、L ;(字节) OUT DX , AX ; (字)操作操作: : 字节 (DX) AL 字 (DX)+1, (DX) (AX)IN和OUT(输入输出)指令专用于 CPU与外设(I/O端口)之间传送信息。无论输入或输出, 数据必须经由累加器(AX或AL)传送。直接寻址方式的指令只能寻址256个I/O端口(端口号:0255或0FFH) 。间接接寻址方式的指令可以寻址64K个I/O端口(端口号: 065535或0FFFFH) 。IN和OUT指令提供了字与字节两种使用方式, 选用哪一种, 取决于外设端口的宽度。例例3.11 IN AX , 28H MOV DATA_WORD , AX把端口28的内容经

22、AX传送到存储单元DATA_WORD中。例例3.12 MOV DX , 3FCH IN AX , DX从端口03FCH取一个字送到AX寄存器。例例3.13 OUT 5 , AL 从 AL寄存器输出一个字节到端口5。目的地址传送指令目的地址传送指令LEA(Load effective address)取有效取有效地址指令地址指令 格式格式: : LEA reg16 , mem 操作操作: : 把源操作数的有效地址(EA),传送到目标寄存器(reg16) 中。源操作数mem必须是内存操作数。reg16必须是一个16位的通用寄存器例例3.14 LEA BX , BUFFER MOV BX , BUF

23、FER 前者是把BUFFER的有效地址EA传送给BX, 后者把存储单元BUFFEER的内容传送给BX。例例3.15 LEA BX , MAXBXSI若执行前: (BX)=0400H, (SI)=003CH, MAX=0F62H源操作数的有效地址为 EA=0400+003C+0F62=139EH指令执行后: (BX)=139EHLDS (Load DS with pointer)指令指针送指令指针送DS指令指令 格式:格式: LDS reg16 , mem32 操作:操作: (reg16) (mem32) (DS) (mem32+2)LES (Load ES with pointer)指令指针送

24、指令指针送ES指令指令 格式:格式: LES reg16 , mem32 操作:操作: (reg16) (mem32), (ES) (mem32+2)源操作数mem32是32位的内存操作数。 目的操作数reg16是16位的通用寄存器。本指令将源操作数指定的存储器中的4个连续单元(4字节)传送给指定的reg16和DS, 低2位字节给reg16, 高2位字节给DS。LEA、LDS、LES三条指令不影响标志位。例例3.16: LDS SI, 10H若指令执行前 (DS)=C000H , (SI)=0010H , (C0010H)=0180H , (C0012H)=2000H ,则指令执行后 (SI)

25、=0180H , (DS)=2000H 。例例3.17: LES DI , BX若指令执行前 (DS)=B000H , (BX)=O80AH , (B080AH)=05AEH , (B080CH)=4000H ,则指令执行后 (DI)=05AEH , (ES)=4000H 。标志传送指令标志传送指令LAHF (Load AH with flags)标志送标志送AHAH指令指令 格式:格式: LAHF 操作:操作: (AH) (FLAG的低字节位)只传送了SF,ZF,AF,PF,CF五个标志位SAHF(Store AH into flags)AH送标志寄存送标志寄存器指令器指令 格式:格式:SA

26、HF 操作操作:(FLAG的低字节) (AH)PUSHF(Push the flags)标志进栈指令标志进栈指令 格式:格式: PUSHF 操作:操作: (SP) (SP)-2 (SP)+1,(SP) (FLAG)POPF(Pop the flags)标志出栈指令标志出栈指令 格式:格式: POPF 操作:操作: (FLAG) (SP)+1,(SP) (SP) (SP)+2LAHF和PUSHF不影响标志位, SAHF和POPF则由装入的值来确定标志位。 算术指令算术指令加法指令加法指令ADD (ddd)加法加法格式:格式:ADD dst , src操作操作:(dst) (src) + (dst

27、)ADC (add with carry)带进位加法带进位加法格式:格式:ADC dst ,src操作:操作:(dst) (src) + (dst) + CF INC (increment )加加1 1格式:格式:INC dstn操作操作 :(dst) (dst) +1说明:说明:n目的操作数dst可以是寄存器或存储器操作数。n源操作数src可以是寄存器、存储器操作数或立即数。n源与目的操作数不能同为存储器操作数。n不允许段寄存器参与运算。n以上三条指令可以是字节(8位)操作,也可以是字(16位)操作。三条指令对条件标志位产生影响,但INC指令对CF位无影响。例如: ADD CL ,10 AD

28、C DX , SI ADD AX , MEM ADC ALPHADI , 30H INC SI以上指令皆合法。例例3.18: MOV AL , 7EH MOV BL , 5BH ADD AL , BL指令执行后,(AL)=7EH+5BH=D9H各状态标志位为:SF=1, ZF=0 , AF=1 , PF=0 , CF=0 , OF=1例例3.19:要求计算两个多字节的16进制数之和:3B74AC60F8H+20D59E36C1H=?式中被加数和加数均有五个字节,假设它们已分别存入从DATA1和DATA2开始的两个内存区,且均为低位字节在前,高位字节在后,如图3.8所示。要求相加所得结果仍存回以

29、DATA1为首址的内存区。本例可用循环程序来实现。运算程序流程图见图3.8。程序见下:程序见下:MOV CX , 5 ; 设置循环次数MOV SI , 0 ; 置位移量初值CLC ;清进位(CF=0)LOOPER:MOV AL , DATA2SI ;取一个加数 ADC DATA1SI , AL ;和另一个加数相加INC SI ;位移量加1DEC CX ;循环次数减1JNZ LOOPER ;如没有加完, 转LOPER ; 处继续相加 HLT ;程序暂停 减法指令减法指令SUB (subtract )减法减法格式:格式:SUB dst , src操作操作 :(dst) (dst) (src)SBB

30、 (subtract with borrow)带借位减法带借位减法格式:格式:SBB dst , src操作:操作: (dst) (dst) (src) CF其中,CF为借位位的值DEC (Decrement)减减1 1格式:格式:DEC dst操作:操作: (dst)(dst) 1CMP (Compare)比较比较格式:格式:CMP dst , src操作:操作:(dst) (src) ,CMP不保存运算结果,但影响状态标志位。NEG (Negate)求补求补格式:格式: NEG dst操作:操作: (dst) 0 (dst) dst ,src的意义与加法指令意义相同;可进行字节(8位)或字

31、(16位)运算;以上指令对状态标志位有影响,但DEC指令对CF位无影响。CF位是借位标志。例如例如 :SUB AL , 37H SBB CX , DX SUB ARRAYDI , AXSBB SI+6 , 97DEC BL DEC WORD PTR BPDINEG AXNEG BYTE PTRBXCMP AL , 0AHCMP BXF5 , SI皆为合法指令例如例如若原来(AL)= 0FFH (-1的补码)执行指令 NEG AL后(AL)=01(-1的绝对值) 例例3.20 内存数据存放了100个带符号数,首地址为AREA1, 要求将各数取绝对值后存入以AREA2为首址的内存区。由于100个带

32、符号数中可能既有正数,又有负数,因此先要判断正负。如为正数,可以原封不动的传送到另一内存区;如为负数,则须先求补即可得到负数的绝对值,然后再传送。程序如下: LEA SI,AREA1 ; (SI) 原地址指针 LEA DI,AREA2 ; (DI) 目的地址指针 MOV CX,100 ; (CX) 循环次数CHECK: MOV AL,SI ; 取一个带符号数到AL CMP AL,0 ; AL内容不变, 但影响标志 JNS NEXT ; 若(SF)=0,则转NEXT NEG AL ; 否则求补NEXT: MOV DI ,AL ; 传送到目的地址 INC SI ; 源地址加1 INC DI ; 目

33、的地址加1 DEC CX ; 循环次数减1 JNZ CHECK ; 如不等于零, 则转CHECK HLT ; 停止例例3.21 在数据段从DATA开始的存储单元中分别存放了两个8位无符号数。比较他们的大小,并将大者传送到MAX单元。编程如下:LEA BX,DATA ; DATA偏移地址送BXMOV AL,BX ; 第一个无符号数送ALINC BX ; BX指向第二个无符号数CMP AL,BX ; 两个数比较JNC DONE ; 如(CF)=0,则转到DONEMOV AL,BX ; 否则,第二个无符号数送ALDONE: MOV MAX,AL ; 较大的无符号送MAX单元HLT ;停止 例例3.2

34、2 SUB SI14H , 0316H 指令执行前 (DS)=3000H, (SI)=0040H, (30054H)=4336H 指令执行后 4336H 0100 0011 0011 0110 0136H 0000 0001 0011 0110 4200H 0100 0010 0000 0000 0100 0011 0011 0110 或补码相减 1111 1110 1100 1010 10100 0010 0000 0000 所以 (30054H)=4200H, SF=0, ZF=0, CF=0, OF=0 例例3.23 SUB DH , BP4指令执行前 (DH)=41H, (SS)=00

35、00H, (BP)=00E4H, (000E8)=5AH指令执行后 41H 0100 0001 0100 00015AH 0101 1010 1010 0110 E7H 11110 0111 1110 0111 所以, (DH)=0E7H, SF=1, ZF=0, CF=1, OF=0乘法指令乘法指令MUL (Unsigned Multiple)无符号数乘法无符号数乘法格式:格式: MUL src操作:操作:字节运算 (AX) (AL) (src) 字运算 (DX, AX) (AX) (src)IMUL(Signed Multiple)带符号数乘法带符号数乘法格式:格式: IMUL src操作

36、:操作:与MUL相同,但操作数被认为是带符号数说明:说明:n乘法指令是单操作数指令,隐含的目的操作数必须是累加器,不能是立即数。nsrc为寄存器或存储器操作数, 不能是立即数。n可进行字节或字运算。字节运算时,结果为16位,字运算时,结果为32位。本指令对CF和OF位有影响,对其他条件标志位为无定义。对于MUL指令,如果乘积的高半部分(字节运算的AH, 字运算时的DX)为0, 则CF=OF=0, 否则, CF=OF=1。对于IMUL指令, 如果乘积的高半部分仅仅是乘积低半部分的符号扩展, 则CF=OF=0, 否则, CF=OF=1。符号扩展就是将乘积的低半部分中的最高位之值送入乘积的高半部分的

37、每一位。例如, 对字节运算, 若(AL)80H, 经符号扩展后, (AH)=0; 若(AL) 80H, 符号扩展后, (AH)=FFH。对字运算, 若(AX)8000H, 符号扩展后, (DX)=0; 若(AX) 8000H, 符号扩展后, (DX)=FFFFH。例例3.24 (AL)=0B4H , (BL)=11H0B4H为无符号数的180D,带符号数的 -76D,11H 为无符号数的17D, 带符号数的+17D。执行 IMUL BL指令语句后, 乘积为:(AX)=0FAF4H= -1292D ;而 ( A H ) F F H ( A L 的 符 号 扩 展 ) , 所 以(OF)=(CF)

38、=1而执行 MUL BL后乘积为:(AX)=0BF4H=3060D而(AH)0, 所以(OF)=(CF)=1除法指令除法指令8086CPU执行除法时规定:当被除数为16位时,除数应为8位;当被除数为32位时,除数应为16位。DIV (Unsigned divide)除法除法格式格式:DIV src操作:操作:字节运算 (AL) (AX)/src的商; (AH) (AX)/src的余数; 字运算 (AX) (DX,AX)/src的商; (DX)(DX,AX)/src的余数。操作数被认为是无符号数,商和余数皆为无符号数。IDIV (Signed divide)带符号数除法带符号数除法格式:格式:

39、IDIV src操作:操作:与DIV相同,但操作数被认为是带符号数,商和余数也是带符号数。说明:说明:nsrc的类型与乘法指令中的一样;n除法指令对状态标志为无定义(值不确定);n若除数为0,或执行除法时,商超出范围,产生溢出,CPU自动产生类型号为0的内部中断,作中断处理。符号扩展指令符号扩展指令CBW字节扩展指令字节扩展指令格式:格式:CBW操作:操作:若 (AL)80H, 则 (AH) 00H, 否则 (AH) FFHCWD 字扩展指令字扩展指令格式:格式:CWD操作:操作:若(AX)9, AF=0) 0000 0110 ;加6调整 0001 0011 ; 13的BCD码, 正确结果两个

40、4位二进制数之和9, 应作加6调整。例如例如: 48+29=77 0100 1000 48的BCD码0010 1001 29的BCD码 0111 0001 结果错误(有进位,AF=1)0000 0110 加6调整 0111 0111 77的BCD码,正确 虽然两个4位二进制数之和9 0000 0110 加6调整 1010 0011 中间结果,高4位9 0110 0000 加60H调整 CF1 0000 0011 正确结果 CF=1加法运算后,低4位9时,调整指令需作加06H调整;高4位9时,调整指令需作加60H调整。例如例如: 72+91=163 0111 0010 1001 0001 CF1

41、 0000 0011 中间结果, CF=1 0110 0000 加60H调整 0110 0011 正确结果加法运算后,当CF=1(有进位产生)时,调整指令应作加60H处理。 压缩的压缩的BCD码调整指令码调整指令 DAA(decimal adjust for addition) 加法的十加法的十进制调整指令进制调整指令格式:格式:DAA操作操作:将AL中的和调整成压缩的BCD格式。调整方法:调整方法:若 (AL)的低4位9或(AF)=1 ,则(AL) (AL)06H , (AF)1 。 若(AL)的高4位9或(CF)=1 ,则(AL) (AL)60H , (CF) 1。nDAA指令之前必须先执

42、行ADD或ADC指令。加数和被加数都必须是2位的压缩BCD数,和要存入AL寄存器。nDAA指令对OF无定义, 但影响其他标志位。例例3.27 ADD AL, BL DAA执行前, (AL)=28H, (BL)=68H, 执行ADD后, (AL)=90H,(AF)=1, (CF)=0。和不是正确的BCD码形式。执行DAA指令,因为AF=1, CF=0 而作调整: (AL) (AL)+06H 得到 (AL)=96H, (CF)=0, (AF)=1DAS(decimal adjust for subtraction)减法减法的十进制调整指令的十进制调整指令格式:格式:DAS操作:操作:把AL中的差调

43、整成压缩的BCD码格式调整方法:调整方法:若 (AL)的低4位9或(AF)=1 则(AL) (AL)06H , (AF)1 若(AL)的高4位9或(CF)=1 则(AL) (AL)60H , (CF)1nDAS指令仅对AL内容作调整,不改变AH的内容。n在DAS指令之前必须先执行SUB或SBB指令,减数和被减数都必须是2位的压缩BCD数。nDAS指令对OF位无影响,对其他条件标志位产生影响。例例3.28 SUB AL , AH DAS如执行前,(AL)=86H, (AH)=07H。执行SUB后, (AL)=7FH, (CF)=0, (AF)=1。执行DAS时, 做 (AL)=(AL)06H调整

44、,得到(AL)=79H, (CF)=0, (AF)=1, 结果正确。例例3.29 设(BCD1)=1234, (BCD2)=4612, 试写出指令序列完成(BCD3)(BCD1)(BCD2) 。MOV AL , BCD1SUB AL , BCD2DASMOV BCD3 , ALMOV AL , BCD1+1SBB AL , BCD2+1DASMOV BCD3+1 , AL非压缩的非压缩的BCD码调整指令码调整指令AAA (ASCII adjust for addition)加法的加法的ASCII调整指令调整指令格式:格式:AAA操作:操作:(AL)把AL中的和调整到非压缩的BCD码格式, (A

45、H)(AH)调整产生的进位值。调整方法:调整方法:若(AL) 0FH 09H 或 AF=1则(AL)(AL)+06H, (AH)(AH)+1, AF=1, CF=1, (AL)(AL) 0FH;否则(AL)(AL) 0FH, CF=0, AF=0。AAA指令之前必须先执行 ADD或ADC指令,加数和被加数都必须是1位的压缩BCD数,和要存入AL寄存器。AAA指令影响AF和CF标志,但对其他标志无定义。 例例3.30 ADD AL , BL AAA 如指令执行前, (AX)=0535H,(BL)=39H, 即AL和BL寄存器的内容分别为5和9的ASCII码。 ADD指令执行完后 (AL)=6EH

46、, (BL)=39H, (AH)=05H, AF=0 。执行AAA时,因为(AL)0FH=0EH9H, 要作调整n (AL)(AL)+06H, 得(AL)=74Hn (AH)(AH)+1 得到 (AH)=06Hn AF 1n CF 1n (AL)(AL)0FH 得到 (AL)=04H最终结果为(AH)=06H, (AL)=04H, 即(AX)=0604H,CF=AF=1AAS (ASCII adjust for subtraction)减法的减法的ASCII码调整指令码调整指令格式:格式: AAS操作:操作: (AL) 把AL中的差调整到非压缩的BCD码格式, (AH) (AH) 调整产生的错

47、位值。调整方法:调整方法:若(AL) 0FH9 或 AF=1则(AL)(AL)6,(AH)(AH)1AF1,CF1,(AL)(AL)0FH) ;否则 (AL)(AL)0FH。AAS指令的使用要求和对标志位的影响与AAA指令类似。例例3.31 完成非压缩BCD码的运算:134=9MOV AX , 0103H ; (AH)=01H, (AL)=03HMOV BL , 04H ; (BL)=04HSUB AL , BL ; (AL)=03H04H=FFHAAS ; (AX)=0009H调整过程: (AL)(AL)6, 即(AL)=F9H(AH)(AH)1, 得(AH)=0CF=AF=1(AL)(AL

48、)0FH,得到(AL)=09H最终结果为 (AX)=0009HAAM(ASCII adjust for multiplication)乘法乘法的的ASCII调整指令调整指令格式:格式: AAM操作:操作:对AL中的乘积进行调整,方法为: (AH)(AL)/0AH的商; (AL)(AL)/0AH的余数;AAM指令之前必须执行MUL指令;乘数与被乘数都必须是高4位为0的1 位非压缩型BCD数;AAM指令对SF,ZF和PF位有影响,但对AF,CF和OF位无定义 。例例3.32 进行十进制乘法运算:79=63编程为:MOV AL , 07H ; (AL)=07HMOV BL , 09H ; (BL)=

49、09HMUL BL ; (AX)=07H09H =003FH(=63D)AAM ; 作调整即作:(AL)/10=3FH/0AH,商=06H(AH) ; 余数=03H(AL) 。结果: (AX)=0603H, SF=ZF=0, PF=1。AAD (ASCII adjust for division) 除法的除法的ASCII调整指令调整指令格式:格式:AAD操作:操作:(AL)(AH) 0AH+(AL) (AH)0nAAD指令是用在DIV指令之前,对AX中的被除数进行调整;n被除数是存放在AX中的2位非压缩 BCD数, AH中是十位, AL中是个位;除数是1位非压缩 BCD数,每个BCD数的高4位

50、全为0;n本指令根据AL寄存器的结果设置SF、ZF、PF位,对OF、CF和AF位无定义。例例3.33 AAD如执行前 (AX)=0604H; (64的BCD码形式)则执行后 (AX)=0040H; (二进制的64)例例3.34 完成十进制除法运算:73/2=36 余 1MOV AX,0703H ; (AH)=07H, (AL)=03HMOV BL, 02H ; (BL)=02HAAD ; (AL)=49H(二进制的73)DIV BL ; (AL) =24H(商), (AH)=01H(余数) 逻辑运算和移位指令逻辑运算和移位指令逻辑运算指令逻辑运算指令共有五条:AND (and) 逻辑与OR (

51、or ) 逻辑或XOR (exclusive) 异或NOT (not) 逻辑非TEST(test) 测试AND 逻辑与指令逻辑与指令格式:格式: AND dst , src操作:操作: (dst)(dst) (src)OR 逻辑或指令逻辑或指令格式:格式: OR dst , src操作操作: : (dst)(dst) V (src)NOT逻辑非指令逻辑非指令格式:格式:NOT dst操作:操作:(dst)(dst)XOR 异或指令异或指令格式格式: : XOR dst , src操作:操作: (dst)(dst)+(src)TEST 测试指令测试指令格式格式: : TEST dst , src

52、操作操作: : (dst)(src), 结果影响状态标志位n以上指令可进行字节或字操作ndst与src的意义与算术运算指令的类似n除NOT指令外,其余四条指令都对状态标志位产生影响,具体为:CF=OF=0, AF位无定义,SF、ZF、PF据运算结果而定。例例3.35 判断一个从端口地址为PORT的外设输入的数据,若数据的第1、3、5位中的任一位不为零,则转移到NEXT。程序段为:IN AL , PORTTEST AL , 00101010BJNZ NEXT NEXT:例例3.36 从偏移地址从偏移地址TABLE开始的内存区中,开始的内存区中,存放着存放着100个字节的十六进制数,要求将这些个字

53、节的十六进制数,要求将这些数进行累加,并将累加和的低位存数进行累加,并将累加和的低位存SUM单元,单元,高位存高位存SUM+1单元。程序如下:单元。程序如下:LEA BX , TABLE ; (BX) 数据表地址指针 MOV CL , 100 ; (CL) 数据块长度XOR AX , AX ; 清AL、AHLOOPER: ADD AL , BX ; 加一个数到ALJNC GOON ; 如(CF)=0,转移到GOONINC AH ; 否则,AH加1GOON: INC BX ; 地址指针加1DEC CL ; 计数值减1JNZ LOOPER ; 如(CL)不等于0, ; 转移到LOOPERMOV S

54、UM , AX ; 否则, ; (SUM) (AL), ; (SUM+1) (AH)HLT ; 停止移位和循环指令移位和循环指令SHL/SAL逻辑左移逻辑左移/ /算术左移算术左移(shift logical left /shift arithmetic left)格式:格式:SHL dst , 1 or SAL dst , 1或: SHL dst , CL or SAL dst , CL操作:操作:将dst顺序向左移1位或移CL寄存器中指定的位数0LHdstCFSHR逻辑右移指令逻辑右移指令格式:格式:SHR dst , 1/CLn SAR算术右移指令算术右移指令格式:格式:SAR dst,

55、 1/CLdst0CFLHdstLHCFdstn ROL循环左移指令循环左移指令格式:格式:ROL dst, 1/CLn ROR循环右移指令循环右移指令格式:格式:ROR dst, 1/CL LHLHdstCFLHCFdstnRCL带进位循环左移指令带进位循环左移指令格式:格式:RCL dst, 1/CLnRCR带进位循环右移指令带进位循环右移指令格式:格式:RCR dst, 1/CLLHLHdstCFLHCFdst说明:说明:n移位和循环指令可进行字节和字操作ndst可以是通用寄存器和存储器操作数n移位次数可以是1或由CL中内容来确定指令对条件标志位有影响:对于移位指令,将影响除AF位以外的

56、其他标志位,AF内容为不定; 对于循环移位指令, 只影响CF和OF位。所有指令对OF位的影响仅当移为次数为1时才有意义, 该位设置规则为:指令执行前后,最高位相同时OF=0, 否则OF=1。例如:例如:以下均为移位指令的合法形式SHL BL , 1SHR WORD PTR BLOCK , CLSAR DI , CLROL BYTE PTR DI , 1ROR BH , CLRCL AL , CLRCR WORD PTR TABLEBX , 1例例3.37 将一个将一个1616位无符号数除以位无符号数除以512512。该数。该数原来存放在原来存放在DIVIDANDDIVIDAND为首地址的两个连

57、续的存为首地址的两个连续的存储单元中。可用逻辑右移指令完成上述除法运储单元中。可用逻辑右移指令完成上述除法运算。编程如下:算。编程如下:MOV AX , DIVIDAND ; (AX) 被除数 SHR AX , 1 ; (AX)=DIVIDAND2XCHG AL , AH ; (AL) (AH), ; 相当循环右移8位CBW ; 清AX的高8位, ; (AX)=DIVIDAND512HLT 也可以如下编程:也可以如下编程:MOV AX , DIVIDAND ; (AX) 被除数 MOV CL , 9 ; 预置移位次数SHR AX , CL ; 逻辑右移9次, 相当于 ; (AX)=DIVIDA

58、ND512HLT 例例3.38 要求测试要求测试AL寄存器中的第寄存器中的第5位的状位的状态是态是“0”还是还是“1”,则可利用以下指令实现,则可利用以下指令实现:MOV CL , 5 ; (CL) 移位次数ROR AL , CL ; (CF) AL的第5位JNC ZERO ; 若(CF)=0, 转ZERO ZERO : 串操作指令串操作指令有5条指令MOVS (Move string) 串传送串传送CMPS (Compare string) 串比较串比较SCAS (Scan string) 串扫描串扫描LODS (Load from string) 从串取从串取STOS (Store int

59、o string) 存入串存入串 MOVS 串传送串传送格式:格式:REPMOVS dst-string , src-stringREPMOVSBREPMOVSW操作:操作:(ES): (DI)(DS): (SI)(SI)(SI)1,(DI)(DI)1(字节操作)(SI)(SI)2,(DI)(DI)2(字操作)当方向标志DF=0时用“”,DF=1时用“”。说明:说明:目的串在附加段,段基值在ES中。源串通常在数据段,段基值由DS提供。源串可以段超越,目的串则不允许。在第一种格式中,应表明操作数是字还是字节,指令中的dst和src只提供给汇编检查之用,并不允许用其他寻址方式来确定操作数。第二、三

60、种格式则明确指定是字节或字操作,不用写操作数。传送指令不影响状态标志位。方括号项REP是可选项,REP为重复性前缀。重复性前缀重复性前缀REP的使用的使用格式:格式: REP string primitive其中string primitive 代表串指令, 可为MOVS, STOS指令。操作:操作:如(CX)=0则退出REP,否则往下执行(CX) (CX) 1执行其后串指令重复 例例3.39 将数据段中首地址为BUFFER1的200个字节传送到附加段首地址位BUFFER2的内存区中。用MOV指令编程如下:对DS, ES 初始化LEA SI , BUFFER1 ; (SI) 源串首地址指针LE

温馨提示

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

最新文档

评论

0/150

提交评论