C和汇编---while反汇编
环境:VC++
C程序:
#include "stdio.h"int main()
{int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);return 0;
}
用while计算1到100的值,功能很简单,让我们看看反汇编
首先在main函数的入口,看到一条汇编不懂意思
0040101C B9 12 00 00 00 mov ecx,12h
00401021 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401026 F3 AB rep stos dword ptr [edi]
查了资料,知道了
- rep指令:重复
stos dword ptr [edi]
指令.ECX的值是重复的次数,每次ECX都会减一,到0就不执行了 - stos:将eax中的值拷贝到ES:EDI指向的地址,也就是上面的
dword ptr [edi]
- es:附加段寄存器,存放当前执行程序中一个辅助数据段的段地址
我们利用VC++反汇编可以查看一下,当执行了一次rep stos dword ptr [edi]
命令后
while的反汇编程序:
5: int i=1,sum=0;
00401028 C7 45 FC 01 00 00 00 mov dword ptr [ebp-4],1 //栈中[ebp-4]的值为1
0040102F C7 45 F8 00 00 00 00 mov dword ptr [ebp-8],0//栈中[ebp-8]的值为0
6: while(i<=100){00401036 83 7D FC 64 cmp dword ptr [ebp-4],64h //比较i和100的值
0040103A 7F 14 jg main+40h (00401050) //大于跳转到00401050执行
7: sum+=i;
0040103C 8B 45 F8 mov eax,dword ptr [ebp-8]
0040103F 03 45 FC add eax,dword ptr [ebp-4] //相加
00401042 89 45 F8 mov dword ptr [ebp-8],eax //[ebp-8]相当于sum
8: i++;
00401045 8B 4D FC mov ecx,dword ptr [ebp-4]
00401048 83 C1 01 add ecx,1
0040104B 89 4D FC mov dword ptr [ebp-4],ecx
9: }
0040104E EB E6 jmp main+26h (00401036) //执行100次之后跳转到00401036执行
10: printf("%d\n",sum);
00401050 8B 55 F8 mov edx,dword ptr [ebp-8]
00401053 52 push edx
00401054 68 1C 20 42 00 push offset string "%d" (0042201c)
00401059 E8 32 00 00 00 call printf (00401090)
0040105E 83 C4 08 add esp,8
执行一个函数,程序会先把ebp的值压入栈,把esp赋值给ebp
- jg:大于跳转指令
反汇编实现:
#include "stdio.h"int main()
{/*int i=1,sum=0;while(i<=100){sum+=i;i++;}printf("%d\n",sum);*/char *str="sum=%d\n";__asm{mov eax,1mov ebx,0mov ecx,1sum : cmp ecx,100jg endadd ebx,eaxinc eaxinc ecxjmp sumend : push ebxpush strcall printfadd esp,8}return 0;}
C和汇编---while反汇编相关推荐
- 你知道汇编与反汇编的区别吗?
本人不才,小白一枚,今天在看书的过程中被汇编.反汇编这两个词搞懵了.赶紧用了搜dog,发现讲的都不是很清楚,这里说一下我的总结.有什么不对的大家见谅. 汇编.反汇编这两个词可做动词,可做名词. 我们先 ...
- C/C++源程序到可执行程序exe的全过程(及汇编和反汇编的区别)
一个现代编译器的主要工作流程如下: 源程序(source code)→预处理器(preprocessor)→编译器(compiler)→汇编程序(assembler)→目标程序(object code ...
- riscv汇编对应C语言,riscv 汇编与反汇编
为了riscv指令集,我们需要汇编与反汇编工具来分析指令格式. riscv-none-embed-as.exe -c mm.s -o mm.o --march=rv32g mm.s addi x10, ...
- java opcode 反汇编,OPCode详解及汇编与反汇编原理
1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处理器的 ...
- OPCode详解及汇编与反汇编原理
1. 何为OPCode 在计算机科学领域中,操作码(Operation Code, OPCode)被用于描述机器语言指令中,指定要执行某种操作的那部分机器码,构成OPCode的指令格式和规范由处 ...
- unicorn模拟android,汇编与反汇编神器Unicorn
我们来先说说Unicorn有啥子卵用. Unicorn 是一款非常优秀的跨平台模拟执行框架,该框架可以跨平台执行Arm, Arm64 (Armv8), M68K, Mips, Sparc, & ...
- GNU ARM汇编伪操作(Directives) 命令集
本文是原创,转载请注明出处 本文链接:http://blog.sina.com.cn/s/blog_574d08530100hzie.html 1.符号定义伪操作 操作符 语法格式 ...
- 把 汇编代码翻译成二进制机器代码
本文链接: http://blog.sina.com.cn/s/blog_574d08530100i0aj.html 汇编:把 汇编代码翻译成二进制机器代码 反汇编:把二进制机器代码翻译成汇编代码 汇 ...
- 嵌入式Linux(二)汇编LED驱动实验
目的: 并不是系统的学习汇编,而是在linux开发中有时候需要使用汇编置零进行一些初始化的工作. 1. I.MX6ULL的IO初始化流程: 6ULL的IO命名:IOMUXC_SW_MUC_CTL_PA ...
最新文章
- Spring AOP 实现原理与 CGLIB 应用
- flink搭建集群(一主三从)
- arm linux 开机电路_【技术角度看问题之一】ARM到底是个啥?
- layui响应式:隐藏与显示(class 类名后缀)
- 95-136-042-源码-Operator-AbstractUdfStreamOperator
- 自定义广播增加权限控制
- CSS3动画实现牛顿摆
- Python中使用print函数的三种输出方式
- Web of Science的正确打开方式
- php 模态框效果,超酷的模态框效果 - Nifty
- MacOS代理设置(桌面应用代理设置Terminal代理设置)
- 谁是合约届「技术之王」?
- 系统分析师论文5:论软件的系统测试及其应用
- SQL Server 数据库文件类型
- 2019十佳DevOps工具,你用了几个?
- 伪全息老婆制作1(Shader入门1)
- C++的学习日记day8(类型转换、异常、输入输出流、文件)
- Anylogic各个版本的功能对比
- TUH EEG seizure数据集TUSZ v1.5.2和v2.0都有
- windows虚拟机安装打印机的方式
热门文章
- OpenDaylight开发hello-world项目之开发工具安装
- OO第二单元作业总结
- No identities are available for signing 的解决办法
- iview 级联选择组件_使用 element-ui 级联插件遇到的坑
- linux内核percpu变量声明,Linux kernel percpu变量解析
- 前端微信签名验证工具_微信小程序API 用户数据的签名验证和加解密
- 华为杯大学生计算机软件大赛,关于举办2018年西安电子科技大学程序设计网络赛暨第十六届“华为杯”大学生程序设计竞赛的通知...
- java script this_JavaScript this 关键字
- python 比较运算符放在列表中_在Python3中将运算符放在列表中
- 华为怎么升级Android11,华为EMUI 11/安卓11升级名单曝光 快来看看你的手机是否支持...