编译环境:Windows 10 + VS2015

1、问题引入

在Win32环境下,CPU小端模式,参数用栈来传递,写出输出结果。

代码如下:

int main()
{
long long a = 1;
long long b = 2;
long long c = 3;
printf("%d%d%d", a, b, c);//输出结果102
return 0;
}

反汇编代码如下:

int main()
{
010C2AB0 push ebp
010C2AB1 mov ebp,esp //ebp地址为0x00cffcd0
010C2AB3 sub esp,0F0h
010C2AB9 push ebx
010C2ABA push esi
010C2ABB push edi
/*
将ebp-0f0处地址(0x00cffbe0)赋给目标变址寄存器edi。
注意lea与mov指令的区别,如果为mov,则表示将0x00cffbe0处存放的数据赋给edi。
*/
010C2ABC lea edi,[ebp-0F0h] 010C2AC2 mov ecx,3Ch
010C2AC7 mov eax,0CCCCCCCCh
/*
rep 表示重复执行其后面指令stos,重复次数由计数器ecx决定,没执行一次,ecx自动减小,ecx为0时,停止执行其后的指令。
stos 表示将edi指向的内容写成eax中的值,rep过程中edi自动增加。由f0h除以3ch=04得知每次自动增加4个字节,刚好为win32环境下指针长度。
*/
010C2ACC rep stos dword ptr es:[edi]
long long a = 1;
/*
dword 双字节 即四个字节
prt pointer缩写,即针
[]里的数据是一个地址值,这个地址指向一个双字节类型数据
mov ptr [a],1,表示把1数据赋给变量a。
mov eax,dword ptr[00cffbe0] 表示把地址00cffbe0中的双字节型(32位)数据赋给eax累加器。
*/
010C2ACE mov dword ptr [a],1
010C2AD5 mov dword ptr [ebp-8],0
long long b = 2;
010C2ADC mov dword ptr [b],2
long long b = 2;
010C2AE3 mov dword ptr [ebp-18h],0
long long c = 3;
010C2AEA mov dword ptr [c],3
010C2AF1 mov dword ptr [ebp-28h],0
printf("%d%d%d", a, b, c);
010C2AF8 mov eax,dword ptr [ebp-28h]
010C2AFB push eax
010C2AFC mov ecx,dword ptr [c]
010C2AFF push ecx
010C2B00 mov edx,dword ptr [ebp-18h]
010C2B03 push edx
010C2B04 mov eax,dword ptr [b]
010C2B07 push eax
010C2B08 mov ecx,dword ptr [ebp-8]
010C2B0B push ecx
010C2B0C mov edx,dword ptr [a]
010C2B0F push edx
010C2B10 push offset string "%d%d%d" (010C9B30h)
010C2B15 call _printf (010C152Dh)
010C2B1A add esp,1Ch
return 0;
010C2B1D xor eax,eax
}
010C2B1F pop edi
010C2B20 pop esi
010C2B21 pop ebx
010C2B22 add esp,0F0h
010C2B28 cmp ebp,esp
010C2B2A call __RTC_CheckEsp (010C1181h)
010C2B2F mov esp,ebp
010C2B31 pop ebp
010C2B32 ret

参数压栈后栈中数据结构如下,所以按整型输出是,读取的是地址0x011df900~0x011df908内容。按小端模式取出的结果为102。

2、寄存器简介

1)数据寄存器:保存操作数和运算结果等信息。

  • EAX:Accumulator。是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。也可用作函数返回值。取低16位为AX,分割为8位寄存器AH-AL。指令ret返回用到。
  • EBX:Base Register。 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
  • ECX:Count Register。是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
  • EDX:Data Register。则总是被用来放整数除法产生的余数。

2)指针寄存器:EBP,ESP可作为通用寄存器,即可存储算术逻辑运算的操作数和运算结果。

  • EBP:Base Pointer,基指针寄存器,直接访问栈中的数据。
  • ESP:Stack Pointer,栈指针寄存器,只可访问栈顶。指令pop/push时自动变。
  • EIP:Instruction Pointer,指令指针寄存器,存放下次将要执行的指令在代码段中的偏移量。每走一条指令自动变一次,如果希望跳转后能返回继续就需要跳转前把它放入栈中,返回时出栈。

3)变址寄存器:主要用于存放存储单元在段内的偏移量。

  • ESI: Source Index,源变址寄存器。EDS:ESI即源串段寄存器:源串变址,ESI在串操作中自动增减。
  • EDI:Destination Index,目标变址寄存器。EES:EDI即目标串段寄存器:目标串变址,EDI在串操作中自动增减。

