第 3 章 8086 的寻址方式和指令系统 (3) 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 1
3.3.2 算术运算指令 数据类型 : 无符号和有符号整数 无符号数又分成 : 无符号二进制数 ; 无符号压缩十进制 :1 字节表示 2 个十进制数 ; 无符号非压缩十进制 :1 字节表示 1 个十进制数 有符号数 : 有符号二进制数 用补码表示 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 2
3.3.2 算术运算指令 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 3
3.3.2 算术运算指令 对加减法指令, 无符号和有符号数可采用同一套指令, 但应注意 : 参加的操作数必须都是无符号数或都是有符号数 需使用不同的标志位来检查无符号数和有符号数的运算结果是否溢出 ( 第一章已述 ) 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 4
两个 8 位数相加时有 4 种情况 : 1 无符号数和有符号数均不溢出 二进制相加 无符号数加 有符号数加 0000 1000 8 +8 +0001 1110 + 30 + (+30) 0010 0110 38 +38 结果 38 CF=0 OF=0 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 5
2 无符号数溢出 0000 1000 8 +8 +1111 1101 +253 +(-3) 1 0000 0101 261 +5 结果 5 CF=1 OF=0 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 6
3 有符号数溢出 0000 1000 8 +8 +0111 1101 +125 +(+125) 1000 0101 133 +133 结果 -123 CF=0 OF=1 ( 补码表示 ) 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 7
4 无符号数和有符号数均溢出 1000 1000 136-120 +1111 0111 +247 +(-9) 1 0111 1111 383-129 结果 127 CF=1 OF=1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 8
上面四种情况说明 : CF 标志可用来表示无符号数的溢出 ; OF 标志可用来表示有符号数的溢出 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 9
指令系统提供加 减 乘 除四种基本运算指令, 还有各种调整指令, 见表 3.6 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 10
1. 加法指令 共有 5 条 : ADD/ADC/INC/AAA/DAA 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 11
1) 不带进位的加法指令 ADD 格式 : ADD acc,data ADD mem/reg, data ADD mem/reg1, mem/reg2 ; 不能同时为存储器指令功能 : 目的 源 + 目的 ADD 指令对标志位 ( 指状态标志 ) 有影响 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 12
例 ADD AL,30H ADD AX,[BX+20H] ADD CX,SI ADD [DI],200H ADD AL,COST[BX] ; 将 AL 内容和物理地址 =DS:(COST+BX) 的存储字节 ; 相加, 结果送到 AL 中 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 13
2) 带进位位的加法指令 ADC 格式 : ADC ADC ADC acc, data mem/reg, data mem/reg1, mem/reg2 指令功能 : 目的 源 + 目的 +CF ADD/ADC 操作数 : 它们的源操作数可以是寄存器 存储器或立即数 目的操作数只能用寄存器和存储单元, 存储单元可以为 58 页表 3.2 中所示的 24 种表示方法之一 源和目的操作数不能同时为存储器, 而且它们的类型必须一致, 即都是字节或字 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 14
2) 带进位位的加法指令 ADC 例如 : ADC AL,68H ;AL (AL)+68H+(CF) ADC AX,CX ;AX (AX)+(CX)+(CF) ADC BX,[DI] ;BX (BX)+[DI+1][DI]+(CF) CF 加到那个位置? 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 15
ADD/ADC 对状态标志位 (CF/OF/ZF/SF) 的影响 : SF= ZF= CF= OF= 1 结果为负 0 否则 1 结果为 0 0 否则 1 和的最高有效位有向高位的进位 0 否则 1 两个操作数符号相同, 而结果符号与之相反 0 否则 CF 位表示无符号数加的溢出 OF 位表示带符号数加的溢出 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 16
ADC 指令主要用于多字节加法运算中 例有两个 4 字节的无符号数相加 : 2C 56 F8 AC+30 9E 47 BE=? 设被加数 加数分别存放在 BUFFER1 及 BUFFER2 开始的两个存储区内, 结果放回 BUFFER1 存储区, 如下页图所示 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 17
BUFFER1 BUFFER2 ACH F8H 56H 2CH BEH 47H 9EH 30H... 被加数 加数 数据段 因 CPU 只能进行 8 位或 16 位的加法运算, 为此可将加法分 4(2) 次进行 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 18
程序段如下 : LL: MOV CX,4 ; 置循环次数 MOV SI,0 ; 置 SI 初值为零 CLC ; 清进位标志 CF MOV AL,BUFFER2[SI] ADC BUFFER1[SI],AL ; 带进位加 INC SI ;(SI)+1 DEC CX ;(CX)-1 JNZ LL ; 若 (CX) 0, 则转 LL 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 19
例 试用加法指令对两个 8 位 16 进制数 5EH 和 3CH 求 和, 分析指令执行后对标志位的影响 程序如下 : MOV AL,5EH ;AL=5EH (94) MOV BL,3CH ;BL=3CH (60) ADD AL,BL ; 结果 AL=9AH 相加过程的算式表示 : 0101 1110 + 0011 1100 1001 1010 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 20
运算后的标志位 : ZF=0, 运算结果非 0; AF=1, 低 4 位向高 4 位有进位 ; CF=0,D 7 位没有向前产生进位 C 7 ; SF=1,D 7 =1; PF=1, 结果中有偶数个 1; OF=1, 由两个数以及它们结果的符号决定, 当两个加数符号相同, 而结果的符号与之相反时,OF=1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 21
3) 增量指令 INC( 单操作数指令 ) 格式 :INC opr; 目的操作数, 为 reg/mem 功能 : 类似于 C 语言中的 ++ 操作 : 对指定的操作数加 1 功能 :opr (opr)+1 例 : INC AL INC SI INC BYTE PTR[BX+4]; 须说明数据类型 INC WORD PTR[BX] 注 : 本指令不影响 CF 标志 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 22
2. 减法指令 1) 减法指令 SUB 格式 : SUB dest, src 功能 : dest (dest)-(src) 注 :1. 源和目的操作数不能同时为存储器操作数 2. 立即数不能作为目的操作数 指令例子 : SUB AL, 60H SUB [BX+20H], DX SUB AX, CX 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 23
2) 带借位的减法指令 SBB SBB 指令主要用于多字节的减法 格式 : SBB dest, src 功能 : dest (dest)-(src)-(cf) 指令例子 : SBB AX, CX SBB WORD PTR[SI], 2080H SBB [SI], DX 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 24
例 :x y z 均为 32 位数, 分别存放在地址为 X, X+2;Y,Y+2;Z, Z+2 的存储单元中, 用指令序列实现 w x+y+24-z, 结果放在 W, W+2 单元中 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 25
MOV AX, X MOV DX, X+2 ADD AX, Y ADC DX, Y+2 ; x+y ADD AX, 24 ADC DX, 0 ; x+y+24 SUB AX, Z SBB DX, Z+2 ; x+y+24-z MOV W, AX MOV W+2, DX ; 结果存入 W, W+2 单元 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 26
3) 减量指令 DEC 作用类似于 C 语言中的 -- 操作符 格式 :DEC opr; 目的操作数功能 :opr (opr)-1 ( 不影响 CF 位 ) 指令例子 : DEC CL DEC BYTE PTR[DI+2] DEC SI DEC WORD PTR[BP] ; 堆栈段中位于 [BP ] ; 偏置处的字减 1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 27
4) 取负指令 NEG 格式 : NEG opr 功能 : opr 0-(opr) 对一个操作数取补码相当于用 0 减去此操作数, 故利用 NEG 指令可得到负数的绝对值 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 28
例 : 若 (AL)=0FCH, 则执行 NEG AL 后, (AL)=04H,CF=1 本例中,0FCH 为 -4 的补码, 执行求补指令后, 即得到 4(-4 的绝对值 ) 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 29
SUB/SBB 对标志位 (CF/OF/ZF/SF) 的影响 CF= OF= 1 被减数的最高有效位有向高位的借位 0 否则 1 两个操作数符号相反, 而结果的符号与减数相同 0 否则 CF=1 表示无符号数减法溢出 OF=1 表示带符号数减法溢出 NEG 指令对 CF/OF 的影响 CF: 操作数为 0 时, 求补的结果使 CF=0, 否则 CF=1 OF: 字节运算对 -128 求补或字运算对 -32768 求补时 OF=1, 否则 OF=0 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 30
5) 比较指令 CMP 格式 : CMP dest, src 功能 : (dest)-(src) 执行两个操作数相减, 但结果不送目标操作数, 其结果状态影响标志位 作用 : 主要用在希望比较两个数的大小, 而又不破坏原操作数的场合 指令举例 : CMP AL,0AH CMP CX,SI CMP DI,[BX+03] 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 31
根据标志位来判断 CMP 的结果 1) 根据 ZF 判断两个数是否相等 若 ZF=1, 则两数相等 2) 若两个数不相等 (ZF=0), 则分两种情况考虑 : 1 比较的是两个无符号数若 CF=0( 无借位 ), 则 dest>src; 若 CF=1( 有借位 ), 则 dest<src 2 比较的是两个有符号数若 OF SF=0, 则 dest>src; 若 OF SF=1, 则 dest<src 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 32
比较指令在使用时, 一般在其后紧跟一个条件转移指令, 判断比较结果的转向 举例 : 比较 AL BL CL 中带符号数的大小, 将最小数放在 AL 中 程序 : CMP AL, BL ;AL 和 BL 比较 JNG BBB ; 若 AL BL, 则转 XCHG AL, BL ; 若 AL>BL, 则交换 ; 交换后 AL 存较小值 BBB: CMP AL, CL ;AL 和 CL 比较 JNG CCC ; 若 AL CL, 则转 XCHG AL, CL ; 若 AL>CL, 则交换 CCC: HLT 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 33
3. 乘法指令 乘法时 : 8 位 *8 位 16 位乘积 16 位 *16 位 32 位乘积 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 34
3. 乘法指令 1) 无符号数的乘法指令 MUL 格式 : MUL src ; mem/reg 功能 : 字节操作数 (AX) (AL) (src) 字操作数 (DX, AX) (AX) (src) 隐含寻址 : 被乘数存放 AL/AX 乘积分别存放 AX/DX 和 AX 指令例子 : MUL BL ; (AL) (BL), 乘积在 AX 中 MUL CX ; (AX) (CX), 乘积在 DX( 高 16 位 ),AX( 低 16 位 ) 中 MUL BYTE PTR[BX] 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 35
2) 有符号数乘法指令 IMUL 格式与 MUL 指令类似, 要求两操作数均为有符号数 指令例子 : IMUL BL ;(AX) (AL) (BL) IMUL WORD PTR[SI]; (DX,AX) (AX) ([SI+1][SI]) 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 36
注意 :MUL/IMUL 指令中 AL(AX) 为隐含的乘数寄存器 ; AX(DX,AX) 为隐含的乘积寄存器 ; src 不能为立即数 ; 除 CF 和 OF 外, 对其它标志位无定义 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 37
乘法指令对 CF/OF 的影响 : 标志位的组合状态 MUL 指令 : CF/OF = IMUL 指令 : CF/OF = 00 乘积的高一半为零 11 高一半不为零 00 乘积的高一半是低一半的符号扩展 11 高一半是积的一部分 例 :(AL) = A5H(-5B),(BL) = 11H (1) IMUL BL ; (AX) (AL) (BL) ; A5 11-5B 11= - 060B F9F5 ; (AX) = F9F5H CF=OF=1 (2) MUL BL ; (AX) (AL) (BL) ; A5 11= 0AF5 ; (AX) = 0AF5H CF=OF=1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 38
4. 除法指令 进行除法时 : 16 位 /8 位 8 位商 32 位 /16 位 16 位商 对被除数 商及余数存放有如下规定 : 被除数 商 余数 字节除法 AX AL AH 字除法 DX,AX AX DX 被除数 AX(DX,AX) 是隐含寻址, 商 AL/AX 余 数 AH/DX 也为隐含寻址 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 39
1) 无符号数除法指令 DIV 格式 : DIV src 指令功能 : 对两个无符号二进制数进行除法操作 操作 : 字节操作 :(AL) (AX) / (src) 的商 (AH) (AX) / (src) 的余数字操作 :(AX) (DX, AX) / (src) 的商 (DX) (DX, AX) / (src) 的余数指令例子 : DIV CL DIV WORD PTR[BX] 注 : 若除数为零或 AL 中商大于 FFH( 或 AX 中商大于 FFFFH), 则 CPU 产生一个类型 0( 除法错 ) 的内部中断 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 40
2) 有符号数除法指令 IDIV 格式 : IDIV src 功能与 DIV 类似 商及余数均为有符号数, 且余数符号总是与被除数符号相同 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 41
注意 : 对于 DIV/IDIV 指令 AX(DX,AX) 为隐含的被除数寄存器 AL(AX) 为隐含的商寄存器 AH(DX) 为隐含的余数寄存器 src 不能为立即数 对所有条件标志位均无定义或不确定 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 42
3) 字节 / 字 字 / 双字转换指令 格式 : CBW CWD ; 把 AL 的符号位 (D7) 复制到 AH ; 把 AX 的符号位 (D15) 复制到 DX 用途 : 用于有符号数的除法 指令执行后不影响标志位 例如 :(AL) = A7H, 则执行 CBW 后,AH 的内容为 FFH (AL)=1010 0111 (AH)=1111 1111 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 43
关于除法操作中的字长扩展问题 除法运算要求被除数字长是除数字长的两倍, 若不满足则需对被除数进行扩展, 否则产生错误 对于无符号数除法扩展, 只需将 AH 或 DX 清零即可 对有符号数而言, 则是符号位的扩展 可使用前面介绍过的符号扩展指令 CBW 和 CWD 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 44
例 : 写出 34H 25H 的程序段 MOV AL, 34H MOV BL, 25H CBW ; AL 的符号扩展到 AH IDIV BL ; 0034H 25H, 结果为 ; 余数 (AH)=0FH, 商 (AL)=01H 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 45
5.BCD 码运算的十进制调整指令 专用于对 BCD 码运算的结果进行调整包括 :AAA DAA AAS DAS AAM AAD 均为隐含寻址, 隐含的操作数为 AL 和 AH 为何要对 BCD 码的运算结果进行调整? 因为,BCD 码 ( 包括 ASCII 码 ) 本质上是十进制数, 即应遵循逢十进一的规则 计算机是按二进制 ( 十六进制 ) 进行运算, 并不按十进制规则进行运算 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 46
1) 加法的二进制 - 十进制调整指令 (1) 非压缩 BCD 码加法调整 AAA 指令格式 :AAA 功能 : 本指令对由两个非压缩 BCD( 或 ASCII) 码操作数相加后在 AL( 隐含寻址 ) 中的结果进行调整, 得到一个正确的非压缩 BCD 码 进位调整到 AH( 隐含寻址 ) 中 AAA 指令只影响 AF 和 CF, 其余标志无定义 AAA 指令一般应紧跟在 ADD 或 ADC 指令之后 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 47
AAA 指令的操作如下 : 如果 AL 的低 4 位 >9 或 AF=1, 则 : 1 AL (AL)+6 2 AL ((AL) 0FH) 3 AF 1,CF AF,AH AF 否则 (AL 的低 4 位 9 或 AF=0): AL (AL) 0FH, 即 AL 高 4 位清 0 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 48
调整原理 : 先看一个例子计算 8+9 0000 1000 见右式 +0000 1001 计算机按二进制加, 故 0001 0001 这个 1 代表了 2 进制的 16, 而实际上如果按压缩 BCD 计算仅应代表 10, 即多进了 6 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 49
AAA 实际上当低 4 位的结果 >9( 即 A~F 之间 ) 时, 也应进行加 6 调整 ( 原因是逢十没有进位, 故 用加 6 的方法强行产生进位 ) 如对上例的结果进行加 6: 0001 0001 11 1 + 0000 0110 6 0001 0111 17 AX=0107H 0000 1111 2 3 0000 0001 0000 0111 AH AL 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 50
例 2: 有两个字符串形式的十进制数,5678 和 6789, 求二者之和 即 5678+6789=? 由题意知, 被加数和加数的每一位都以 ASCII 码形式存放在内存中 假定二数在内存中均是低位在前, 高位在后, 另留出 5 个字节单元存放相加的结果 内存中数据存放形式见下页图 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 51
STRING1 38H 37H 36H 35H 8 7 6 5 被加数 STRING2...... 39H 38H 37H 36H 9 8 7 6 加数 数据段 SUM 结果 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 52
程序, 为 : LEA SI,STRING1 ;STRING1 偏移地址送 SI LEA DI,STRING2 ;STRING2 偏移地址送 DI LEA BX,SUM ;SUM 偏移地址送 BX MOV CX,4 ; 循环 4 次 CLC ; 清进位标志 AGAIN:MOV AL,[SI] ADC AL,[DI] ; 带进位加 AAA ; 非压缩 BCD 码调正 MOV [BX],AL ; 结果存入 SUM INC SI ; 调整指针 INC DI INC BX DEC CX ; 循环计数器减 1 JNZ AGAIN ; 若未处理完, 则转 AGAIN 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 53
课堂作业 为什么 AAA 指令既可对非压缩 BCD 码加法进行调整, 也可对 ASCII 码形式的十进制数进行调整? 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 54
(2) 压缩 BCD 码加法二 - 十进制调整 DAA 指令格式 : DAA 指令功能 : 对两个压缩 BCD 数相加后的结果 ( 已在 AL 中 ) 进行调整 两个压缩 BCD 码相加结果在 AL 中, 通过 DAA 调整得到一个正确的压缩 BCD 码 指令操作 ( 调整方法 ): 若 AL 的低 4 位 >9 AF=1 则 (AL) (AL)+6,AF 1 若 AL 的高 4 位 >9 CF=1 则 (AL) (AL)+60H,CF 1( 否则置 0) 除 OF 外,DAA 指令影响所有其它标志 DAA 指令一般应紧跟在 ADD 或 ADC 指令之后 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 55
例 : 0100 1000 48H MOV AL,48H + 0111 0100 74H MOV BL,74H 1011 1100 BCH ADD AL,BL DAA + 0110 0110 + 66H 1 0010 0010 1 22H BCD ( 进位 ) 执行 ADD 后,(AL)=BCH, 高 4 位低 4 位均大于 9, 故 DAA 指令执行加 66H 调整, 最后结果为 : (AL)=22H, CF=1, AF=1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 56
2) 减法的二进制 - 十进制调整指令 (1) 非压缩 BCD 码减法的十进制调整指令 AAS 指令格式 : AAS 指令功能 : 在用 SUB 或 SBB 指令, 对两个非压缩 BCD(ASCII) 数表示的十进制数相减后, 对 AL 中所得结果进行调整, 如有借位, 则 CF 置 1 调整操作为 : 若 AL 的低 4 位 >9 或 AF=1, 则 : 1 AL (AL)-6,AF 1 2 AL (AL) 0FH 3 AH (AH)-1,CF AF 否则 :AL (AL) 0FH 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 57
举例 :16-8=? MOV AX,0106H 0000 0110 06? MOV BL,08H - 0000 1000-08 SUB AL,BL 1111 1110 FE AAS - 0000 0110-06 1111 1000 F8 0000 1111 0F 0000 1000 08 结果为 :(AL)=08H,(AH)=0,CF=AF=1 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 58
(2) 压缩 BCD 码减法的二进制 - 十进制调整指令 DAS 指令格式 : DAS 指令功能 : 在用 SUB 或 SBB 指令, 对两个压缩 BCD 数相减 ( 结果已存在 AL 中 ) 后, 进行调整 DAS 对 OF 无定义, 但影响其余标志位 同样, 它也要对 AL 中高半字节和低半字节分别进行调整 调整操作为 : 若 AL 的低 4 位 >9 AF=1, 则 : AL (AL)-6, AF 1 若 AL 的高 4 位 >9 CF=1, 则 : AL (AL)-60H,CF 1 不举例, 可见教材例,p77 例 3.55 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 59
3) 乘法的二进制 十进制调整指令 AAM 指令格式 : AAM 指令功能 : 对存于 AL 的两个非压缩 BCD 数相乘的积进行调整, 结果在 AX 中, 高位放 AH, 低位在 AL 如果两个 ASCII 码数相乘之前, 应先屏蔽掉每个数的高半字节, 即高半字节清零 调整操作为 : (AL)/0AH, (AH) 商,(AL) 余数 隐含的操作寄存器为 AL 和 AH; AAM 跟在 MUL 指令之后使用 ; 影响标志位 PF SF ZF, 其它无定义 ; 用 AAM 可实现 99 的二 十进制转换 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 60
例 1: 按十进制乘法计算 7 8=? 程序段如下 : MOV AL,07H ;(AL)=07H MOV CL,08H ;(CL)=08H MUL CL ;(AX)=0038H AAM ;(AH)=05H,(AL)=06H 所得结果为非压缩的 BCD 码 例 2: 把 3AH 转换成等值的十进制数 MOV AL,3AH ;58 AAM ; (AH)=05H,(AL)=08H 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 61
4) 除法的十进制 - 二进制调整指令 AAD 指令格式 :AAD 指令功能 : 在做除法前把 BCD(ASCII) 码转换成二进制数 对非压缩 BCD 除法运算进行二进制调整 调整操作为 : (AL) (AH) 0AH+(AL) AH 00H 隐含的操作寄存器为 AH,AL; AAD 要在 DIV 指令之前使用 ; 影响标志位 PF SF ZF, 其它无定义 ; 用 AAD 可实现 99 的十 - 二进制转换 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 62
例 1: 按十进制除法计算 55 7=? 程序段如下 : MOV AX, 0505H ;(AX)=55 BCD MOV CL, 07H ;(CL)= 7 AAD ;(AX)=0037H, 即 55 的 16 进制数 DIV CL ; 余数 (AH)=6, 商 (AL)=7 所得结果为非压缩的 BCD 码 ( 商 7 余 6) 例 2: 把 73 转换成等值的二进制数 MOV AX, 0703H ;(AX)= 73 BCD AAD ;(AX)= 0049H, 即 73 的 16 进制数 2015 年 3 月 26 日星期四 11 时 3 分 17 秒 63