第三章指令系统与寻址方式_第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 address ing ) 操作数直接包含在指令中,紧跟在操作码 之后,作为指令的一部分,这种操作数称 为立即数。 立即数可以是8位的,也可以是16位的。如 果是16位数,则高位字节存放在高地址单 元中,低位字节存放在低地址单元中。 立即数寻址

4、方式只能作为源操作数,主要 用来给寄存器或存储单元赋值。 例例3.1 MOV BL ,80H MOV AX ,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内部操

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

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

7、OV AL , VALUE 此时VALUE为存放操作数单元的符号地 址。 寄存器间接寻址方式寄存器间接寻址方式 (Register indirect addressing ) 操作数的有效地址在指令中指定的寄存器 SI、 DI、BX 或BP中,操作数本身在存储 器中。 若指定的寄存器为:SI、 DI、BX,默认的 段寄存器是DS。若指定的寄存器是BP, 默认的段寄存器是SS。 书写指令时,用作间址的寄存器必须加上 方括弧,以免与寄存器寻址方式混淆。 例例3.4:MOV AX , SI 如果 (DS)= 3000H , (SI ) = 2000H , 物理地址=30000H+2000H=3200

8、0H 。 若 (32000H)=4050H 执行结果为: (AX) =4050H 又: MOV BP , AL 如果 (SS)=5000H , (BP)=1000H , 物理地址=50000H+1000H=51000H 。 执行结果为: (51000H)=50H 。 无论用SI,DI,BX或者BP作为间址寄存器, 都允许段超越。 例如例如: MOV ES:DI , AX MOV DX , DS:BP ADD AL , ES:BX SUB CS:SI , AX 寄存器相对寻址方式寄存器相对寻址方式(Register relative addr essing)(或称直接变址寻址方式 ) 操作数的有

9、效地址EA是一个由指令中指定 的8位或16位位移量disp (displacement)与 基址或变址寄存器的内容相加之和。即 EA = (SI) (DI) (BX) (BP) + 8位disp 16位disp 位移量一般可用符号地址表示。 在一般情况下,若指令中指定的寄存器是 SI, DI, BX,则存放操作数的段寄存器默认 为DS;若指令中指定BP寄存器,则对应的 段寄存器应为SS 。 寄存器的相对寻址方式也允许段超越。 例例3.5: MOV SI+10H , AX MOV CX , BX+COUNT 如果 (DS)=3000H , (SI)=2000H, (BX)=1000H , COU

10、NT=1050H, (AX)=4050H , 指令执行情况如图3.4所示。 执行结果为: (32010H)=4050H (CX)=4030H 寄存器相对寻址方式的寄存器的操作数在 汇编语言中书写时可以是下述形式之一: MOV AL , BP+TABLE MOV AL , BP+TABLE MOV AL , TABLEBP 以上三条指令实质上代表同一条指令。 基址变址寻址方式基址变址寻址方式(Based indexed addressing) 操作数的有效地址是由指令指定的一个基 址寄存器(BX或BP)和一个变址寄存器 (SI或DI)的内容之和。即: 若基址寄存器为BX, 默认的段寄存器为DS,

11、 若基址寄存器为BP, 默认的段寄存器为SS。 允许段跨越。 (SI) (DI) (BX) (BP) EA =+ 例例3.6: MOV BX+DI , AX 如果: (DS)=3000H, (BX)=1000H, (DI)=1100H, EA=1000H+1100H=2100H; 物理地址=30000H+2100H=32100H; 若(AX)=0050H , 则执行结果为: (32100H)=0050H 。 指令: MOV AH , BPSI 如果 (BP)=2000H, (SI)=1200H , (SS)=4000H, (43200H)=56H, 物理地址=40000H+2000H+1200

