c++ 反汇编 if
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的更多相关文章
- linux内核学习之一 简单c语言反汇编
(我是第一次发技术博客的菜鸟,恳请大家指导!!) 一 由简单c程序生成汇编代码 首先给出本次我们要反汇编的简单c语言程序:(够简单吧~) 在linux环境中使用下面的命令条件编译: 生成汇编文件sh ...
- C/C++ char* arr与char arr[]的区别(反汇编解析)
写作日期:2016.08.31 修改日期:2016.09.01 .2016.09.02. 交流qq:992591601 用了几天时间复习了下C语言.对于C语言的字符串操作有些不习惯,于是作为练习,写下 ...
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- 通过反汇编理解函数调用机制(x86和ARM)
如下,一个简单的程序 #include <stdio.h> int add(int a, int b) { return a + b; } void main() { , b = ; in ...
- OD 内存映射 属主找不到当前程序名解决办法 和 跟随ClassProc 反汇编窗口空白解决办法
OD 内存映射 属主找不到当前程序名解决办法 取消 StrongOD 选项里 高级枚举模块选项就OK了 重启OD 跟随ClassProc 反汇编窗口空白解决办法 StrongOD.dll 是有问 ...
- 反汇编一个dos软盘的启动扇区
来源:http://www.ata-atapi.com/hiwdos.htm,自己乱译了一通. Disassembly of a DOS Floppy Boot Sector 反汇编一个dos软盘的启 ...
- 如何快速查看将C反汇编的代码
查看反汇编主要的思路在于将 流程,处理,算法 区分开来.1 函数调用:原C代码: int sum(int, int);int main(){ int c = sum(1, 2); printf(&qu ...
- [反汇编练习] 160个CrackMe之027
[反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之026
[反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- [反汇编练习] 160个CrackMe之025
[反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
随机推荐
- Android vs iOS vs Web
Android vs iOS vs Web UI view Android ViewGroup ImageView TextView iOS UIView ImageView TextView Web ...
- Vue 组件之间通信 All in One
Vue 组件之间通信 All in One 组件间通信 1. 父子组件之间通信 https://stackblitz.com/edit/vue-parent-child-commutation?fil ...
- Virtual Reality In Action
Virtual Reality In Action VR WebXR immersive 沉浸式 https://github.com/immersive-web/webxr https://imme ...
- .dmg & .pkg & .ipa
.dmg & .pkg & .ipa Apple, macOS, iOS .dmg mysql-8.0.21-macos10.15-x86_64.dmg https://dev.mys ...
- git config all in one
git config git global config # git global config $ git config $ git config --list --show-origin $ gi ...
- APP 金刚区图标设计 & UI
APP 金刚区图标设计 & UI https://www.zcool.com.cn/article/ZNzk4Njg0.html
- Baccarat凭什么能成为DeFi后时代火爆新趋势?
在各币种经历涨涨跌跌以后,DeFi后时代已然来临.那么,当前DeFi市场中哪个项目更被市场生态建设者看好呢?毫无疑问,Baccarat会成为最被看好的DeFi项目. Baccarat采用了独特的共识算 ...
- BGV上线17小时最高888.88美金,投资最高回报率近+1778倍, 带动NGK内存暴涨
至12月3日BGV币上线A网交易所DeFi板块以来,BGV价值飙升长.,据非小号的数据显示,BGV币价是718美元(东八区时间2020年12月4日早上九点四十),相较昨日涨幅达70.14%,以718美 ...
- Spring中的@Enable注解
本文转载自SpringBoot中神奇的@Enable注解? 导语 在SpringBoot开发过程,我们经常会遇到@Enable开始的好多注解,比如@EnableEurekaServer.@Enable ...
- js异步回调Async/Await与Promise区别 新学习使用Async/Await
Promise,我们了解到promise是ES6为解决异步回调而生,避免出现这种回调地狱,那么为何又需要Async/Await呢?你是不是和我一样对Async/Await感兴趣以及想知道如何使用,下面 ...