汇编语言-8086指令(上)

数据传送指令

汇编语言中字母开头通常表示标识符(如常量、变量、标号),所以MASM规定十六进制数如果以字母开头需要添加前导0。

当目的操作数是存储单元,而源操作数既可以是字又可以是字节时,必须显式指明字节传送还是字传送,btye ptr or word ptr。

不允许段寄存器和段寄存器、段寄存器和立即数、以及存储单元和存储单元之间的数据传送,CS寄存器通过数据传送进行修改。

目的操作数和源操作数的类型必须一致。

 

通用数据传送指令

传送指令Mov

mov reg/mem, imm ; 立即数传送
mov reg/mem/seg reg ; 寄存器传送
mov reg/seg mem ; 存储单元传送
mov reg/mem seg ; 段寄存器传送

 

交换指令XCHG

xchg reg, reg/mem
xchg reg/mem

 

换码指令XLAT

bx指定段地址,al指定偏移地址,[bx + al]的数据存储在al中

xlat label ; 和第二种写法的效果是一样的,只不过这个可以明确说明缓冲区所在逻辑段的位置
xlat ; al<-ds:[bx + al]

 

堆栈操作指令

进栈指令PUSH

进栈指令先使堆栈指针(sp)减2,然后将一个字操作数存入堆栈顶部。(小端存储)

push r16/m16/seg 

 

出栈指令POP

出栈指令先将一个数传送至目的操作数,然后将堆栈指针(sp)加2

pop r16/m16/seg

 

堆栈基址指针bp默认与堆栈段寄存器ss配合,利用堆栈可以实现主、子程序传递参数、现场的保护和恢复以及其它汇编指令的实现等等。

 

标志传送指令

标志送AH指令LAHF

将状态标志位传送至AH

lahf

 

AH送标志指令SAHF

将AH传送至状态标志位

sahf

 

标志进栈指令PUSHF

堆栈指针sp减2,将状态标志位传送入栈中

pushf

 

标志出栈指令POPF

将栈顶字单元传送入标志寄存器,堆栈指针sp加2

popf

 

标志位操作指令

cl:复位,复0

st:置位,置1

; cf 进位标识
clc
stc
; df 方向标识
cld
std
; if 中断标识
cli
sti

 

地址传送指令

有效地址传送指令LEA

有效地址:ea

lea指令将存储单元的有效地址ea传送到指定寄存器

lea r16, mem

 

指针传送指令

LDS、LES指令分别将主存中mem指定的字送至R16,再将mem的下一个字送到ds或es。

其中si的默认段寄存器为ds(ds:si),di的默认段寄存器为es(es:di)

lds r16 mem
les r16 mem

 

算术运算类指令

状态标志

进位标志CF(Carry Flag)

无符号数加减运算结果的最高有效位有进位(加法)或借位(减法)时,CF=1;若没有,则CF=0。

 

溢出标志OF(Overflow Flag)

回忆:补码的加减运算

X(补)+ Y(补)= (X + Y)补

X(补)+ Y(变补)= (X - Y)补

变补:连同符号位取反加一

有符号数加减结果超出范围时,OF=1;若没有,则OF=0。

 

零标志ZF(Zero Flag)

运算结果为零时,ZF=1;若不为零,则ZF=0。

 

符号标志SF(Sign Flag)

运算结果的最高位为1时,SF=1;若最高位为0,则SF=0。

 

奇偶标志(Parity Flag)

最低八位的运算结果中,1的个数为偶数或零时,PF=1;若1的个数为奇数,则PF=0。

 

加法指令

加法指令ADD

源操作数和目的操作数相加,结果送到目的操作数

add reg, imm/reg/mem
add word/byte ptr mem imm/reg

 

带进位加法指令ADC

源操作数和目的操作数相加再加CF,结果送到目的操作数

adc reg, imm/reg/mem
adc word/ptr mem, imm/reg

实现无符号双字加法运算,默认ax低位,dx存高位,合计32位

mov ax, 4652h ; ax = 4652h
add ax, 0f0f0h ; ax = 3742h, cf = 1
mov dx, 0234h ; dx = 0234h
adc dx, 0f0f0h ; dx = f325h, cf = 0

 

增量指令INC

操作数自增1

inc reg
inc byte/word ptr mem

 

减法指令

减法指令SUB

源操作数和目的操作数相减,结果送到目的操作数

sub reg, imm/reg/mem
sub byte/word ptr mem, imm/reg

 

带借位减法指令SBB

源操作数和目的操作数相加再减CF,结果送到目的操作数

adc reg, imm/reg/mem
adc word/ptr mem, imm/reg

 

减量指令DEC

操作数自减

dec reg
dec byte/word ptr mem

 

求补指令NEG

对操作数进行求补运算,对于计算机而言,即用零减去操作数;对于人而言,即操作数取反加1。

neg reg
neg byte/word ptr mem

 

比较指令CMP

与减法指令基本相同,不同点是它不会把结果返回给目的操作数。

cmp reg, imm/reg/mem
cmp byte/word ptr imm/reg

比较AL是否大于100

cmp al, 100 
jb below ; al < 100, 跳转到below
jump else ; al >= 100, 跳转到else

 

乘法指令MUL/IMUL

无符号数乘法指令MUL,有符号数乘法指令IMUL。

乘法指令隐含使用一个操作数,它寄存在AX寄存器中。

若字节量相乘,则结果传入AX中,而如果AX中高八位不为零,则OF=CF=1;若字量相乘,则高位传入DX,低位传入AX,若DX不为零,则OF=CF=1;

mul/imul byte/word ptr mem/reg

 

除法指令DIV/IDIV

无符号数除法指令DIV,有符号数除法指令IDIV。

除法指令隐含使用一个操作数(被除数),它寄存在AX中。

先存商,在再存余数。如果除数是字节量,则商传入AL,余数传入AH;如果除数是字,则商传入AX,余数传入DX。

如果除法产生溢出,被除数远大于除数或者除数为0,则发生除法溢出,引发编号为0的内部中断。

div/idiv byte/word ptr mem/reg

 

符号扩展指令CBW/CWD

CBW:将AL的最高有效位D7拓展至AH,即假如AL的最高有效位(符号位)为0,则AH=00H;假如AL的最高有效位(符号位)为1,则AH=FFH。

CWD:将AX的最高有效位D15拓展至DX,即假如AX的最高有效位(符号位)为0,则DX=0000H;假如AX的最高有效位(符号位)为1,则DX=FFFFH。

cbw
cwd

例如:有符号数AX/BX

cwd
idiv bx

 

十进制调整指令

什么是压缩BCD码,什么是非压缩BCD码?

压缩BCD码:4个二进制位表示一个十进制位,1个字节可以表示两个十进制位,即00-99。

非压缩BCD码:8个二进制位表示一个十进制位,实际上只是用低四个二进制位表示一个十进制0-9,高四位任意,但通常默认为0。

 

非压缩BCD码也有对应的调整指令,但比较多,放弃了,不做记录。

 

压缩BCD码调整指令

DAA:跟在以AL为目的操作数的ADD或ADC指令后,对AL的二进制结果进行十进制调整。

DAS:跟在以AL为目的操作数的SUB或SBB指令后,对AL的二进制结果进行十进制调整

daa
das

例如:已知AX=1234H,BX=4612H,计算1234-4612的差

sub al, bl
das
xchg al, ah
sbb al, bh
das
xchg al, ah
 

 

posted @ 2022-10-28 09:52  LimeCoder  阅读(639)  评论(1)    收藏  举报