12、H=43200H, 则执行结果为: (AH)=56H 。 基址变址相对寻址方式基址变址相对寻址方式( Relative indexed addressing ) 操作数的有效地址是指令中指定的8位或16 位位移量(disp)与一个基址寄存器和一个 变址寄存器的内容之和。即: 当基址寄存器为BX时, 使用DS段寄存器, 当 基址寄存器为BP时, 使用SS段寄存器。 允许段超越。 (SI) (DI) (BX) (BP) EA =+ + 8位位disp 16位位disp 基址加变址相对寻址方式也可以表示成不 同的形式: MOV AX , BX+SI+COUNT MOV AX , COUNTBXSI

13、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+1000H+0520H =33520H 若 (33520)=1234H 执行结果为 (AX)=1234H 3.2 8086的汇编指令系统的汇编指令系统 8086的指令系统包括100多条指令, 可分为以 下六种类型: n数据传送指令数据传送指令 n

14、算术运算指令算术运算指令 n位操作指令位操作指令 n串操作指令串操作指令 n程序控制指令程序控制指令 1.处理器控制指令处理器控制指令 数据传送指令数据传送指令 数据传送指令负责把数据、地址或立即数传 送到寄存器或存储单元中。 通用传送指令通用传送指令 MOV(Move)数据传送指令 格式: MOV dst , src 操作: (dst) (src) 其中dst表示目的操作数,src表示源操作数。 说明: MOV 指令可以是字节(8位)操作,也可 以是字(16位)操作。 例例: MOV AX , 05H ; 字操作 MOV BL , A ; 字节操作 dst , src的具体格式为: 表中:

15、reg为寄存器操作数, m代表存储器操 作数, im代表立即数。 dst src说明说明 reg1reg2reg1不能是IP与CS regimreg不能是CS,DS,ES,SS和IP mim regmreg不能是CS与IP mreg 不允许dst与src同时皆为m 操作数。目的 操作数dst不允许是立即数im 、段寄存 器CS和IP 。 MOV指令不影响状态标志位。 例:例: MOV BX , AX MOV AX , DATA_SEG MOV DS , AX MOV AX , COUNTBXSI MOV AL , E PUSH(Push onto the stack)进栈指令进栈指令 格式格式

16、:PUSH src 操作操作:(SP) (SP) 2 (SP) 1, (SP) src 说明说明: PUSH指令只能是字(16位)操作。 src可以是reg 、 m, 但不能是im 。 例例: PUSH AX PUSH CS PUSH SI nPOP(Pop from stack)出栈指令出栈指令 格式格式:POP dst 操作操作:dst (SP) 1, (SP), (SP)(SP) 2 说明说明: : POP指令只能字(16位)操作 dst可以是m,reg,但不能是CS、 IP、 im 。 PUSH,POP指令不影响标志位 XCHG(Exchange)数据交换指令数据交换指令 格式格式:

17、XCHG OPR1,OPR2 操作:操作: (OPR1) (OPR2) OPR1,OPR2是两个操作数。它们可以是寄 存器或存储器,但二者中必有一个是寄存器。 不允许使用段寄存器和IP 。 指令允许字或字节操作。 不影响标志位。 例例3.8 XCHG BX , BP+SI 如指令执行前: (BX)=6F30H, (BP)=0200H, (SI)=0046H, (SS)=2F00H, (2F246H)=4154H。 OPR2的物理地址=2F000H+0200H+0046H =2F246H 则指令执行后: (BX)=4154H , (2F246H)=6F30H 累加器专用传送指令累加器专用传送指令

18、 XLAT(Translate)换码指令换码指令 格式:格式: XLAT src_table 或 XLAT 操作:操作: (AL) (BX)+(AL) XLAT指令用于转换代码。转换前,预先要 构造一个字节表格,表格的内容是所要换取的 代码,表格的首地址提前存入BX寄存器。需 要转换的代码应该是相对表格首地址的位移量, 要提前存入AL寄存器中。该指令执行后可在 AL中得到转换后的代码。 src_table是表格首地址 (符号地址) 例例3.9: (BX)=0040H, (AL)=0FH, (DS)=F000H, 所建表格如下图: 2C 存储器存储器 F0040H F004FH (BX) (AL

19、)=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) 序号(位移量) xalt hex-table ; 查表转换 执行后, (a

20、l)=41h (A的ASCII码) 指令指令: XLAT Hex_table 执行结果把执行结果把A的的 ASCII码送入在码送入在AL 中中, 即即 (AL)=41H 存储器存储器 30H(0) 31H(1) 39H(9) 41H(A) 46H(F) Hex-table Hex-table+10 Hex-table+9 Hex-table+1 Hex-table+15 图图 16进制数的进制数的ASCII码表码表 IN(Input)输入指令输入指令 直接寻址方式直接寻址方式 格式:格式: IN AL , PORT ; (字节) IN AX , PORT ; (字) 操作:操作:字节 (AL)

