数据传送指令
汇编语言中字母开头通常表示标识符(如常量、变量、标号),所以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
标签:8086,传送,汇编语言,操作数,ptr,mem,指令,reg From: https://www.cnblogs.com/LimeCoder/p/16834839.html