0%

8086指令基础 - 位操作指令

最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。

运行环境:

  • 操作系统: Windows 10家庭版
  • 编译器:Windows XP Debug

位操作指令

符号扩展

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

  • 对于数据64H(表示数据100),起最高位D7为0,符号扩展后高八位都是0,成为0064H
  • 对于数据FF00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为FFFFFF0H(仍表示有符号数-256)

CBW(BYTE-WORD)

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

CWD(WORD-DWORD)

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

demo:

1
2
3
4
5
6
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

十进制调整指令

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

压缩BCD码

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

非压缩BDC码

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

BCD码

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

真值 8 64
二进制编码 08H 40H
压缩BCD码 08H 64H
非压缩BCD码 08H 0604H

压缩BCD码加、减调整指令

1
2
3
4
5
6
7
8
9
10
(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为目的操作数的加法或减法指令

DAS实现十进制调整

1
2
3
4
5
6
7
8
9
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