首页 > 代码库 > 反汇编--C语言(判断与分支)
反汇编--C语言(判断与分支)
if else条件判断 C语言实现:
void Conditional(int c){ if (c>0 && c<10) { printf("c大于0,小于10"); } else if(c>10 && c<100) { printf("c大于10,小于100"); } else{ printf("其它"); } } void main(){ int num=5; Conditional(num); return 0; }
反汇编
1: void Conditional(int c){ 00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,40h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-40h] 0040102C mov ecx,10h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi] 2: if (c>0 && c<10) //先比较变量C和0 00401038 cmp dword ptr [ebp+8],0 //小于或者等于则跳转到00401053处执行else if 部分 0040103C jle Conditional+33h (00401053) //然后比较变量C和10(0AH) 0040103E cmp dword ptr [ebp+8],0Ah //大于 或者等于则跳转到00401053处执行esle if部分 00401042 jge Conditional+33h (00401053) 3: { 4: printf("c大于0,小于10"); //将字符串压入栈中 这里的汉字采用了GBK编码方式 x是十六进制数 b4\f3 =大 d3\da=于 ... 00401044 push offset string "c\xb4\xf3\xd3\xda0,\xd0\xa1\xd3\xda10" (00422038) //调用printf子程序,打印字符串 00401049 call printf (00401100) //调用完printf子程序后恢复esp栈顶指向。 0040104E add esp,4 5: } 6: else if(c>10 && c<100) //else if 在开始处有一个无条件跳转指令,跳转到0040107B判断结束处,阻止前面的分支执行完后跳到这个分支执行。 00401051 jmp Conditional+5Bh (0040107b) //这里同上面的if比较相同 00401053 cmp dword ptr [ebp+8],0Ah 00401057 jle Conditional+4Eh (0040106e) 00401059 cmp dword ptr [ebp+8],64h 0040105D jge Conditional+4Eh (0040106e) 7: { 8: printf("c大于10,小于100"); 0040105F push offset string "c\xb4\xf3\xd3\xda10,\xd0\xa1\xd3\xda100" (00422024) 00401064 call printf (00401100) 00401069 add esp,4 9: } 10: else{ //最后的else 同样是有一个无条件跳转指令 跳转到判断结束处,阻止前面的分支执行完后跳到这个分支执行。 0040106C jmp Conditional+5Bh (0040107b) 11: printf("其它"); 0040106E push offset string "\xc6\xe4\xcb\xfc" (0042201c) 00401073 call printf (00401100) 00401078 add esp,4 12: } 13: } //恢复各个寄存器的值,检查esp的值后程序返回 0040107B pop edi 0040107C pop esi 0040107D pop ebx 0040107E add esp,40h 00401081 cmp ebp,esp 00401083 call __chkesp (00401180) 00401088 mov esp,ebp 0040108A pop ebp 0040108B ret
switch条件判断C语言实现:
void Conditional(int c){ switch(c) { case 0: printf("c>0"); case 1: { printf("c>10 && c<100"); break; } default: printf("c>10 && c<100"); } } void main(){ int num=5; Conditional(num); return 0; }
反汇编
1: void Conditional(int c){ 00401020 push ebp 00401021 mov ebp,esp 00401023 sub esp,44h 00401026 push ebx 00401027 push esi 00401028 push edi 00401029 lea edi,[ebp-44h] 0040102C mov ecx,11h 00401031 mov eax,0CCCCCCCCh 00401036 rep stos dword ptr [edi] 2: switch(c) 3: { //这里将变量c的值送入eax中 00401038 mov eax,dword ptr [ebp+8] //将eax的值复制到 [ebp-4]处 0040103B mov dword ptr [ebp-4],eax //把这个值和 0 进行比较 0040103E cmp dword ptr [ebp-4],0 //相等则跳转到case 0处执行 00401042 je Conditional+2Ch (0040104c) //继续和1进行比较 00401044 cmp dword ptr [ebp-4],1 //相等则跳转到case 1处执行 00401048 je Conditional+39h (00401059) //这里有一个无条件跳转 如果以上条件都不满足直接跳转到00401068 default处 0040104A jmp Conditional+48h (00401068) 4: case 0: printf("c>0"); 0040104C push offset string "c>0" (00422024) 00401051 call printf (00401100) 00401056 add esp,4 5: 6: case 1: { 7: printf("c>10 && c<100"); 00401059 push offset string "c>10 && c<100" (00422fcc) 0040105E call printf (00401100) 00401063 add esp,4 //这里break 用的 jmp 无条件指令 直接跳出 8: break; 00401066 jmp Conditional+55h (00401075) 9: } 10: 11: default: printf("c>10 && c<100"); 00401068 push offset string "c>10 && c<100" (00422fcc) 0040106D call printf (00401100) 00401072 add esp,4 //后面基本相同省略
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。