x86 机器指令速查
文中缩写对照:
为了方便表示和理解,文中采用了一些缩写,在此写出供同学们对照查阅:
下文的mem指内存单元,reg指寄存器,imm指立即数
m8/m16 指 8比特(字节)长度/16比特(字)长度的内存单元
r8/r16 指 8比特(字节)长度/16比特(字)长度的寄存器
i8/i16 指 8比特(字节)长度/16比特(字)长度的立即数
dest指目的操作数,src指源操作数
文章目录
1. 数据传送指令
mov dest, src
(1) 功能: dest << src
(2) 不允许:
mem << mem
seg(段寄存器) << imm
cs << reg/mem
imm << any
seg << seg
数据宽度不同的传送
xchg dest, src
(1) 功能: dest <–> src (交换数据)
(2) 不允许:
mem <–> mem
xlat
(1) 功能: al << ds:[bx+al]
(2) 用途: 将一种编码转换为另一种编码 如数字0-9转为七段显示码
例: 主存中建立字节表格, 表格内容是要转换的目标编码,首地址存放于bx,需要转换的码偏移地址设为al,设置好之后执行xlat
(3) 注意: al只有8b,所以表格最大长度为 2^8 = 64bit
2. 堆栈操作指令
push r16/m16/seg
(1) 功能: sp << sp - 2, ss:[sp] << r16/m16/seg
(2) 用途/说明: 将操作数入栈; 栈底高地址, 栈顶低地址, 入栈sp减小
pop r16/m16/seg
(1) 功能: r16/m16/seg << ss:[sp], sp << sp + 2
(2) 用途: 将栈顶出栈到指定地方
3. 标志传送指令
lahf
(1) 功能: ah << flags低字节
sahf
(1) 功能: flags低字节 << ah
pushf
(1) 功能: sp << sp - 2, ss:[sp] << flags (flags进栈)
popf
(1) 功能: flags << ss:[sp], sp << sp + 2 (栈顶出栈至flags)
4. 标志位操作
注: * = c/d/i => cf(进位标志)/df(方向标志)/if(允许可屏蔽中断标志)
cl*
(1) 功能: * << 0
st*
(1) 功能: * << 1
cmc
(1) 功能: cf << ~cf (cf取反)
5. 地址传送指令
lea r16, mem
(1) 功能: r16 << mem的有效地址
例: lea bx, [bx+si+0f62h] == mov bx, bx+si+0f62h (当然不允许这么写哈,但是这个意思)
lds/les r16, mem
(1) 功能: r16 << mem, ds/es << mem+2 (地址加2! 不是值加2)
6. 算术运算指令
add a, b
(1) 功能: a << a + b 并置标志位
(2) 不允许:
add imm, imm
add mem, mem
adc a, b
(1) 功能: a << a + b + cf 并置标志位
(2) 不允许:
add imm, imm
add mem, mem
inc r/m
(1) 功能: r/m << r/m + 1 并置标志位
sub a, b
(1) 功能: a << a - b 并置标志位
(2) 不允许:
sub imm, immsub mem, mem
sbb a,b
(1) 功能: a << a - b - cf 并置标志位
(2) 不允许:
sbb imm, imm
sbb mem, mem
dec r/m
(1) 功能: r/m << r/m - 1 并置标志位
neg r/m
(1) 功能: 求r/m的补码 == 0 - r/m
cmp a, b
(1) 功能: a - b 并置标志位 (与sub不同的是cmp不会改变a的值而sub会)
(2) 用途: 用于测试条件, 一般用于条件转移指令之前, 和test用途差不多
mul/imul x8
(1) 功能: ax << al * x
(x = r8/m8)
(mul为无符号乘, imul为有符号乘)
mul/imul x16
(1) 功能: (dx||ax) << ax * x16
(x16 = r16/m16)
((dx||ax)是指把dx和ax拼起来)
div/idiv x8
(1) 功能: al << ax / x 的商, ah << ax / x 的余数 (低商高余)
(x8 = r8/m8)
div/idiv x16
(1) 功能: ax << (dx||ax) / x
(x16 = r16/m16)
((dx||ax)是指把dx和ax拼起来)
7. 符号扩展指令
cbw
(1) 功能: al 符号扩展到 ax
符号扩展和机组的那个一样
cwd
(1) 功能: ax符号扩展到 (dx||ax)
((dx||ax)是指把dx和ax拼起来)
8. 位操作指令
所有的双操作数逻辑运算指令俊设置cf=of=0,并根据结果设置sf,zf,pf(奇偶标志)
and dest, src
(1) 功能: dest << dest && src
or dest, src
(1) 功能: dest << dest || src
xor dest, src
(1) 功能: dest << dest 异或 src
not r/m
(1) 功能: r/m << ~r/m (按位取反)
test dest, src
(1) 功能 dest && src
(2) 用途: 用于测试条件, 一般用于条件转移指令之前, 和cmp用途差不多
9. 移位指令
shl/r r/m, 1/cl
(1) 功能: r/m 逻辑左/右移 1/cl位 (移动位数大于1时要放到cl里面)
sal/r r/m, 1/cl
(1) 功能: r/m 算术左/右移 1/cl位 (移动位数大于1时要放到cl里面)
rol/r r/m, 1/cl
(1) 功能: r/m 循环左/右移 1/cl位 (移动位数大于1时要放到cl里面)
rcl/r r/m, 1/cl
(1) 功能: r/m 带进位(cf)循环左/右移 1/cl位 (移动位数大于1时要放到cl里面)
10. 控制转移指令
jmp label/r16/m16
(1) 功能: ip << label/r16/m16
(2) 扩展:
jmp short ptr xxx 跳转范围-128~127
jmp near ptr xxx 跳转范围-32768~32767
jmp far ptr xxx 这个不止会修改ip还会修改cs, 由于代码段过长,可能导致一个段放不下的跳转
jcc label
(1) 功能:满足条件"cc"则跳转到label,否则执行下一条指令
11. 循环指令
loop 和 jcxz
(1) 功能
jcxz label ;cx == 0 则转移 loop label ;cx << cx - 1; 若cx != 0, 跳转到label, 否则顺序执行 loopz label ;cx << cx - 1; 若cx != 0 && zf == 1, 跳转到label, 否则顺序执行 loopnz label ;cx << cx - 1; 若cx != 0 && zf == 0, 跳转到label, 否则顺序执行
(2)用法: cx为0直接跳出循环,否则循环循环体cx次
12. 子程序指令
call label/r16/m16
(1) 功能: sp << sp - 2, ss:[sp] << ip, ip << xxx
(2) 扩展
call short ptr xxx 跳转范围-128~127
call near ptr xxx 跳转范围-32768~32767
call far ptr xxx 这个不止会修改ip还会修改cs, 由于代码段过长,可能导致一个段放不下的跳转
ret
(1) 功能: ip << ss:[sp], sp << sp+2
(2) 扩展:
带参数返回
ret imm16
功能: ip << ss:[sp], sp << sp+2, sp << sp + imm16
用途: 废除若干执行call指令以前入栈的参数
13. 中断指令
int imm8
(1) 功能: 产生imm8号中断
iret
(1) 功能: 中断返回
into
(1) 功能: 若of=1则产生4号中断, 否则顺序执行
14. 处理机控制指令
nop
(1) 功能: xchg ax, ax
(2) 用途: 不执行有意义的操作,占用1B的存储单元, 并空消耗一个周期
lock
(1) 功能: 封锁总线, 使得别的处理机不能控制总线
hlt
(1) 功能: 使得cpu暂停, 直到遇到复位信号或中断
esc imm6, r/m
(1) 功能: 将执行权交给浮点处理器, imm6是浮点处理器的操作码, r/m是浮点处理器的操作数
wait
(1) 功能: cpu进入等待状态直到测试引脚为低电平
(2) 用途: 用于与浮点处理器进行同步(cpu快, 浮点慢), 浮点处理器处理完会给cpu发信号,这时cpu可以继续执行指令