一个示例学习C语言到汇编层面

给出以下代码

#include<stdio.h>
int main() {int x = 0, y = 0, z = 0;while (1) {x = 0;y = 1;do {printf("%d\n", x);z = x + y;x = y;y = z;} while (x < 255);}return 0;
}

我们把这个程序编写成32位程序,然后我们放入IDA中进行分析
在这里插入图片描述

.text:00801870 ; Attributes: bp-based frame
.text:00801870
.text:00801870 ; int __cdecl main()
.text:00801870 _main           proc near               ; CODE XREF: _main_0↑j
.text:00801870
.text:00801870 var_24          = byte ptr -24h
.text:00801870 z               = dword ptr -20h
.text:00801870 y               = dword ptr -14h
.text:00801870 x               = dword ptr -8
.text:00801870
.text:00801870                 push    ebp
.text:00801871                 mov     ebp, esp
.text:00801873                 sub     esp, 0E4h
.text:00801879                 push    ebx
.text:0080187A                 push    esi
.text:0080187B                 push    edi
.text:0080187C
.text:0080187C __$EncStackInitStart_1:
.text:0080187C                 lea     edi, [ebp+var_24]
.text:0080187F                 mov     ecx, 9
.text:00801884                 mov     eax, 0CCCCCCCCh
.text:00801889                 rep stosd
.text:0080188B
.text:0080188B __$EncStackInitEnd_1:                   ; JMC_flag
.text:0080188B                 mov     ecx, offset _C91CCFE8__@cpp
.text:00801890                 call    j_@__CheckForDebuggerJustMyCode@4 ; __CheckForDebuggerJustMyCode(x)
.text:00801895                 mov     [ebp+x], 0
.text:0080189C                 mov     [ebp+y], 0
.text:008018A3                 mov     [ebp+z], 0
.text:008018AA
.text:008018AA loc_8018AA:                             ; CODE XREF: _main+80↓j
.text:008018AA                 mov     eax, 1
.text:008018AF                 test    eax, eax
.text:008018B1                 jz      short loc_8018F2
.text:008018B3                 mov     [ebp+x], 0
.text:008018BA                 mov     [ebp+y], 1
.text:008018C1
.text:008018C1 loc_8018C1:                             ; CODE XREF: _main+7E↓j
.text:008018C1                 mov     eax, [ebp+x]
.text:008018C4                 push    eax
.text:008018C5                 push    offset _Format  ; "%d\n"
.text:008018CA                 call    j__printf
.text:008018CF                 add     esp, 8
.text:008018D2                 mov     eax, [ebp+x]
.text:008018D5                 add     eax, [ebp+y]
.text:008018D8                 mov     [ebp+z], eax
.text:008018DB                 mov     eax, [ebp+y]
.text:008018DE                 mov     [ebp+x], eax
.text:008018E1                 mov     eax, [ebp+z]
.text:008018E4                 mov     [ebp+y], eax
.text:008018E7                 cmp     [ebp+x], 0FFh
.text:008018EE                 jl      short loc_8018C1
.text:008018F0                 jmp     short loc_8018AA
.text:008018F2 ; ---------------------------------------------------------------------------
.text:008018F2
.text:008018F2 loc_8018F2:                             ; CODE XREF: _main+41↑j
.text:008018F2                 xor     eax, eax
.text:008018F4                 pop     edi
.text:008018F5                 pop     esi
.text:008018F6                 pop     ebx
.text:008018F7                 add     esp, 0E4h
.text:008018FD                 cmp     ebp, esp
.text:008018FF                 call    j___RTC_CheckEsp
.text:00801904                 mov     esp, ebp
.text:00801906                 pop     ebp
.text:00801907                 retn
.text:00801907 _main           endp
.text:00801907

下图部分这一部分,属于编译器包装的,对程序的初始化
这里我们先不做研究
在这里插入图片描述以下这一段可以很明显看出对x,y,z
进行了初始化
在这里插入图片描述
所对应的部分
在这里插入图片描述
x和y在循环里的赋值如图
在这里插入图片描述
在这里插入图片描述
对于中间的循环部分
在这里插入图片描述
在这里插入图片描述
以上是大概的分析,接下来,我们进行细致的分析
在这里插入图片描述
当然了,在实际中,逆向分析的难度是很大的,这里只是方便大家理解学习,所以给了一个十六

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql开启查询日志(General Log)

