一个示例学习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.rhkb.cn/news/352119.html

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

相关文章

WebGIS如何加载微件

本篇文章以加载切换底图微件做示范 首先&#xff0c;添加require "esri/widgets/ScaleBar",//比例尺"esri/widgets/Legend",//图例"esri/widgets/basemapGallery" 然后添加加载切换底图的组件代码 const basemapGallery new BasemapGallery(…

SaaS产品运营|一文讲清楚为什么ToB产品更适合采用PLG模式?

在数字化时代&#xff0c;ToB&#xff08;面向企业&#xff09;产品市场的竞争愈发激烈。为了在市场中脱颖而出&#xff0c;许多企业开始转向PLG&#xff08;产品驱动增长&#xff09;模式。这种模式以产品为核心&#xff0c;通过不断优化产品体验来驱动用户增长和业务发展。本…

一个开源的快速准确地将 PDF 转换为 markdown工具

大家好&#xff0c;今天给大家分享的是一个开源的快速准确地将 PDF 转换为 markdown工具。 Marker是一款功能强大的PDF转换工具&#xff0c;它能够将PDF文件快速、准确地转换为Markdown格式。这款工具特别适合处理书籍和科学论文&#xff0c;支持所有语言的转换&#xff0c;并…

语义分割和目标检测的关系

目录 1.语义分割的目标 2.目标检测的目标 3.两种任务的异同之处 从大方向的任务特点上来说 &#xff08;1&#xff09;物体的位置 &#xff08;2&#xff09;物体的分类 从数据格式来说 (1&#xff09;语义分割的数据格式 (2&#xff09;目标检测的数据格式 1.语义分…

Ollama:本地部署大模型 + LobeChat:聊天界面 = 自己的ChatGPT

本地部署大模型 在本地部署大模型有多种方式&#xff0c;其中Ollama方式是最简单的&#xff0c;但是其也有一定的局限性&#xff0c;比如大模型没有其支持的GGUF二进制格式&#xff0c;就无法使用Ollama方式部署。 GGUF旨在实现快速加载和保存大语言模型&#xff0c;并易于阅读…

如何通过Appium连接真机调试

1、打开appium&#xff0c;点击启动appium服务器&#xff08;如图1&#xff09; 2、appium启动成功后&#xff0c;点击放大镜启动检查会话&#xff08;如图2&#xff09; 3、填写真机设备信息和APP的package、activity,点击启动会话&#xff08;如图3&#xff09; 4、打开运行A…

vscode 连接 GitHub

目录 vscode连接github一、解决 github 登录问题二、通过 SSH 连接 github1、只有一个 git 账号2、切换 git 账号3、在两个账号之间切换 vscode 连接 gitee一、通过 HTTPS 连接二、通过 SSH 连接 vscode连接github 在 vscode 中首次使用 git push 命令时会要求输入 github 账户…

梳理Y3游戏编辑器入门者需要明白的基础概念

前言 Y3编辑器是网易开发的一款类似于“War3地图编辑器”的产品。 最近KK对战平台上不少热门的RPG地图都出自Y3编辑器&#xff1a; 最近我花了些时间学习了这款编辑器的基础知识。我发现其中很多概念是比较抽象需要理解的&#xff0c;而有些概念比如“物件”、“物体”、“物…

vue2实现一个简易实用的日历(可特殊标记多个日期)

效果如下&#xff1a; <template><div class"calendar"><div class"header"><button click"previousMonth"><</button><h2>{{ currentYear }}-{{ currentMonth }} </h2><button click"nex…

成都爱尔胡建斌院长提醒一张眼底照,眼病早知道

眼底藏在眼睛后方&#xff0c;平时没注意无察觉&#xff0c;其实非常重要。它包含的部位多掌控着视觉问题&#xff0c;稍不注意就是视觉受损&#xff0c;视觉缺失&#xff0c;严重的甚至失明致盲。 眼球前面的角膜、晶体等&#xff0c;被称为眼前段&#xff0c;后面则被称之为…

-------------------------面试散文-----------------------------------

问题1&#xff1a;vue中动态引入图片&#xff0c;为什么使用require&#xff1f; 回答&#xff1a;因为动态添加的src 编译过后的文件地址和被编译过后的资源文件地址不一致&#xff0c;从而导致无法访问题 而使用require 返回的就是资源文件被编译后的文件地址&#xff0c;从…

kafka在windows上的启动

启动zookeeper 解压kafka安装包到对应目录下&#xff0c;找到对应config目录下的zookeeper.properties文件 新建一个data文件夹&#xff0c;随便放哪 打开该文件&#xff0c;找到 dataDir/tmp/zookeeper 属性 将原来的属性值&#xff0c;修改为新建data文件夹地址&#xff0c;…

虚拟声卡实现音频回环

虚拟声卡实现音频回环 一、电脑扬声器播放声音路由到麦克风1. Voicemeeters安装设置2. 音频设备选择 二、回声模拟 一、电脑扬声器播放声音路由到麦克风 1. Voicemeeters安装设置 2. 音频设备选择 以腾讯会议为例 二、回声模拟 选中物理输入设备“Stereo Input 1”和物理输出设…

Excel小技巧| 批量多列多行转为一列

前期刘小生Star分享了Excel批量一列转多列多行&#xff0c;你学会了嘛&#xff01; 前期刘小生遇到需“对多列对行数据合并并找到唯一不重复的信息”&#xff0c;今天举一反三&#xff0c;继续沿用“替换等号”方法&#xff0c;将多列多行转为一列&#xff01; 下面一个模拟案…

东理咨询交流论坛系统

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技术、B/S架构 工具&#xff1a;MyEclipse 系统展示 首页 管理员功能…

fs.1.10 ON rockeylinux8 dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 rockeylinux8 docker上编译安装fs.1.10的流程记录&#xff0c;本文使用dockerfile模式。 环境 docker engine&#xff1a;Version 24.0.6 rockylinux docker&#xff1a;8 freeswitch&#xff1a;v1.10.7 dockerfi…

linux 安装sftp及使用sftp上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务&#xff1a; sudo yum install openssh-server2.启动 SSH 服务&#xff0c;并设置为开机启动&#xff1a; sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户&#xff0c;用于SFTP连接&#xff08;替换your_…

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

数据结构进阶——AVL树

数据结构进阶——AVL树 0. 前言1. AVL树的概念2. AVL树节点&#xff0c;和树的定义3. AVL树的插入4. AVL树的旋转5. AVL树的验证6. AVL树的删除&#xff08;了解&#xff09;7. AVL树实现完整代码8. AVL树的性能 0. 前言 学习本章&#xff0c;需要大家先掌握搜索二叉树&#xf…

python GUI开发: tkinter事件处理的几种方式详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…