(本文更新ing...)
0. 一些命令
| 汇编命令 | 等价伪代码 |
|---|---|
| mov eax, ecx | eax=ecx |
| add eax, ecx | eax+=ecx |
| sub eax, ecx | eax-=ecx |
| inc eax | eax++ |
| dec eax | eax-- |
| lea eax, [ecx+4] | eax=ecx+4 |
| leave | mov esp ebp,pop ebp |
| retn | eip=esp,esp=esp+4 |
| retn N | eip=esp,esp=esp+4+N |
1. jxx家族
测试标志位的jxx:
| 指令 | 描述 | 条件 | 别名 | 相反指令 |
|---|---|---|---|---|
| jc | 如果进位位被置位则跳转 | 进位标志=1 | jb,jnae | jnc |
| jnc | 如果进位位没有置位则跳转 | 进位标志=0 | jnb,jae | jc |
| jz | 如果0标志被置位则跳转 | 0标志=1 | je | jnz |
| jnz | 如果0标志没有置位则跳转 | 0标志=0 | jne | jz |
| js | 如果符号位被置位则跳转 | 符号标志=1 | jns | |
| jns | 如果符号位没有被置位则跳转 | 符号标志=0 | js | |
| jo | 如果溢出标志置位则跳转 | 溢出标志=1 | jno | |
| jno | 如果溢出标志没有置位则跳转 | 溢出标志=0 | jo | |
| jp | 如果奇偶校验位被置位则跳转 | 奇偶校验标志=1 | jpe | jnp |
| jpe | 如果奇偶校验位为偶校验则跳转 | 奇偶校验标志=1 | jp | jpo |
| jnp | 如果奇偶校验位没有被置位则跳转 | 奇偶校验标志=0 | jpo | jp |
| jpo | 如果奇偶校验位为奇校验则跳转 | 奇偶校验标志=0 | jnp | jpe |
使用无符号数比较的jxx:
| 指令 | 描述 | 条件 | 别名 | 相反指令 |
|---|---|---|---|---|
| ja | 如果超过(>)则跳转 | 进位标志=0,0标志=0 | jnbe | jna |
| jnbe | 如果不低于或等于(不 <=)则跳转 | 进位标志=0,0标志=0 | ja | jbe |
| jae | 如果超过或等于(>=)则跳转 | 进位标志=0 | jnc,jnb | jnae |
| jnb | 如果不低于则跳转(不 <) | 进位标志=0 | jnc,jae | jb |
| jb | 如果低于(<)则跳转 | 进位标志=1 | jc,jnae | jnb |
| jnae | 如果不超过或等于(不>=)则跳转 | 进位标志=1 | jc,jb | jae |
| jbe | 如果低于或等于(<=)则跳转 | 进位标志=1或0标志=1 | jna | jnbe |
| jna | 如果不超过(不>)则跳转 | 进位标志=1或0标志=1 | jbe | ja |
| je | 如果相等(=)则跳转 | 0标志=1 | jz | jne |
| jne | 如果不相等(<>)则跳转 | 0标志=0 | jnz | je |
使用有符号数比较的jxx:
| 指令 | 描述 | 条件 | 别名 | 相反指令 |
|---|---|---|---|---|
| jg | 如果大于(>)则跳转 | 符号标志=溢出标志或0标志=0 | jnle | jng |
| jnle | 如果小于或等于(<=)则跳转 | 符号标志=溢出标志或0标志=0 | jg | jle |
| jge | 如果大于或等于(>=)则跳转 | 符号标志=溢出标志 | jnl | jge |
| jnl | 如果不小于(不<)则跳转 | 符号标志=溢出标志 | jge | jl |
| jl | 如果小于(<)则跳转 | 符号标志<>溢出标志 | jnge | jnl |
| jnge | 如果大于或等于(>=)跳转 | 符号标志<>溢出标志 | jl | jge |
| jle | 如果小于或等于(<=)跳转 | 符号标志<>溢出标志或0标志=1 | jng | jnle |
| jng | 如果不大于(不>)则跳转 | 符号标志<>溢出标志或0标志=1 | jle | jg |
| je | 如果等于(=)则跳转 | 0标志=1 | jz | jne |
| jne | 如果不等于(<>)则跳转 | 0标志=0 | jnz | je |
2. 流程控制命令
| 汇编伪代码 | 等价伪代码 |
|---|---|
| cmp a,b jle end ① end: |
if(a>b){①} |
| cmp a,b jge end ① end: |
if(a<b){①} |
| cmp a,b jne end ① end: |
if(a==b){①} |
![]() |
if(a==1){①}else{②} |
![]() |
switch(a){ case 'c':①;break; case 'x':②;break; default:③; } |
![]() 注意这里对 a--做了简化处理,实际的汇 编过程中会为 a--申请一个临时变量 |
do{①}while{a--}; |
![]() |
while(a--){①} |
![]() |
for(i=0;i<100;i++){①} |