1、增加配置&#xff1a; /etc/my.cnf [mysqld] general_log1 general_log_file/var/log/mysql/query.log 2、增加目录和文件&#xff0c;并且授权 可以使用以下命令修改权限&#xff1a; 创建目录&#xff1a;sudo mkdir -p /var/log/mysql 更改目录所有者&#xff1a;sudo…

okcc呼叫中心系统如何对客户进行按键标记?呼叫系统搭建

要在OKCC呼叫中心系统中对客户进行按键标记&#xff0c;可以按照以下步骤操作&#xff1a; 登录系统&#xff1a;首先&#xff0c;使用管理员或具有相应权限的账户登录OKCC呼叫中心系统。 搜索客户&#xff1a;在系统的主界面或客户管理界面&#xff0c;通过搜索功能找到需要标…

【日常记录】【插件】prisma 链接MySQL数据库 简单入门

文章目录 1、新建项目&#xff0c;使用prisma链接数据库1.1、先创建一个项目1.2、初始化 npm 配置文件及下载依赖1.3、初始化TS配置文件1.4、初始化 prisma1.5、更改 prisma/schema.prisma1.6 更改.env 文件1.7 编写 prisma/schema.prisma1.8 将编写的 prisma/schema.prisma 映…

OSPF被动接口配置(华为)

#交换设备 OSPF被动接口配置 一、基本概念 OSPF被动接口&#xff0c;也称为抑制接口&#xff0c;即将路由器某一接口配置为被动接口后&#xff0c;该接口不会再接受和发送OSPF报文 二、使用场景 在路由器与终端相近或者直接相连的一侧配置被动接口 因为OSPF会定期发送报文…

ensp防火墙web密码重置(前提通过console可以登录)

客户电脑是命令行没有用户名直接输入密码就可以登录了&#xff0c;但是web端不知道admin的密码 前两天遇到运维单位的一台防火墙web网页不知道用户名密码&#xff0c;默认的登录不了&#xff0c;但是通过console可以登录命令行&#xff0c;今天就记录下如何通过命令行修改web页…

海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果

前言 第一次使用海康视觉算法平台VisionMaster 4.3.0&#xff0c;项目中要使用这个平台进行视觉处理并获取结果。 运行效果 开发环境 C#&#xff0c; WPF&#xff0c; vs2022, 海康视觉算法平台VisionMaster 4.3.0 基本概念 上图这些.sol为后缀的是vm的方案文件。 打开方案文…

NSNumber转float或double类型避免小数点后补0

问题 假设NSNumber初始值是12&#xff0c;直接采用 [NSString stringWithFormat:"%f", number.doubleValue] ; str的值为12.0000000 解决方法 采用一下方法可以避免补0情况 NSNumber *number [NSNumber numberWithFloat:12]; NSNumberFormatter *formatter […

鸿蒙开发过程中出现很多.js或者.js.map怎么办

学习HarmonyOS应用开发已有几天了, 今天在打开DevEco Studio正常开发的过程中, 预览、修改、刷新, 然后就出现了大量的.js以及.js.map文件 这个虽然不影响开发&#xff0c;但是影响体验 问题原因&#xff1a; 编译/预览过程产生的缓存文件, 已反馈给鸿蒙的IDE团队 解决办法…

ollama部署文字转sql,并使用fastapi提供外部接口访问

根据你提供的官方文档中的调用方法&#xff0c;可以使用 Ollama 的 chat 方法来与模型进行交互。我们将调整 FastAPI 应用代码以使用 ollama 模块的 chat 方法。 1. 安装必要的库 确保你已经安装了 FastAPI 和 Ollama Python 客户端库&#xff1a; pip install fastapi uvic…

树莓派pico入坑笔记,快捷键键盘制作

使用usb_hid功能制作快捷键小键盘&#xff0c;定义了6个键&#xff0c;分别是 ctrlz ctrlv ctrlc ctrla ctrlw ctrln 对应引脚 board.GP4, board.GP8, board.GP13 board.GP28, board.GP20, board.GP17 需要用到的库&#xff0c;记得复制进单片机存储里面 然后是main主程…