21、 (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 , AL ;(字节

22、) 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 把端

23、口28的内容经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 , B

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

25、(Load ES with pointer)指令指针送指令指针送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)=0

26、180H , (C0012H)=2000H , 则指令执行后 (SI)=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

27、 AH into flags)AH送标志寄存送标志寄存 器指令器指令 格式:格式:SAHF 操作操作:(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)+2 LAHF和PUSHF不影响标志位, SAHF和 POPF则由装入的值来确定标志位。 算术指令算术指令 加法指令加法指令 ADD (d

28、dd)加法加法 格式:格式:ADD dst , src 操作操作:(dst) (src) + (dst) ADC (add with carry)带进位加法带进位加法 格式:格式:ADC dst ,src 操作:操作:(dst) (src) + (dst) + CF INC (increment )加加1 1 格式:格式:INC dst n操作操作 :(dst) (dst) +1 说明:说明: n目的操作数dst可以是寄存器或存储器操 作数。 n源操作数src可以是寄存器、存储器操作 数或立即数。 n源与目的操作数不能同为存储器操作数。 n不允许段寄存器参与运算。 n以上三条指令可以是字节(8

29、位)操作, 也可以是字(16位)操作。 三条指令对条件标志位产生影响,但INC 指令对CF位无影响。 例如: ADD CL ,10 ADC 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=? 式中被加数和

30、加数均有五个字节,假设它 们已分别存入从DATA1和DATA2开始的两个 内存区,且均为低位字节在前,高位字节在 后,如图3.8所示。要求相加所得结果仍存回 以DATA1为首址的内存区。 本例可用循环程序来实现。运算程序流程 图见图3.8。 程序见下:程序见下: MOV CX , 5 ; 设置循环次数 MOV SI , 0 ; 置位移量初值 CLC ;清进位(CF=0) LOOPER: MOV AL , DATA2SI ;取一个加数 ADC DATA1SI , AL ;和另一个加数相加 INC SI ;位移量加1 DEC CX ;循环次数减1 JNZ LOOPER ;如没有加完, 转LOPER

31、 ; 处继续相加 HLT ;程序暂停 减法指令减法指令 SUB (subtract )减法减法 格式:格式:SUB dst , src 操作操作 :(dst) (dst) (src) SBB (subtract with borrow)带借位减法带借位减法 格式:格式:SBB dst , src 操作:操作: (dst) (dst) (src) CF 其中,CF为借位位的值 DEC (Decrement)减减1 1 格式:格式:DEC dst 操作:操作: (dst)(dst) 1 CMP (Compare)比较比较 格式:格式:CMP dst , src 操作:操作:(dst) (src)

32、, CMP不保存运算结果,但影响状态标志位。 NEG (Negate)求补求补 格式:格式: NEG dst 操作:操作: (dst) 0 (dst) dst ,src的意义与加法指令意义相同; 可进行字节(8位)或字(16位)运算; 以上指令对状态标志位有影响,但DEC指 令对CF位无影响。CF位是借位标志。 例如例如 : SUB AL , 37H SBB CX , DX SUB ARRAYDI , AX SBB SI+6 , 97 DEC BL DEC WORD PTR BPDI NEG AX NEG BYTE PTRBX CMP AL , 0AH CMP BXF5 , SI 皆为合法指令

