1、debug

  • if:
10:     if (argc == 0)
0010711E 83 7D 08 00 cmp dword ptr [argc],0
00107122 75 11 jne If+35h (0107135h) //不相等则跳转(为保持代码顺序,if的比较条件在汇编中相反)
11: {
12: printf("%d \r\n", argc);
00107124 8B 45 08 mov eax,dword ptr [argc]
···printf00107132 83 C4 08 add esp,8
13: }
14: if (argc > 0)
00107135 83 7D 08 00 cmp dword ptr [argc],0
00107139 7E 0D jle If+48h (0107148h)
15: {
16: printf("argc >= 0");
···printf00107145 83 C4 04 add esp,4
17: }

总结:debug下,简单的if语句结构为:

cmp

jxx  {if 外语句}

{if 块内语句}

  • if···else···
   35:     if (argc == 0)
0010719E 83 7D 08 00 cmp dword ptr [argc],0
001071A2 75 09 jne IfElse+2Dh (01071ADh)
36: {
37: argc = 5;
001071A4 C7 45 08 05 00 00 00 mov dword ptr [argc],5
38: }
39: else
001071AB EB 07 jmp IfElse+34h (01071B4h) //if块内语句执行结束后,jmp到if-else结束
40: {
41: argc = 6;
001071AD C7 45 08 06 00 00 00 mov dword ptr [argc],6
42: }
  • if···else if···else