3dmax2025能用云渲染吗?2025最新云渲染渲染100使用方法

3dmax2025还没用上云渲染&#xff1f;简单3步用上云渲染。 第一步&#xff0c;打开浏览器搜索渲染100&#xff0c;并进入下载客户端并安装 第二步&#xff0c;打开已安装的客户端进行安装&#xff0c;点击登录&#xff0c;未登录注册个账号即可&#xff08;注册账号时邀请码填…

记录一下GMT时间转北京时间

GMT时间比北京时间慢8小时 1. dayjs import dayjs from dayjs dateFormat () (value: Parameters<typeof dayjs>[0],format YYYY-MM-DD HH:mm:ss) > (value ? dayjs(value).format(format) : )2. new Date timeDate(time){return new Date(time) // time 必须是字…

Sermant标签路由能力在同城双活场景的应用

作者&#xff1a;聂子雄 华为云高级软件工程师 摘要&#xff1a;目前应用上云已成为趋势&#xff0c;用户也对应用在云上的高可靠方案有更高追求&#xff0c;目前同城双活场景作为应用高可靠方案中的一种常见实践方案&#xff0c;对微服务流量提出了数据中心亲和性的要求&…

浙江电信联合中兴通讯取得新突破,完成融合边缘商用验证

前不久&#xff0c;浙江电信联合中兴通讯在融合边缘方面取得新突破&#xff0c;在嘉兴完成了融合边缘的商用验证&#xff0c;并发布了商用版本。接下来&#xff0c;双方在融合边缘方面正式进入商用阶段&#xff0c;有效赋能新质生产力。    随着数字经济的快速发展&#xff0…

数据结构与算法笔记:基础篇 -字符串匹配(下):如何借助BM算法轻松理解KMP算法?

概述 上篇文章讲了 BM 算法&#xff0c;尽管他复杂&#xff0c;也不好理解&#xff0c;但确实工程中非常好用的一种高效字符串匹配算法。有统计说&#xff0c;它是最搞笑、最常用的字符串匹配算法。不过&#xff0c;在所有的字符串匹配算法里&#xff0c;要说最知名的一种的话…

【C++】认识STL

【C】认识STL STL的概念STL的版本STL的六大组件STL的三个境界STL的缺陷 STL的概念 SLT(standard template libaray-标准模板库)&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的组件库&#xff0c;而且是一个保罗数据结构与算法的软件框架。 STL的版本 原…

便携式手持气象仪:低功耗设计

TH-LSZ05便携式手持气象仪是一款轻便、操作简便的气象监测工具&#xff0c;集成了风向、风速、大气压、温度、湿度五项气象要素的测量功能。这些设备通常设计为体积小、重量轻&#xff0c;以便于用户随时携带并使用。通过使用手持气象仪&#xff0c;用户可以实时获取关键的气象…

列表(list)(Python)

文章目录 一、定义二、列表常用操作 一、定义 list ["张三", "李四", "王五", "赵六"]二、列表常用操作 分类关键字/函数/方法说明增加列表.append(值)在列表末尾追加值列表.insert(索引&#xff0c; 值)在指定位置插入值&#xff…

Android Root全教程

1.安装指定镜像&#xff1a;https://blog.csdn.net/weixin_43846562/article/details/130028258 2.安装 magisk&#xff1a;https://blog.csdn.net/qq1337715208/article/details/115922514 3.打开 adb root&#xff1a;https://liwugang.github.io/2021/07/11/magisk_enable…

如何训练一个企业邮局系统区分垃圾邮件和非垃圾邮件的私有化模型?用于提高企业的沟通效率

训练一个企业邮局系统区分垃圾邮件和非垃圾邮件涉及多个步骤和技术。以下是一个基本的流程&#xff1a; 1. 数据收集 获取邮件数据 收集样本&#xff1a;获取大量的历史邮件数据&#xff0c;包括标记为垃圾邮件和非垃圾邮件的邮件。标签数据&#xff1a;确保数据集中的每封邮…