33、 例如例如若原来(AL)= 0FFH (-1的补码) 执行指令 NEG AL后 (AL)=01(-1的绝对值) 例例3.20 内存数据存放了100个带符号数, 首地址为AREA1, 要求将各数取绝对值后存 入以AREA2为首址的内存区。 由于100个带符号数中可能既有正数,又 有负数,因此先要判断正负。如为正数,可 以原封不动的传送到另一内存区;如为负数, 则须先求补即可得到负数的绝对值,然后再 传送。程序如下: LEA SI,AREA1 ; (SI) 原地址指针 LEA DI,AREA2 ; (DI) 目的地址指针 MOV CX,100 ; (CX) 循环次数 CHECK: MOV AL,S

34、I ; 取一个带符号数到AL CMP AL,0 ; AL内容不变, 但影响标志 JNS NEXT ; 若(SF)=0,则转NEXT NEG AL ; 否则求补 NEXT: MOV DI ,AL ; 传送到目的地址 INC SI ; 源地址加1 INC DI ; 目的地址加1 DEC CX ; 循环次数减1 JNZ CHECK ; 如不等于零, 则转CHECK HLT ; 停止 例例3.21 在数据段从DATA开始的存储单元中分 别存放了两个8位无符号数。比较他们的大小, 并将大者传送到MAX单元。编程如下: LEA BX,DATA ; DATA偏移地址送BX MOV AL,BX ; 第一个无符

35、号数送AL INC BX ; BX指向第二个无符号数 CMP AL,BX ; 两个数比较 JNC DONE ; 如(CF)=0,则转到DONE MOV AL,BX ; 否则,第二个无符号数送AL DONE: MOV MAX,AL ; 较大的无符号送MAX单元 HLT ;停止 例例3.22 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 001

36、1 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)=0000H, (BP)=00E4H, (000E8)=5AH 指令执行后 41H 0100 0001 0100 0001 5AH 0101 1010 1010 0110 E7H 11110 0111 1110 0111 所以, (DH)=0E7H, SF=1, ZF=0, CF=1, OF=0 乘法指令乘法指令 M

37、UL (Unsigned Multiple)无符号数乘法无符号数乘法 格式:格式: MUL src 操作:操作:字节运算 (AX) (AL) (src) 字运算 (DX, AX) (AX) (src) IMUL(Signed Multiple)带符号数乘法带符号数乘法 格式:格式: IMUL src 操作:操作:与MUL相同,但操作数被认为是带 符号数 说明:说明: n乘法指令是单操作数指令,隐含的目的操作 数必须是累加器,不能是立即数。 nsrc为寄存器或存储器操作数, 不能是立即数。 n可进行字节或字运算。字节运算时,结果为 16位,字运算时,结果为32位。 本指令对CF和OF位有影响,对

38、其他条件标 志位为无定义。对于MUL指令,如果乘积的 高半部分(字节运算的AH, 字运算时的DX)为 0, 则CF=OF=0, 否则, CF=OF=1。 对于IMUL指令, 如果乘积的高半部分仅仅 是乘积低半部分的符号扩展, 则CF=OF=0, 否 则, CF=OF=1。 符号扩展就是将乘积的低半部分中的最高 位之值送入乘积的高半部分的每一位。 例如, 对字节运算, 若(AL)80H, 经符号扩 展后, (AH)=0; 若(AL) 80H, 符号扩展后, (AH)=FFH。 对字运算, 若(AX)8000H, 符号扩展后, (DX)=0; 若(AX) 8000H, 符号扩展后, (DX)=FF

39、FFH。 例例3.24 (AL)=0B4H , (BL)=11H 0B4H为无符号数的180D,带符号数的 -76D, 11H 为无符号数的17D, 带符号数的+17D。 执行 IMUL BL指令语句后, 乘积为: (AX)=0FAF4H= -1292D ; 而 ( A H ) F F H ( A L 的 符 号 扩 展 ) , 所 以 (OF)=(CF)=1 而执行 MUL BL后乘积为: (AX)=0BF4H=3060D 而(AH)0, 所以(OF)=(CF)=1 除法指令除法指令 8086CPU执行除法时规定:当被除数为16 位时,除数应为8位;当被除数为32位时,除 数应为16位。 D

40、IV (Unsigned divide)除法除法 格式格式:DIV src 操作:操作:字节运算 (AL) (AX)/src的商; (AH) (AX)/src的余数; 字运算 (AX) (DX,AX)/src的商; (DX)(DX,AX)/src的余数。 操作数被认为是无符号数,商和余数皆为 无符号数。 IDIV (Signed divide)带符号数除法带符号数除法 格式:格式: IDIV src 操作:操作:与DIV相同,但操作数被认为是带符 号数,商和余数也是带符号数。 说明:说明: nsrc的类型与乘法指令中的一样; n除法指令对状态标志为无定义(值不确定); n若除数为0,或执行除法

41、时,商超出范围,产 生溢出,CPU自动产生类型号为0的内部中断, 作中断处理。 符号扩展指令符号扩展指令 CBW字节扩展指令字节扩展指令 格式:格式:CBW 操作:操作:若 (AL)80H, 则 (AH) 00H, 否则 (AH) FFH CWD 字扩展指令字扩展指令 格式:格式:CWD 操作:操作:若(AX)9, AF=0) 0000 0110 ;加6调整 0001 0011 ; 13的BCD码, 正确结果 两个4位二进制数之和9, 应作加6调整。 例如例如: 48+29=77 0100 1000 48的BCD码 0010 1001 29的BCD码 0111 0001 结果错误(有进位,AF

42、=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 0000 0011 中间结果, CF=1 0110 0000 加60H调整 0110 0011 正确结果 加法运算后,当CF=1(有进位产生)时,调 整指令应作加60

43、H处理。 压缩的压缩的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指令之前必须先执行ADD或ADC指令。 加数和被加数都必须是2位的压缩BCD数,和 要存入AL寄存器。 nDAA指令对OF无定义, 但影响其他标志位。 例例3.27

44、 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)=1 DAS(decimal adjust for subtraction)减法减法 的十进制调整指令的十进制调整指令 格式:格式:DAS 操作:操作:把AL中的差调整成压缩的BCD码格 式 调整方法:调整方法: 若 (AL)的低4位9或(AF)=1 则(AL) (AL)06H , (AF)

45、1 若(AL)的高4位9或(CF)=1 则(AL) (AL)60H , (CF)1 nDAS指令仅对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调整, 得到(AL)=79H, (CF)=0, (AF)=1, 结果正确。 例例3.29 设(BCD1)

46、=1234, (BCD2)=4612, 试 写出指令序列完成(BCD3)(BCD1)(BCD2) 。 MOV AL , BCD1 SUB AL , BCD2 DAS MOV BCD3 , AL MOV AL , BCD1+1 SBB AL , BCD2+1 DAS MOV BCD3+1 , AL 非压缩的非压缩的BCD码调整指令码调整指令 AAA (ASCII adjust for addition)加法的加法的 ASCII调整指令调整指令 格式:格式:AAA 操作:操作:(AL)把AL中的和调整到非压缩的 BCD码格式, (AH)(AH)调整产生的进位值。 调整方法:调整方法: 若(AL)

47、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, (BL)=39H, (AH)=05H,

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

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

50、1 (AL)(AL)0FH,得到(AL)=09H 最终结果为 (AX)=0009H AAM(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)=0

51、7H MOV BL , 09H ; (BL)=09H MUL 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)0 nAAD指令是用在DIV指令之前,对AX中的 被除数进行调整; n被除数是存放在AX中的2位非压缩 BCD数, AH中是十

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