50:     if (argc > 0)
00107215 83 7D 08 00 cmp dword ptr [argc],0
00107219 7E 0F jle IfElseIf+3Ah (010722Ah) //if
51: {
52: printf("argc > 0");
···printf
00107228 EB 22 jmp IfElseIf+5Ch (010724Ch) //if块内结束时jmp出条件结构
53: }
54: else if (argc == 0)
0010722A 83 7D 08 00 cmp dword ptr [argc],0
0010722E 75 0F jne IfElseIf+4Fh (010723Fh) //else if
55: {
56: printf("argc == 0");
···printf
57: }
58: else
0010723D EB 0D jmp IfElseIf+5Ch (010724Ch) //else if块内结束后jmp出条件结构
59: {
60: printf("argc <= 0");
···printf

2、release

  • if
void If(int argc)
{
if (argc == 0)
{
printf("%d \r\n", argc);
}
if (argc > 0)
{
printf("argc >= 0");
} return;
}
00351085  | 85C0            | test eax,eax                      | if_else.cpp:73
00351087 | 75 12 | jne if_else.35109B |
···printf |
00351097 | 33C0 | xor eax,eax | if_else.cpp:77
00351099 | 5D | pop ebp |
0035109A | C3 | ret |
0035109B | 7E 0D | jle if_else.3510AA | 优化了一条判断语句
···printf |
003510AA | 33C0 | xor eax,eax | if_else.cpp:77
  • if···else
void IfElse(int argc)
{
if (argc == 0)
{
argc = 5;
}
else
{
argc = 6;
}
printf("%d \r\n", argc);
}
01381081  | 3945 08         | cmp dword ptr ss:[ebp+0x8],eax    |//类似条件表达式中的优化,
01381084 | 0F95C0 | setne al |
01381087 | 83C0 05 | add eax,0x5 |
···
printf
···
01381098 | 33C0 | xor eax,eax | if_else.cpp:76
0138109A | 5D | pop ebp | if_else.cpp:77
0138109B | C3 | ret |
  • if···else if···else
void IfElseIf(int argc)
{
//argc = 0;
if (argc > 0)
{
printf("argc > 0");
}
else if (argc == 0)
{
printf("argc == 0");
}
else
{
printf("argc <= 0");
}
}
002910A5  | 85C9            | test ecx,ecx             | if_else.cpp:75
002910A7 | 7E 12 | jle if_else.2910BB |
002910A9 | B8 A4012D00 | mov eax,if_else.2D01A4 | 2D01A4:"argc > 0"
···printf |
002910B7 | 33C0 | xor eax,eax |
002910B9 | 5D | pop ebp | if_else.cpp:77
002910BA | C3 | ret |
002910BB | 85C9 | test ecx,ecx | if_else.cpp:75
002910BD | BA BC012D00 | mov edx,if_else.2D01BC | 2D01BC:"argc <= 0"
002910C2 | B8 B0012D00 | mov eax,if_else.2D01B0 | 2D01B0:"argc == 0"
002910C7 | 0F45C2 | cmovne eax,edx |//将两条判断优化在一起
···printf

c++ 反汇编 if的更多相关文章

  1. linux内核学习之一 简单c语言反汇编

    (我是第一次发技术博客的菜鸟,恳请大家指导!!) 一  由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...

  2. C/C++ char* arr与char arr[]的区别(反汇编解析)

    写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...

  3. Linux环境下使用gcc编译,gdb反汇编C语言程序

    使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64   我把过程截图如下. 首先是hello world程序: 备注: ...

  4. 通过反汇编理解函数调用机制(x86和ARM)

    如下,一个简单的程序 #include <stdio.h> int add(int a, int b) { return a + b; } void main() { , b = ; in ...

  5. OD 内存映射 属主找不到当前程序名解决办法 和 跟随ClassProc 反汇编窗口空白解决办法

    OD 内存映射 属主找不到当前程序名解决办法 取消 StrongOD 选项里  高级枚举模块选项就OK了  重启OD 跟随ClassProc  反汇编窗口空白解决办法 StrongOD.dll 是有问 ...

  6. 反汇编一个dos软盘的启动扇区

    来源:http://www.ata-atapi.com/hiwdos.htm,自己乱译了一通. Disassembly of a DOS Floppy Boot Sector 反汇编一个dos软盘的启 ...

  7. 如何快速查看将C反汇编的代码

    查看反汇编主要的思路在于将 流程,处理,算法 区分开来.1 函数调用:原C代码: int sum(int, int);int main(){ int c = sum(1, 2); printf(&qu ...

  8. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  10. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. Rails框架学习

    Don't Repeat Yourself! Convention Over Configuration. REST. Rails框架总览. Rails框架基本使用. Rails框架数据交互. Rai ...

  2. STM32F107移植LWIP

    STM32F107上移植LWIP2.0.3 因为最近需要在STM32F107上实现TCP/IP协议栈,所以网上查了一下,准备使用LWIP,虽然大多数用的是1.4.1版本但是官方说2系大版本修复了1.4 ...

  3. React + GraphQL 2020 速成课程

    React + GraphQL 2020 速成课程 technologies React (to build our user interface) GraphQL (to get and chang ...

  4. holy shit CSDN

    holy shit CSDN 垃圾 CSDN 到处都是垃圾文章, 无人子弟 到处都是垃圾广告,看的恶心 毫无底线,窃取别人的知识成果,毫无版权意识 垃圾爬虫,垃圾小号 ...等等 Google Sea ...

  5. JavaScript Inheritance All in One

    JavaScript Inheritance All in One constructor inheritance prototype chain inheritance "use stri ...

  6. free online linux terminal & github cli online

    free online linux terminal & github cli online gitpod https://www.gitpod.io/features/ https://bc ...

  7. HTTP cache in depth

    HTTP cache in depth HTTP 缓存 https://developers.google.com/web/fundamentals/performance/optimizing-co ...

  8. js & sort array object

    js & sort array object sort array object in js https://flaviocopes.com/how-to-sort-array-of-obje ...

  9. DQL:data query language用来查询数据库表中的数据

    对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 如果没有查询条件,则每次查询所有的行.实际应用中,一般要指定查询的条件.对记录进行过滤. 查询 ...

  10. 微信小程序:单选框radio和复选框CheckBox

    单选框radio: 可以通过color属性来修改颜色. 复选框checkbox: