一、传送指令
1、通用数据传送指令
作用:传送寄存器或存储器中的数据
简写 | 英文全称 | 中文名称 | 作用 | 子类型 | 英文全称 | 含义 |
mov | move | 传送指令 | 一般的传送指令 | movb | move byte | 字节传送(8位) |
movw | move word | 字(双字节)传送(16位) |
movl | move long byte | 长字节(双字)传送(32位) |
movs | | 符号扩展传送指令 | 将短的源数据高位符号扩展后传送到目的地址,针对有符号数 | movsbw | | 把一个字节进行符号扩展后送到一个字地址中 |
movsbl | | |
movswl | | |
movz | | 零扩展传送指令 | 将短的源数据高位零扩展后传送到目的地址,针对无符号数 | movsbw | | |
movsbl | | |
movswl | | 把一个字的高位进行零扩展后送到一个字(双字节)地址中 |
xchg | exchange | 数据交换指令 | 将两个寄存器内容交换 | xchgb | | 字节交换 |
xchgw | | |
xchgl | | |
push | push | 压栈指令 | 先执行R[sp]<-R[sp]-2或R[sp]<-R[sp]-4,然后将一个字或双字从指定寄存器送到SP或ESP指定的栈单元中 | pushw | | 字压栈 |
pushl | | 双字压栈 |
pop | pop | 出栈指令 | 先将一个字或双字从SP或ESP指示的栈单元送到指定寄存器中,再执行R[sp]<-R[sp]+2或R[sp]<-R[sp]+4 | popw | | 字出栈 |
popl | | 双字出栈 |
2、地址传送指令
作用:传送的是操作数的存储地址
简写 | 英文全称 | 中文名称 | 作用 | 子类型 | 英文全称 | 含义 |
lea | load effect address | 加载有效地址(偏移地址)指令 | 将源操作数的存储地址送到目的寄存器中,相当于地址操作符&的功能 | leaw | | |
leal | | 把一个32位(4字节)的地址送到一个32位的寄存器中 |
leaq | | |
3、输入输出指令
作用:专门用于在累加器和I/O端口之间进行数据传送
简写 | 英文全称 | 中文名称 | 作用 |
in | input | 输入指令 | 将I/O端口内容送到累加器 |
ou | ouput | 输出指令 | 将累加器内容送到I/O端口 |
4、标志传送指令
作用:专门用于对标志寄存器进行操作
简写 | 英文全称 | 中文名称 | 作用 |
pushf | push flag | | 将标志寄存器的内容压栈 |
popf | pop flag | | 将栈顶内容送到标志寄存器 |
二、定点算术运算指令
1、加/减运算指令
作用:对给定长度的两个位串进行相加或相减
简写 | 英文全称 | 中文名称 | 作用 |
add | add | 加法指令 | 对给定长度的两个位串进行相加 |
sub | subtract | 减法指令 | 对给定长度的两个位串进行相减 |
2、自增/自减运算指令
作用:对给定长度的一个位串加1或减1
简写 | 英文全称 | 中文名称 | 作用 |
inc | increase | 自增指令 | 对给定长度的一个位串加1 |
dec | decrease | 自减指令 | 对给定长度的一个位串减1 |
3、取负指令
作用:求操作数的负数,即将给定长度的一个位串”各位取反,末位加1“。
简写 | 英文全称 | 中文名称 | 作用 |
neg | negative | 取负指令 | 求操作数的负数 |
4、比较指令
作用:两个寄存器操作数的比较,用目的操作数减去源操作数,但结果不送回目的操作数。即两个操作数保持原值不变,只是标志位相应改变
简写 | 英文全称 | 中文名称 | 作用 |
cmp | compare | 比较指令 | 两个寄存器操作数的比较 |
5、乘/除运算指令
乘法:对于IMUL指令,可以明显地给出一个、两个或三个操作数,但是对于MUL指令,只能明显地给出一个操作数。
- 若指令中只给出一个操作数SRC,则另一个源操作数隐含在累加器AL/AX/EAX中,将SRC和累加器内容相乘,结果存放在AX(16位时)或DX-AX(32位时)或EDX-EAX(64位时)中。
- 若指令中给出两个操作数DST和SRC,则将DST和SRC相乘,结果存放在DST中。
- 若指令中给出三个操作数REG、SRC和IMM,则将SRC和立即数IMM相乘,结果存放在寄存器REG中。
除法:指令中只明显指出除数,用累加器AL/AX/EAX中的内容除以指令中指定的除数。
简写 | 英文全称 | 中文名称 | 作用 |
mul | multiplication | 无符号数乘法指令 | |
imul | integer multiplication | 带符号整数乘法指令 | |
div | divide | 无符号数除法指令 | |
idiv | integer divide | 带符号整数除法指令 | |
三、按位运算指令
1、逻辑运算指令
简写 | 英文全称 | 中文名称 | 作用 |
not | | 取反指令 | 对单操作数每一位取反 |
and | | 按位与指令 | 对双操作数按位逻辑“与”,主要用于实现掩码操作 |
or | | 按位或指令 | 对双操作数按位逻辑“或”,主要用于实现目的操作数的特定位置1 |
xor | | 按位异或指令 | 对双操作数按位逻辑“异或”,主要用于判断两个操作数中哪些位不同或改变指定位的值 |
test | | | 根据两个操作数相“与”的结果来设置条件标志,主要用于需检测某种条件但不能改变源操作数的场合 |
2、移位指令
简写 | 英文全称 | 中文名称 | 作用 |
shl | shift logical left | 逻辑左移 | 每左移一次,最高位送入CF,并在最低位补0 |
shr | shift logical right | 逻辑右移 | 每右移一次,最低位送入CF,并在最高位补0 |
sal | shift arithmetic left | 算术左移 | 与逻辑左移类似,但移位前后符号位发生变化,则OF=1,表示左移后结果溢出 |
sar | shift arithmetic right | 算术右移 | 每右移一次最低位送入CF,并在高位补符号 |
rol | rotate left | 循环左移 | 每左移一次,最高位移到最低位,并送入CF |
ror | rotate right | 循环右移 | 每右移一次,最低位移到最高位,并送入CF |
四、控制转移指令
1、无条件转移指令
简写 | 英文全称 | 中文名称 | 作用 |
jmp | jump | 无条件转移指令 | 无条件转移到转移目标地址处执行 |
2、条件转移指令
简写 | 英文全称 | 转移条件 | 作用 |
jc | jump when has carry flag | CF=1 | 有进位/借位 |
jnc | jump when has not carry flag | CF=0 | 无进位/借位 |
je/jz | jump when equal/jump when has zero flag | ZF=1 | 相等/等于零 |
jne/jnz | jump when not equal/jump when has not zero flag | ZF=0 | 不相等/不等于零 |
js | jump when has sign flag | SF=1 | 是负数 |
jns | jump when has not sign flag | SF=0 | 是非负数 |
jo | jump when has overflow flag | OF=1 | 有溢出 |
jno | jump when has not overflow flag | CF=1 | 无溢出 |
ja/jnbe | jump when above/jump when not below or equal | CF=0 and ZF=0 | 无符号整数A>B |
jae/jnb | jump when above or equal/jump when not below | CF=0 or ZF=0 | 无符号整数A≥B |
jb/jnae | jump when below/jump when not above or equal | CF=1 and ZF=0 | 无符号整数A<B |
jbe/jna | jump when below or equal/jump when not above | CF=1 or ZF =1 | 无符号整数A≤B |
jg/jnle | jump when great/jump when not less or equal | SF=OF and ZF = 0 | 带符号整数A>B |
jge/jnl | jump when great or equal/jump when not less | SF=OF or ZF = 1 | 带符号整数A≥B |
jl/jnge | jump when less/jump when not great or equal | SF≠OF and ZF=0 | 带符号整数A<B |
jle/jng | jump when less or equal/jump when not great | SF≠OF or ZF=1 | 带符号整数A≤B |
3、条件设置指令
作用:用来将条件标志组合得到的条件值设置到一个8位通用寄存器中。其设置的条件值与条件转移指令的转移条件完全一样,指令助记符也类似,只需要将j换成set即可。格式为setcc DST。DST是一个通用寄存器。
简写 | 英文全称 | 设置条件 | 作用 |
setc | set when has carry flag | CF=1 | 有进位/借位时置DST为1,否则为置0 |
setnc | set when has not carry flag | CF=0 | 无进位/借位时置DST为1,否则为置0 |
sete/setz | set when equal/set when has zero flag | ZF=1 | 相等/等于零时置DST为1,否则为置0 |
setne/setnz | set when not equal/set when has not zero flag | ZF=0 | 不相等/不等于零时置DST为1,否则为置0 |
sets | set when has sign flag | SF=1 | 是负数时置DST为1,否则为置0 |
setns | set when has not sign flag | SF=0 | 是非负数时置DST为1,否则为置0 |
seto | set when has overflow flag | OF=1 | 有溢出时置DST为1,否则为置0 |
setno | set when has not overflow flag | CF=1 | 无溢出时置DST为1,否则为置0 |
seta/setnbe | set when above/set when not below or equal | CF=0 and ZF=0 | 无符号整数A>B时置DST为1,否则为置0 |
setae/setnb | set when above or equal/set when not below | CF=0 or ZF=0 | 无符号整数A≥B时置DST为1,否则为置0 |
setb/setnae | set when below/set when not above or equal | CF=1 and ZF=0 | 无符号整数A<B时置DST为1,否则为置0 |
setbe/setna | set when below or equal/set when not above | CF=1 or ZF =1 | 无符号整数A≤B时置DST为1,否则为置0 |
setg/setnle | set when great/set when not less or equal | SF=OF and ZF = 0 | 带符号整数A>B时置DST为1,否则为置0 |
setge/setnl | set when great or equal/set when not less | SF=OF or ZF = 1 | 带符号整数A≥B时置DST为1,否则为置0 |
setl/setnge | set when less/set when not great or equal | SF≠OF and ZF=0 | 带符号整数A<B时置DST为1,否则为置0 |
setle/setng | set when less or equal/set when not great | SF≠OF or ZF=1 | 带符号整数A≤B时置DST为1,否则为置0 |
4、条件传送指令
作用:如果符号条件就进行传送操作,否则什么也不做。其设置的条件值与条件转移指令的转移条件完全一样,指令助记符也类似,只需要将j换成cmov即可。格式为cmovcc DST,SRC。SRC是存放在寄存器或存储器中的源操作数,DST是只能存放在寄存器的传送目的地。
简写 | 英文全称 | 设置条件 | 作用 |
cmovc | conditional move when has carry flag | CF=1 | 有进位/借位时将SRC的内容传送到DST |
cmovnc | conditional move when has not carry flag | CF=0 | 无进位/借位时将SRC的内容传送到DST |
cmove/cmovz | conditional move when equal/conditional move when has zero flag | ZF=1 | 相等/等于零时将SRC的内容传送到DST |
cmovne/cmovnz | conditional move when not equal/conditional move when has not zero flag | ZF=0 | 不相等/不等于零时将SRC的内容传送到DST |
cmovs | conditional move when has sign flag | SF=1 | 是负数时将SRC的内容传送到DST |
cmovns | conditional move when has not sign flag | SF=0 | 是非负数时将SRC的内容传送到DST |
cmovo | conditional move when has overflow flag | OF=1 | 有溢出时将SRC的内容传送到DST |
cmovno | conditional move when has not overflow flag | CF=1 | 无溢出时将SRC的内容传送到DST |
cmova/cmovnbe | conditional move when above/conditional move when not below or equal | CF=0 and ZF=0 | 无符号整数A>B时将SRC的内容传送到DST |
cmovae/cmovnb | conditional move when above or equal/conditional move when not below | CF=0 or ZF=0 | 无符号整数A≥B时将SRC的内容传送到DST |
cmovb/cmovnae | conditional move when below/conditional move when not above or equal | CF=1 and ZF=0 | 无符号整数A<B时将SRC的内容传送到DST |
cmovbe/cmovna | conditional move when below or equal/conditional move when not above | CF=1 or ZF =1 | 无符号整数A≤B时将SRC的内容传送到DST |
cmovg/cmovnle | conditional move when great/conditional move when not less or equal | SF=OF and ZF = 0 | 带符号整数A>B时将SRC的内容传送到DST |
cmovge/cmovnl | conditional move when great or equal/conditional move when not less | SF=OF or ZF = 1 | 带符号整数A≥B时将SRC的内容传送到DST |
cmovl/cmovnge | conditional move when less/conditional move when not great or equal | SF≠OF and ZF=0 | 带符号整数A<B时将SRC的内容传送到DST |
cmovle/cmovng | conditional move when less or equal/conditional move when not great | SF≠OF or ZF=1 | 带符号整数A≤B时将SRC的内容传送到DST |
5、调用指令
作用:调用指令是一种无条件转移指令,跳转方式与jmp指令类似
简写 | 英文全称 | 中文名称 | 作用 |
call | call | 调用指令 | 首先将返回地址入栈(相当于push操作),然后跳转到指定地址处执行 |
6、返回指令
作用:返回指令是一种无条件转移指令,通常放在子程序的末尾,使子程序执行后返回主程序执行
简写 | 英文全称 | 中文名称 | 作用 |
ret | return | 返回指令 | 首先将返回地址从栈顶取出(相当于pop操作),然后跳转回主程序 |
7、中断指令
作用:与过程调用类似,不同的是①过程调用跳转到子程序,中断跳转到中断服务程序②过程调用只需要保存返回地址,中断还需要保存标志寄存器的内容
简写 | 英文全称 | 中文名称 | 作用 |
int | interrupt | 中断指令 | |
iret | interrupt return | 中断返回指令 | |
into | interrupt overflow | 中断溢出指令 | |
8、循环指令
作用: