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码加法:68+28=96
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-28=40
- 非压缩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=08h×09h=0048h
aam
;十进制调整:ax=0702h
;实现非压缩BCD码乘法:8×9=72
2.AAD指令举例
mov ax,0608h
;ax=0608h,非压缩BCD码表示真值68
mov bl,09h
;bl=09h,非压缩BCD码表示真值9
aad
;二进制扩展:ax=68=0044h
div bl
;除法运算:商al=07h,余数ah=05h
;实现非压缩BCD码除法:
68÷9=7(余5)