4)段寄存器:内存分段。这里最多为6个内存段,不同的内存段放入不同的东西。

  • ECS:Code Segment Register,代码段寄存器。
  • EDS:Data Segment Register,数据段寄存器。
  • EES:Extra Segment Register,附加段寄存器。
  • ESS:Stack Segment Register,栈段寄存器。
  • EFS:Extra Segment Register,附加段寄存器。
  • EGS:Extra Segment Register,附加段寄存器。

反汇编分析C++代码的更多相关文章

  1. 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的

    实验一:通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的 学号:20135114 姓名:王朝宪 注: 原创作品转载请注明出处   <Linux内核分析>MOOC课程http: ...

  2. Linux下简单C语言小程序的反汇编分析

    韩洋原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 写在开始,本文为因为参加MOO ...

  3. 使用汇编分析c代码的内存分布

    arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完毕之后的elf文件,进行反汇编. 之后重定向到tmp.s文件里. 第一步变量例如以下c文件. vim ...

  4. objc反汇编分析__strong和__weak

    如题所说反汇编看__strong和__weak的真实样子,代码列举自然多,篇幅长不利于阅读,我就先搬出结论,后面是分析. 在NON-ARC环境,__strong和__weak不起作用.相反在ARC环境 ...

  5. 反汇编分析objc函数枢纽objc_msgSend

    在分析objc_msgSend之前,先来搞清楚另一个问题. 函数是什么?可能会答 void foo(void) {} 像这样就是一个函数.或者函数包括函数原型和函数定义,是一段执行某样功能的机器代码. ...

  6. objc反汇编分析,block函数块为何物?

    上一篇向大家介绍了__block变量的反汇编和它的伪代码,本篇函数块block,通常定义成原型(^){},它在反汇编中是什么东西. 我们先定义将要反汇编的例子,为减少篇幅例子采用non-arc环境. ...

  7. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  8. 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码

    洛谷 P2194 HXY烧情侣[Tarjan缩点] 分析+题解代码 题目描述: 众所周知,HXY已经加入了FFF团.现在她要开始喜(sang)闻(xin)乐(bing)见(kuang)地烧情侣了.这里 ...

  9. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

随机推荐

  1. 【LeetCode】92. Reverse Linked List II 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 题目地址:https://leet ...

  2. 低成本CH7511芯片方案|CH7511电路设计参考|CS5211替代CH7511

    CH7511是主要用于设计eDP转LVDS转换器,怎么样设计一款低成本低BOM简单的DP转LVDS的转接设置,目前有一款可以替代兼容CH7511的方案电路,并且其设计电路整体BOM成本较低,并且设计简 ...

  3. Java实习生常规技术面试题每日十题Java基础(五)

    目录 1.启动一个线程是用run()还是start()? . 2.线程的基本状态以及状态之间的关系. 3.Set和List的区别,List和Map的区别? 4.同步方法.同步代码块区别? 5.描述Ja ...

  4. Java初学者作业——编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数。

    返回本章节 返回作业目录 需求说明: 编写Java程序,根据输入的某个班级的学员成绩,计算该班级学员的平均成绩,要求输入班级的人数. 实现思路: 声明变量sum.count以及avg用于存储总成绩.班 ...

  5. Java高级程序设计笔记 • 【第4章 网络编程】

    全部章节   >>>> 本章目录 4.1 网络基础知识 4.1.1 IP地址 4.1.2 端口号 4.1.3 使用InetAddress 4.1.4 InetAddress 类 ...

  6. 分区命令(大于2TB的分区)

    注意:parted命令在恢复误删除的分区时候,容易失败的几点: (1)只划分一个分区.恢复失败 (2)划分了2个分区,但是没有格式化.直接删除一个分区,恢复也会失败. (3)做删除操作时候,如果同时删 ...

  7. 初识python 之 爬虫:爬取某网站的壁纸图片

    用到的主要知识点:requests.get 获取网页HTMLetree.HTML 使用lxml解析器解析网页xpath 使用xpath获取网页标签信息.图片地址request.urlretrieve ...

  8. Python_paramiko-与linux交互

    一.基础功能介绍 # coding=utf-8 import paramiko from time import sleep # 建立通信 transport = paramiko.Transport ...

  9. Spark词频前十的统计练习

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6815390070254600712/ 承接上一个文档<Spark本地环境实现wordCount单词计数> ...

  10. 学习Layui笔记-父窗口获取子窗口的radio

    最近学习layui,使用radio做单项选择的时候,发现layui无论怎么取值,都是默认取到第一个radio的值. 百度下找解决方法. html页面部分 <div class="lay ...