16位汇编第七讲----8086指令集(3)

时间:2022-10-02 00:44:54

0x00 符号拓展指令

 CBW
;AL的符号扩展至AH
;如AL的最高有效位是0,则AH=00
;AL的最高有效位为1,则AH=FFH。AL不变
CWD 
;AX的符号扩展至DX
;如AX的最高有效位是0,则DX=00
;AX的最高有效位为1,则DX=FFFFH。AX不变

符号扩展的概念
符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。符号扩展不改变数据大小

对于数据ff00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

mov al,80h  ;al=80h
cbw ;ax=ff80h
add al,255 ;al=7fh
cbw ;ax=007fh
cwd ;DX.AX←AX
idiv bx ;AX←DX.AX÷BX

0x01 十进制调整指令

十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果分成压缩BCD码和非压缩BCD码调整

  • 压缩BCD码

压缩BCD码就是通常的8421码;它用4个二进制位表示一个十进
制位,一个字节可以表示两个十进制位,即00~99

  • 非压缩BCD码

非压缩BCD码用8个二进制位表示一个十进制位,只用低4个二进
制位表示一个十进制位0~9,高4位任意,通常默认为0

  • BCD码

二进制编码的十进制数:一位十进制数用4位二进制编码来表示 8086支持压缩BCD码和非压缩BCD码的调整运算

真值 8 64
二进制编码 08H 40H
压缩BCD码 08H 64H
非压缩BCD码 08H 0604H
  • 压缩BCD码加、减调整指令
ADD AL,i8/r8/m8)
ADC AL,i8/r8/m8)
DAA
;AL←将AL的加和调整为压缩BCD码
SUB AL,i8/r8/m8)
(SBB AL,i8/r8/m8)
DAS
;AL←将AL的减差调整为压缩BCD码

使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令

举例:
1.DAA实现十进制调整

mov al,68h
;al=68h,压缩BCD码表示真值68
mov bl,28h
;bl=28h,压缩BCD码表示真值28
add al,bl
;二进制加法:al=68h+28h=90h
daa
;十进制调整:al=96h
;实现压缩BCD码加法:682896

2.DAS实现十进制调整

mov al,68h
;al=68h,压缩BCD码表示真值68
mov bl,28h
;bl=28h,压缩BCD码表示真值28
sub al,bl
;二进制减法:al=68h-28h=40h
das
;十进制调整:al=40h
;实现压缩BCD码加法:68-2840
  • 非压缩BCD码乘、除调整指令
MUL r8/m8)
AAM
;AX←将AX的乘积调整为非压缩BCD码
(DIV r8/m8)
AAD
;AX←将AX中非压缩BCD码扩展成二进制数

用法:

1.AAM指令跟在字节乘MUL之后,将乘积调整为非压缩BCD码
2.AAD指令跟在字节除DIV之前,先将非压缩BCD码的被除数调整为二进制数
3.AAM和AAD指令根据结果设置SF、ZF和PF,但对OF、CF和AF无定义

举例:
1.AAM指令举例

mov ax,0608h
;ax=0608h,非压缩BCD码表示真值68
mov bl,09h
;bl=09h,非压缩BCD码表示真值9
mul bl
;二进制乘法:al=0809h=0048h
aam
;十进制调整:ax=0702h
;实现非压缩BCD码乘法:8×972

2.AAD指令举例

mov ax,0608h
;ax=0608h,非压缩BCD码表示真值68
mov bl,09h
;bl=09h,非压缩BCD码表示真值9
aad
;二进制扩展:ax=680044h
div bl
;除法运算:商al=07h,余数ah=05h
;实现非压缩BCD码除法:
68÷97(余5