汇编语言命令总结
寄存器标志位
标志寄存器 | 标志 | 意义 |
---|---|---|
ZF | 零标志位 | 记录相关指令执行后,其结果是0,则ZF = 1。 |
PF | 奇偶校验位 | 记录相关指令执行后,如果其结果最低有效字节中所有位数中1的个数是否为偶数,如果是偶数PF= 1 |
SF | 符号标志位 | 记录相关结果执行后,其结果为负,则 SF= 1 |
CF | 进位标志位 | 当进行无符号计算时,记录最高有效位向更高位的进位值,或者错位值 |
OF | 溢出标志位 | 是对有符号数而言 |
跳转指令
指令 | 功能 | 例子 | 原理 |
---|---|---|---|
je | 等于则转移 | cmp eax,0x05h; je address | 结果为0,相等, ZF=1,则转移 |
jne | 不等于则转移 | cmp eax, 0x05h; jne address | 结果不为0,不相等 ZF = 0 ,则转移 |
jz | 等于0 则转移 | test eax,eax | 结果为0, ZF = 1,则转移 |
jnz | 不等于0,则转移 | test eax,ebx | 结果不为 0, ZF = 1,则转移 |
jg | 有符号大于,则转移 | ZF=0 and SF=OF | |
jng | 有符号不大于,则跳转 | ZF=1 or SF 不等于 OF | |
jge | 有符号大于等于,则跳转 | SF = OF | |
jnge | 有符号不大于等于,则跳转 | SF 不等于 OF | |
jl | 有符号小于则跳转 | SF 不等于 OF | |
jnl | 有符号不小于则跳转 | SF = OF | |
jle | 有符号小于等于则跳转 | ZF=1 or SF 不等于 OF | |
jnle | 有符号不小于等于则跳转 | ZF=0 and SF=OF | |
Jb | 无符号小于则跳转 | CF=1 | |
jnb | 无符号不小于则跳转 | CF=1 or ZF=1 | |
jbe | 无符号小于等于则跳转 | CF=1 or ZF=1 | |
jnbe | 无符号不小于等于则跳转 | CF=0 and ZF=0 | |
Ja | 无符号大于则跳转 | CF=0 and ZF=0 | |
jna | 无符号不大于则跳转 | CF=1 or ZF=1 | |
jae | 无符号大于等于则跳转 | CF=0 | |
jnae | 无符号不大于等于则跳转 | CF=1 |
指令 | 功能 | 例子 | 解释 | 状态值是否改变 | 影响状态位 |
---|---|---|---|---|---|
XOR | 异或 | XOR eax,eax | 清空 eax 值 | 否 | |
test | 测试值是否为空 | text eax,eax | eax自身进行“与”操作,只执行不保存运算结果 | 是 | 0 ==> ZF = 1, 1 ===> ZF = 0 |
enter | 维护栈指令 | enter ==>“push ebp;mov ebp,esp;sub esp,xxx” | 保存现在的bp寄存器,将当前的sp寄存器值保存到bp中,并获取当前临时变量的空间 | 否 | |
leave | 维护栈指令 | leave ==> “add esp,XXX;pop ebp” | 清除子程序中的临时变量,并且恢复ebp寄存器 | 否 | |
retn | 近返回指令 | retn [reg/立即数] | 相当于 pop ip; sp = sp + [reg/立即数] | 否 | |
retf | 远返回指令 | retf [reg/立即数] | 相当于 pop ip;pop CS; sp = sp + [reg/立即数] | 否 | 否 |
lea | 取偏移地址 | lea ax,[1000H] | 将源操作数[1000H]的偏移地址1000H送至ax | 否 | 否 |
算数指令
指令 | 功能 | 例子 | 默认取寄存区 | 默认存放寄存器 | 影响标志位 | 是否改变内存值 |
---|---|---|---|---|---|---|
add | 进行加法运算 | add eax,ebx; | 寄存器或者立即数 | 寄存器或者内存 | ZF,CF,OF | 是 |
sub | 进行减法运算 | sub eax,ebx; | 寄存器或者立即数 | 寄存器或者内存 | ZF,CF,OF,SF | 是 |
inc | 自增运算 | inc eax | OF,CF | 是 | ||
dec | 自减运算 | dec eax | OF,CF | 是 | ||
mul/imul | 乘法比较复杂看下面 | 是 | ||||
div/idiv | 乘法比较复杂看下面 | 是 |
DIV (unsigned divide) 无符号数除法
格式:DIV SRC/IDIV SRC
两个指令操作相同,DIV是无符号出发,IDIV是带符号除法:
执行的操作:
字节操作:16位被除数在AX,8位除数为源操作数,结果的8位商在AL中,8位余数在AH中。表示为
(AL)<-(AX)/(SRC) 的商
(AH) <-(AX)/(SRC) 的余数
字操作:32位被除数放在DX,AX中。其中DX为高位字,16位除数为源操作数,结果的16位端在AX中,16位余数在DX中。表示为
(AX)<-(DX,AX)/(SRC) 的商
(DX)<-(DX,AX)/(SRC) 的余数
双字操作:64位被除数在EDX,EAX中,其中EDX为高位双字,32位除数为源操作数,结果的32位商在EAX中,32位余数在EDX中,表示为
(EAX)<-(EDX,EAX)/(SRC) 的商
(EDX)<-(EDX,EAX)/(SRC) 的余数。
商和余数均为无符号数。
参数约定
64位:
参数顺序 | 保存参数位置 | 浮点型保存参数位置 |
---|---|---|
1 | RCX | XMM0 |
2 | RDX | XMM1 |
3 | R8 | XMM2 |
4 | R9 | XMM3 |