80X86指令总结

一、数据传送指令

指令名称

汇编语句格式

功能

影响标志位

传送
move data
mov opd, ops (ops) → opd;分为主存储器、通用寄存器、段寄存器,不可同时使用主存储器,类型要匹配:byte,word,dword
带符号扩充的传送
move with sign-extend
movsx opd, ops 将ops的符号向前扩展成与opd相同的数据类型后 → opd
ops不能为立即数,
带0扩展的传送
move with zero-extend
movzx opd, ops 将ops的高位向前补0扩展成与opd相同的数据类型后 → opd
数据交换
exchange
xchg opd, ops 将(opd)与(ops)交换
源操作数不能是立即操作数
32位寄存器字节交换
byte swap
bswap reg
(reg,代表寄存器,下同)
将从第一个与第四个字节交换,将第二个字节和第三个字节交换
(按字节反序),32位寄存器
交换并相加
exchange and add
xadd opd, ops 将(opd)与(ops)互换,(opd)+(ops) → opd af,of,pf,
sf,zf,cf
查表转换
table look-up translation
xlat ops 或 xlatb (ds:[bx/ebx+al]) → al (求和之前al作无符号扩展),
一般把数表的首地址放到bx/ebx中,lea bx, buf  ;al就是在buf中的位置
传送偏移地址
load effective address
lea reg,ops ops → reg
传送偏移地址和数据段首地址
load data segment register
lds reg, ops (ops)→ reg  
(ops+2/4)→ ds;ops一定是存储器地址,类型为dword/fword
传送偏移地址和附加段首地址
load far pointer to extra segment
les/lfs/lgs reg, ops 同上,只是段寄存器分别为es,fs,gs
传送偏移地址和堆栈首地址
load stack segment
lss reg, ops 同上,段寄存器为ss
进栈
push word/dword onto stack
push ops
pushw ops 或pushd ops
16位段:(sp) – 2/4 → sp    (ops) → [sp]; 可以为两个字节,
或四个字节32位段:(esp) – 2/4 → esp  (ops) → [esp]; 同上
所有16位通用寄存器进栈
pushall 16-bit general registers
pusha (sp/esp) –2 → sp/esp 重复8次压入ax,cx,dx,bx,sp(指令执前),bp,si,di;是先改变sp/esp 再把数据写入
所有32位通用寄存器进栈
pushall 32-bit general registers
pushad (sp/esp) – 4 → sp/esp 重复8次压入eax,ecx,edx,ebx,
esp(指令执行前),ebp,esi,edi;是先改变sp/esp 再把数据写入
出栈
pop a word/dword frome the stack
pop opd 16位段:[sp]→ (opd) ; (sp) + 2/4 → sp   ;可以为两个字节,或四个字节
32位段:[esp]→ (opd) ; (esp) + 2/4 → esp ;  同上
出栈到所有16位通用寄存器
pop stack into all 16-bit registers
popa 将栈顶的16个字节依次出栈到di,si,bp,丢弃2个字节,bx,dx,cx,ax,
(sp/esp)+16 → sp/esp  
出栈到所有32位通用寄存器
pop stack into all 32-bit registers
popad 将栈顶的16个字节依次出栈到edi,esi,ebp,丢弃4个字节,ebx,edx,ecx,eax,
(sp/esp)+32 → sp/esp  
标志进栈
push flags onto stack
pushf (sp/esp) – 2 → sp/esp
(flags) → [sp/esp]
扩展标志出栈
push eflags onto stack
pushfd sp/esp – 4 → sp/esp
(eflags) → [sp/esp]
标志出栈
pop stack into flags
popf [sp/esp] → flags
sp/esp + 4 → sp/esp
扩展标志出栈
pop stack into eflags
popfd [sp/esp] → eflags
sp/esp + 4 → sp/esp
标志传送到ah
load ah from flags
lahf (flags7-0) →  ah
将ah传送到flags
store ah into flags
sahf (ah) → flags7-0 sf,zf,af,pf,cf
输入
input from port
in opd, ops ([ops]) →  opd;
opd只能是al、ax、eax;ops为立即数(<255)或者dx
输出
output to port
out opd, ops (ops) → [opd];
ops只能是al、ax、eax;opd为立即数(<255)或者dx

二、算术运算指令

指令名称

汇编语句格式

功能

影响标志位

加 1
increment
inc opd (opd) + 1 → opd af,of,pf,
sf,zf

addition
add opd, ops (opd) + (ops) → opd af,of,pf,
sf,zf
带进位加
add with carry
adc opd, ops (opd) + (ops) + cf → opd af,of,pf,
sf,zf
减 1
decrement
dec opd (opd) – 1 → opd af,of,pf,
sf,zf
求补
two's complement negation
neg opd 0 – (opd) → opd af,of,pf,
sf,zf

subtract
sub opd, ops (opd) – (ops) → opd af,of,pf,
sf,zf
带借位减
subtract with borrow
sbb opd, ops (opd) – (ops) – cf → opd af,of,pf,
sf,zf
比较
compare
cmp opd, ops (opd) – (ops)
一般用于转移前的控制,应用于跳转
af,of,pf,
sf,zf
无符号乘
unsigned multiply
mul ops 字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
双字乘:(eax) * (ops) → edx:eax
cf,of
单操作数的有符号乘
signed integer multiply
imul ops 字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
双字乘:(eax) * (ops) → edx:eax
cf,of
双操作数的有符号乘
signed integer multiply
imul opd, ops (opd) * (ops) → opd;opd可为16/32的寄存器,ops可为同类型的寄存器、存储器或立即数 cf,of
三操作数的有符号乘
signed integer multiply
imul opd, ops, n (ops) * n → opd;同上,n为立即数 cf,of
将字节转换成字
convert byte to word
cbw 将al中的符号扩展到ah中,数据的补码数值没有变
将字转换成双字
convert word to double word
cwd 将ax中的符号扩展到dx的高位中
将字转换成双字
convert word to double word
cwde 将ax中的符号扩展到eax的高位中
将双字转换成4字
convert double word to quadword
cdq 将eax中的符号扩展到edx中
无符号除
unsigned divide
div ops 字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商),
dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数)
af,of,pf,
cf,sf,zf
有符号除
signed integer divide
idiv ops 字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商),
dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数)
af,of,pf,
cf,sf,zf

三、控制转移指令

指令名称

汇编语句格式

功能

影响标志位