53、令逻辑运算和移位指令 逻辑运算指令逻辑运算指令 共有五条: AND (and) 逻辑与 OR (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 ,

54、 src 操作:操作: (dst)(dst)+(src) TEST 测试指令测试指令 格式格式: : TEST dst , src 操作操作: : (dst)(src), 结果影响状态标志位 n以上指令可进行字节或字操作 ndst与src的意义与算术运算指令的类似 n除NOT指令外,其余四条指令都对状态标 志位产生影响,具体为:CF=OF=0, AF位无 定义,SF、ZF、PF据运算结果而定。 例例3.35 判断一个从端口地址为PORT的外 设输入的数据,若数据的第1、3、5位中的任 一位不为零,则转移到NEXT。 程序段为: IN AL , PORT TEST AL , 00101010B

55、JNZ NEXT NEXT: 例例3.36 从偏移地址从偏移地址TABLE开始的内存区中,开始的内存区中, 存放着存放着100个字节的十六进制数,要求将这些个字节的十六进制数,要求将这些 数进行累加,并将累加和的低位存数进行累加,并将累加和的低位存SUM单元,单元, 高位存高位存SUM+1单元。程序如下:单元。程序如下: LEA BX , TABLE ; (BX) 数据表地址指针 MOV CL , 100 ; (CL) 数据块长度 XOR AX , AX ; 清AL、AH LOOPER: ADD AL , BX ; 加一个数到AL JNC GOON ; 如(CF)=0,转移到GOON INC

56、AH ; 否则,AH加1 GOON: INC BX ; 地址指针加1 DEC CL ; 计数值减1 JNZ LOOPER ; 如(CL)不等于0, ; 转移到LOOPER MOV SUM , 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 操作:操作:将

57、dst顺序向左移1位或移CL寄存器 中指定的位数 0 LH dstCF SHR逻辑右移指令逻辑右移指令 格式:格式:SHR dst , 1/CL n SAR算术右移指令算术右移指令 格式:格式:SAR dst, 1/CL dst 0CF LH dst LH CFdst n ROL循环左移指令循环左移指令 格式:格式:ROL dst, 1/CL n ROR循环右移指令循环右移指令 格式:格式:ROR dst, 1/CL LH LH dstCF LH CF dst nRCL带进位循环左移指令带进位循环左移指令 格式:格式:RCL dst, 1/CL nRCR带进位循环右移指令带进位循环右移指令 格

58、式:格式:RCR dst, 1/CL LH LH dstCF LH CF dst 说明:说明: n移位和循环指令可进行字节和字操作 ndst可以是通用寄存器和存储器操作数 n移位次数可以是1或由CL中内容来确定 指令对条件标志位有影响:对于移位指令, 将影响除AF位以外的其他标志位,AF内容为 不定; 对于循环移位指令, 只影响CF和OF位。 所有指令对OF位的影响仅当移为次数为1时 才有意义, 该位设置规则为:指令执行前后, 最高位相同时OF=0, 否则OF=1。 例如:例如:以下均为移位指令的合法形式 SHL BL , 1 SHR WORD PTR BLOCK , CL SAR DI ,

59、CL ROL BYTE PTR DI , 1 ROR BH , CL RCL AL , CL RCR WORD PTR TABLEBX , 1 例例3.37 将一个将一个1616位无符号数除以位无符号数除以512512。该数。该数 原来存放在原来存放在DIVIDANDDIVIDAND为首地址的两个连续的存为首地址的两个连续的存 储单元中。可用逻辑右移指令完成上述除法运储单元中。可用逻辑右移指令完成上述除法运 算。编程如下:算。编程如下: MOV AX , DIVIDAND ; (AX) 被除数 SHR AX , 1 ; (AX)=DIVIDAND2 XCHG AL , AH ; (AL) (A

60、H), ; 相当循环右移8位 CBW ; 清AX的高8位, ; (AX)=DIVIDAND512 HLT 也可以如下编程:也可以如下编程: MOV AX , DIVIDAND ; (AX) 被除数 MOV CL , 9 ; 预置移位次数 SHR AX , CL ; 逻辑右移9次, 相当于 ; (AX)=DIVIDAND512 HLT 例例3.38 要求测试要求测试AL寄存器中的第寄存器中的第5位的状位的状 态是态是“0”还是还是“1”,则可利用以下指令实现,则可利用以下指令实现: MOV CL , 5 ; (CL) 移位次数 ROR AL , CL ; (CF) AL的第5位 JNC ZERO

温馨提示

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

评论

0/150

提交评论