相等/等于0转移
jump if equal/zero
je/jz 标号 zf = 1 转移
不相等/不等于0转移
jump if not equal/zero
jne/jnz 标号 zf = 0 转移
为负转移
jump if sign
js 标号 sf = 1 转移
为正转移
jump if positive
jns 标号 sf = 0 转移
溢出转移
jump if overflow
jo 标号 of = 1 转移
无溢出转移
jump if not overflow
jno 标号 of = 0 转移
有进位转移
jump if carry
jc 标号 cf = 1 转移
无进位转移
jump if not carry
jnc 标号 cf = 0 转移
偶检验/偶性转移
jump if parity/parity even
jp/jpe 标号 pf = 1 转移
奇检验/奇性转移
jump if no parity/parity odd
jnp/jpo 标号 pf = 0 转移
小于/不大于也不等于 转移
jump if less/not greater nor equal
jl/jnge 标号 sf ≠ of 转移
不小于/大于或等于转移
jump if not less/greater or equal
jnl/jge 标号 sf = of 转移
大于/不小于或不等于转移
jump if greater/not less or not equal
jg/jnle 标号 sf = of, 且zf = 0 转移
不大于/小于或等于转移
jump if not greater /less or equal
jng/jle 标号 sf ≠ of 或zf =  1 转移
低于/不高于且不等于转移(无符号)
jump if below/not above not equal
jb/jnae 标号 cf = 1 转移
不低于/高于或等于转移(无符号)
jump if now below/above or equal
jnb/jae 标号 cf = 0 转移
高于/不低于且比等于转移(无符号)
jump if above/not below nor equal
ja/jnbe 标号 cf = 0 且 zf = 0 转移
不高于/低于或等于
jump if not above/below or equal
jna/jbe 标号 cf = 1 或 zf =1 转移
无条件转移
jump unconditionally
jmp opd 相对转移:(opd)+ip/eip → ip/eip 近转移:(opd) → ip/eip
远转移:(opd) → ip/eip, (opd+2/4) → cs,或根据描述符决定
cx为0转移
jump if cx is zero
jcxz 标号
或jecxz 标号
若(cx/ecx) = 0 转移
循环
loop
loop 标号
或loopw/loopd 标号
(cx/ecx) – 1 → cx/ecx, 若(cx/ecx) ≠ 0 则转移
相等/为0循环
loop if equal/zero
loope/loopz 标号 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 1 则转移
不相等/不为0循环
loop if not equal/not zero
loopne/loopnz 标号 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 0 则转移
检查数组下标边界
check array index against bounds
bound reg, ops 若reg的索引值小于ops指定的下边界或大于ops指定的上边界,则变成5号异常
调用子程序
call a procedure
call opd 调用opd所指定的子程序(32位段的远调用时,CS被扩展成4字节后压栈) 任务切换有影响,否则无
从子程序返回
return from procedure
ret [n]
n代表16位常量,[]表可选
从子程序返回到调用语句的下一个语句处,若n存在,则(sp/esp)+n → sp/esp;32位段远返回时,cs出栈时改变4字节的栈指针
中断调用
interrupt
int n (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值 0→tf,if,返回时复原
溢出中断
interrupt if overflow
into (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值;of=1时产生int 4 0→tf,if,返回时复原
中断返回
interrupt return
iret 或iretd(32位段)
或iretf
ip出栈,cs出栈,flags/eflags出栈,根据nt标志做相应的处理 都有影响

四、串操作指令

指令名称

汇编语句格式

功能

影响标志位

串传送
move byte/word string
movs opd, ops
movsb,movsw,movsd
(ds:[si/esi]) → es:[di/edi],(ops所在的段可以取代ds),(si/esi)±1/2/4 → si/esi, (di/edi)±1/2/4 → di/edi
串比较
compare string
cmps ops, opd
cmpsb,compsw,compsd
(ds:[si/esi]) – (es:[di/edi]),(si/esi)±1/2/4 → si/esi,
(di/edi)±1/2/4 →di/edi
af,cf,of,pf,
sf,zf
串搜索
scan string
scas opd
scasb,scasw,scasd
(al/ax/eax) – (es:[di/edi]),(di/edi)±1/2/4 →di/edi af,cf,of,pf,
sf,zf
取字符串
load string
lods ops
lodsb, lodsw,lodsd
(ds:[si/esi]) → al/ax/eax,(ops所在的段可以取代ds),
(si/esi)±1/2/4 →si/esi
存字符串
store string
stos opd
stosb,stosw,stosd
(al/ax/eax)→es:[di/edi],(di/edi)±1/2/4 →di/edi
输入串
input from port to string
ins opd, dx
insb,insw,insd
([dx]) →es:[di/edi],(di/edi)±1/2/4 →di/edi
输出串
output string port
outs opd, ops
outsb,outsw,outsd
(ds:[si/esi])→[dx],(si/esi)±1/2/4 →si/esi
重复前缀
repeat string operation
rep 串操作指令
repe/repz 串操作指令
repne/repnz 串操作指令
若(cx/ecx) ≠ 0,执行一个串操作,(cx/ecx)-1→cx/ecx,返回再做
若(cx/ecx) ≠ 0且zf=1,执行一次串操作,(cx/ecx)-1→cx/ecx,返回
若(cx/ecx) ≠ 0且zf=0,执行一次串操作,(cx/ecx)-1→cx/ecx,返回

五、位操作指令

指令名称

汇编语句格式

功能

影响标志位

求反
one's complement negation
not opd ▁▁▁▁▁
(opd)→opd
逻辑乘
and
and opd, ops (opd)∧(ops)→opd pf,sf
位测试
bit test
bt opd, ops 将(ops)作为位偏移(0~31)指明的opd对应位的值→CF cf
位测试并求补
bit test and complement
btc opd, ops 在bt指令的基础上,将opd的对应位求反后→opd cf
位测试并清0
bit test and reset
btr opd, ops 在bt指令的基础上,将0→opd的对应位 cf
位测试并置1
bit test and set
bts opd, ops 在bt指令的基础上,将1→opd的对应位 cf
正向位扫描
bit scan forward
bsf reg, ops 从0位开始扫描ops各位,若均为0,则zf=1,否则将第一个为1的位置值
→reg,zf=0
zf
反向位扫描
bit scan reverse
bsr reg, ops 从最高位开始扫描ops各位,若均为0,则zf=1,否则,将首先碰到的为1的位置值→reg,zf=0 zf
测试
test
test opd, ops (ops)∧(opd) sf,zf,pf;
0→of,cf
逻辑加
inclusive or
or opd, ops (opd)∨(ops)→opd sf,zf,pf;
0→of,cf
按位加
exclusive or
xor opd, ops 加法,就是用异或的计算方法了 sf,zf,pf;
0→of,cf
算术左移
shift arithmetic left
sal opd, 1 ;sal opd, cl;
sal opd, 8位立即数
cf中的值是最后移入位的值 sf,zf,pf,cf
逻辑左移
shift logic left
shl opd, 1; shl opd, cl
shl opd, 8位立即数
cf中的值是最后移入位的值 sf,zf,pf,cf
双精度左移
double precision shift left
shld opd, reg,八位立即数
shld opd, reg, cl
将reg的最高n位移入opd的低n位中,reg保持不变,opd最后移入的一位保存在cf中 cf,sf,zf,pf
算术右移
shift arithmetic rigtht
sar opd,1; sar opd, cl
sar opd, 8位立即数
将(opd)向右移动n个指定的次数且最高位保持不变,cf的内容为最后移入位的值 sf,zf,pf,cf
逻辑右移
shift logical right
shr opd, 1; shr opd cl
shr opd, 8位立即数
将(opd)向右移动n规定的次数,最高位补入0,cf的内容为最后移入位的值 sf,zf,pf,cf
双精度右移
double precision shift right
shrd opd, reg,8位立即数
shrd opd, reg, cl
将reg的最低n位移入opd高n位中,reg保持不变,opd最后移出的一位保存在cf中 cf,sf,zf,pf
循环右移
rotate rigth
ror opd, 1; ror opd cl
ror opd, 8位立即数
将目的操作数的最高位和最低位连接起来,组成一个环,将环中的所有位一起向右移动n位规定的数目(cl或立即数确定),cf为最后移入位的值 cf
循环左移
rotate left
rol opd,1; rol opd cl
rol opd, 8位立即数
同上,向左移动 cf
带进位的循环右移
rotate right through carry
rcr opd, 1; rcr opd, cl
rcr opd, 8位立即数
cf在最低位,与目的操作数连成环,移动 cf
带进位的循环左移
rotate left through carry
rcl opd, 1; rcl opd, cl
rcl opd, 8位立即数
cf在最高位,与目的操作数连成环,移动指定的位数 cf

六、寻址方式

寻址方式

格式

功能

实例

寄存器寻址 R 寄存器R的内容就是操作数(R是任意寄存器个别指令的限制除外)
R可以是ax,bx,cx,dx,cs,ds,ss,es…….
inc bx
寄存器间接寻址 [R]
SS:[R]; 堆栈段
DS:[R]; 数据段
操作数在主存储器中,而操作数的偏移地址EA在指明的寄存器中
16位:只能是bx,bp,si,di
32位:通用寄存器(eax,ebx,ecx,edx,edi,esi,ebp,esp)
未指明段时,bp,ebp,esp为堆栈段,其余是数据段
mov a, [si]
mov cx, [ebp]
变址寻址 16位:[R+V],[R]+V,V[R]
32位:[R*F+V],
[R*F]+V,V[R*F]
操作数在主存储器中,偏移地址EA在指定寄存器R的内容乘以比例因子F与给出位移量V的和。
位移量V是不超过16位或不超过32位的二进制补码表示的有符号数(立即数),也可以是符合语法规则的数值表达式变量标号,
最后计算的偏移量是无符号数,
未明确段时,规则如上
mov al, [ebx*2]+5
add –2[bp], ax
mov 2*10h[si]

基址加变址寻址 16位:[bx/bp+si/di+V]
        V[bx/bp][si/di]
        V[bx/bp+si/di]
32位:[BR+IR*F+V],
        V[BR][IR*F],
        V[BR+IR*F]
操作数在主存储器中,偏移地址EA是指令中基址寄存器的内容、变址寄存器的内容乘以比例因子、位移量V三项之和
32位时IR不能是esp,
br中的来确定段
mov ax, 8[bx][si]
mov eax, –6[edi*2][ebp]
立即寻址 n 所提供额操作数是紧跟在指令码后面的一个采用8位、16位或32位二进制补码表示的有符号书,构成指令的一部分
n是立即数,可以是占用1个字节,2个字节,4个字节的存储单元,具体的类型必须要表示出来,根据指令的其它部分来决定,n只能是常数或结果为确定值的表达式,且只能做源操作数
mov word ptr [si],12h
add eax, -12345678h
直接寻址 段寄存器名:[n]
变量
变量+常量
操作数在主存储器中,
n是一个数值或数值表达式时,直接表明操作数的偏移地址值,且为无符号数,[n]不能指明段寄存器,所以加了一个段说明符,
变量或变量+常量的地址表达式在汇编过程中被转换成“段寄存器名:[n]”的形式,期中n是汇编程序计算地址表达式得到的结果,
mov ds:[20h], cl
inc buf; (buf是定义的变量)
mov ax, array1
mov array, bx
sub cx, array3
mov dx, array4+3
(array* 是定义的变量)
原文地址:https://www.cnblogs.com/hustlijian/p/2096520.html