X32位汇编和X64位区别无参函数分析(一)

news2024/11/14 11:03:06

前言

一、X32汇编函数无参无返回分析

二、X64汇编函数无参无返回分析

总结


前言

提示:以下是个人学习总结:如有错误请大神指出来,只供学习参考,本内容使用使用VS2017开发工具:语言是C++,需要一些常见的汇编指令,寄存器的概念,不会的可以看下其他的博主的,我用的这里方便学习全程debug,函数用的默认C++cdecl调用约定模式(可以网上查下调用约定,右边入参到左边,称为外平栈)。


好久没更新博客了,准备把汇编自我总结复习的顺带把过程记录下来,接下来开始吧,准备简单的无参函数。

一、X32汇编函数无参无返回分析

1.代码图片(示例):

不知道为什么不能赋值图这里直接赋值代码了。
#include <iostream>



void shenjianxz() {
    int a;
    int c;
    int d = 3;
    int d2 = 4;
    a = d - d2;
}

int main()
{
    shenjianxz();


}

0099179E call        00991131 这个就是上面那个简单shenjianxz()函数调用,

CPU主要执行的是根据EIP执行跳转的,

call指令会 push 009917A3 压栈 :因为我们调用完函数返回的时候会取这个地址,跳转到下一行执行的代码,  EIP寄存器=00991131

现在我们跳去看看按F11

这里 jmp    中间跳转程序空间保存的函数地址    00EA1750,咱们先不管,这不是重点

简单解下:jmp 只改变eip地址,cpu会自动运行到执行的地址去,在点下F11进入 调用函数代码区了。

重点关注下:ESP寄存器到哪了,EBP寄存器值等于多少。

我讲解下上面代码含义:

shenjianxz
009918F0  push        ebp  

保留ebp 寄存器
009918F1  mov         ebp,esp  
为了后面恢复esp栈顶位置把他赋值给ebp进行操作
009918F3  sub         esp,0F0h  

因为前面已经保存了esp的赋值,就不担心这里esp就开始扩展0F0h 位置esp位置肯定就变了
009918F9  push        ebx  
009918FA  push        esi  
009918FB  push        edi  
保留 ebx,esi,edi 寄存器位置
009918FC  lea         edi,[ebp-0F0h]  

这里ebp的作用就体现了,最前面我们不是把esp赋值给了ebp吗,
这里就代表把sub         esp,0F0h  地址赋值给edl

00991902  mov         ecx,3Ch    3c次数
00991907  mov         eax,0CCCCCCCCh  
0099190C  rep stos    dword ptr es:[edi]  
重复3c次把occccccch=int 3先不用管,就理解是ccccccc赋值给edi 每次成功赋值就 edi+4
0099190E  mov         dword ptr [ebp-20h],3  
00991915  mov         dword ptr [ebp-2Ch],4  
0099191C  mov         eax,dword ptr [ebp-20h]  
0099191F  sub         eax,dword ptr [ebp-2Ch]  

ebp的位置是push ebp的位置,之后不是 ebp=esb 下一句不是 sub         esp,0F0h  扩展了0f0的大小空间么
那么ebp-20,-2c都是在扩展的位置区间,可见X32是ebp-N代表取局部变量

00991922  mov         dword ptr [ebp-8],eax  
最终把结果放到ebp-8内存中
00991925  pop         edi  
00991926  pop         esi  
00991927  pop         ebx  
因为esp一直在栈顶所以还原3个寄存器 esp-Ch位置
00991928  mov         esp,ebp  
esp已经距离很远了,因为扩展了0F0h大小字节,所以用ebp恢复esp位置esp在 push ebp位置了
0099192A  pop         ebp  
恢复ebp栈底
0099192B  ret  
之前我们用call 调用的函数,这里面push的是 call的下一条代码地址=pop eip 让cpu跳转到eip位置,下面是对应的自己画的图:

2.小结:
    1:X32是先保留push ebp寄存器,在扩展堆栈大小
    2:mov         ebp,esp 保留栈顶位置,方便后面恢复
    3:[ebp-20],[ebp-2c]都是在扩展的位置区间,可见X32是ebp-N代表取局部变量,参数获取(这里演示无参数)

二、X64汇编函数无参无返回分析

1.代码图片(示例)

同样的代码看不同:

前面讲过,这里也是jmp方式跳转到函数代码快,继续F11跟进去,因为中间重启过地址发生变化,直接看下面的函数内容就行

00007FF7CA1717C0  push        rbp  
00007FF7CA1717C2  push        rdi  
00007FF7CA1717C3  sub         rsp,168h  
00007FF7CA1717CA  lea         rbp,[rsp+20h]  
00007FF7CA1717CF  mov         rdi,rsp  
00007FF7CA1717D2  mov         ecx,5Ah  
00007FF7CA1717D7  mov         eax,0CCCCCCCCh  
00007FF7CA1717DC  rep stos    dword ptr [rdi]  
这里是重复ecx的次数填充栈顶开始往回每次 rdi+4
00007FF7CA1717DE  lea         rcx,[__D730393F_c@cpp (07FF7CA181027h)] 
00007FF7CA1717E5  call        __CheckForDebuggerJustMyCode (07FF7CA171087h)
这2行 因为是debug模式是检测堆栈的直接跳过看下面的  
00007FF7CA1717EA  mov         dword ptr [rbp+44h],3  
00007FF7CA1717F1  mov         dword ptr [rbp+64h],4  
RBP+N 代表局部变量,在X32中是EBP-N代表局部变量,那么这里就是把立即数赋值给局部变量
我的理解因为之前 扩展168h,rsp,168h 
这里局部变量不能>rbp+148h大小范围,因为rsp+20了之前,大于了下一条就到了push rdi的位置了

00007FF7CA1717F8  mov         eax,dword ptr [rbp+64h]  
00007FF7CA1717FB  mov         ecx,dword ptr [rbp+44h]  
看这里rbp+64 ,+44都是在扩展的局部变量赋值,在范围内
00007FF7CA1717FE  sub         ecx,eax  
00007FF7CA171800  mov         eax,ecx  
00007FF7CA171802  mov         dword ptr [rbp+4],eax  
最后把值赋值给局部变量rbp+4
00007FF7CA171805  lea         rsp,[rbp+0000000000000148h]  
之前rsp-168h,然后rbp+20 这里在加个148h 不就回去了最早的push RDI位置
00007FF7CA17180C  pop         rdi  
00007FF7CA17180D  pop         rbp  
这里就是恢复 RDI RBP里的值
00007FF7CA17180E  ret  这里pop eip 让cpu跳转到调用程序下一条指令执行

 


三、X32位汇编和X64位区别无参函数调用

总结

提示:可以看下对比堆栈图变化和我说的文字区别

X32:
    1:X32是先保留push ebp寄存器,在扩展堆栈大小
    2:mov         ebp,esp 保留栈顶位置,方便后面恢复
    3:[ebp-20],[ebp-2c]都是在扩展的位置区间,可见X32是ebp-N代表取局部变量,参数获取(这里演示无参数)

X64:

   1:X64是先扩展栈顶大小,在进行保留寄存器
    2:EBP+N是获取局部变量
    3:EBP+20=ESP+20,后用EBP进行局部变量赋值,参数获取(这里演示无参数)

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

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

相关文章

数据库管理-第112期 Oracle Exadata 03-网络与ILOM(20231020)

数据库管理-第112期 Oracle Exadata 03-网络与ILOM&#xff08;202301020&#xff09; 在Exadata中&#xff0c;除了对外网络以外&#xff0c;其余网络都是服务于一体机内部各组件的网络&#xff0c;本期对这些网络的具体情况和硬件管理相关做一个讲解。 1 网络分类 1.1 生产…

工业交换机选购标准,你知道多少?

工业交换机是专门针对灵活多变的工业应用需求而设计的&#xff0c;旨在为工业以太网通讯提供高性价比的解决方案。当我们选购工业交换机时&#xff0c;有哪些选购标准呢&#xff1f; 一、工业交换机选购标准&#xff1a; 1、考虑到工作环境的因素 这些内容包括温度范围、电磁…

前端 js 之 浏览器工作原理 和 v8引擎 01

嘿&#xff0c;老哥&#xff0c;来了就别跑 &#xff01;学完 &#xff0c;不亏 &#x1f602; 文章目录 一、输入url 之后做了什么二、简单了解下浏览器内核三、浏览器渲染过程 &#xff08;渲染引擎&#xff09;四、js 引擎五、chrome五、v8 引擎原理八、浏览器性能优化九、前…

学会C++之后,为什么学任何语言都会更加容易?

学会C之后&#xff0c;为什么学任何语言都会更加容易&#xff1f; 编程的本质是把自然语言翻译为机器语言&#xff0c;但机器没有联想力&#xff0c;所以它需要编写者事无巨细地告诉它怎么做。最近很多小伙伴找我&#xff0c;说想要一些c语言资料&#xff0c;然后我根据自己从业…

家电电器小程序商城的作用是什么

随着人们生活提升&#xff0c;各式家电类型非常多&#xff0c;优化了人们生活日常&#xff0c;入局的大中小品牌也非常多&#xff0c;人们可以在商场、商圈或线上电商平台找到自己所需的电器家电产品。 无论大件还是小件&#xff0c;消费者的选择性非常广&#xff0c;对品牌或…

第二证券:跌破3000点,热搜第一!

今天上午&#xff0c;“沪指开盘跌破3000点关口”冲上百度热搜榜榜首。 上午收盘&#xff0c;上证指数下跌0.27%&#xff0c;报2997.22点&#xff1b;深证成指下跌0.36%&#xff0c;创业板指下跌0.44%。 赛道股发力&#xff0c;光伏、风电、新能源轿车等板块盘中冲高。房地产…

【控制系统】PID(学习笔记)

一、PID概要 1、引入 流量稳定、调整流量 2、适用系统 二阶以内的线性系统 线性系统&#xff1a;满足齐次性和叠加性 齐次性&#xff1a; y f ( x ) yf(x) yf(x) 则 k y f ( k x ) kyf(kx) kyf(kx) 叠加性&#xff1a; y 1 f ( x 1 ) , y 2 f ( x 2 ) y_1f(x_1),y_2f(x…

[linux] 把txt文本文件分成10个子文件,并保存。 linux命令

您可以使用split命令将文件分割成多个子文件。以下是使用split命令将"zh_for_translate5k.txt"文件分割成10个子文件的示例命令&#xff1a; split -l $(( $(wc -l < zh_for_translate5k.txt) / 10 )) zh_for_translate5k.txt sub_file_

同城便民信息分类小程序H5开发

一款适合同城使用的便民信息服务发布小程序&#xff0c;程序经过多代版本更新以后&#xff0c;功能更丰富完善&#xff0c;使用体验更好。支持saas和独立部署。 核心能力&#xff1a;商户浏览、同城配置管理、商家管理设置、帖子管理设置、用户设置管理、会员卡管理、商品管理…

2023年全球及中国环球影城主题公园数量、游客人数及收入分析[图]

环球影城主题公园是以电影为核心的主题游乐园&#xff0c;目前全球共5家&#xff0c;分别位于美国洛杉矶、奥兰多&#xff0c;日本大阪&#xff0c;新加坡圣淘沙岛以及中国北京。 2022年全球环球影城主题公园游客总数为5927.5万人次&#xff1b;其中日本环球影城游客数为1235.0…

安全带、登山绳、登山扣标准认证以及模版标签讲解

安全带、登山绳、登山扣标准认证以及模版标签讲解 一、安全带 安全带是指作业人员在户外或高空等场景下配戴的安全保护装备。为分散坠落防护时产生的对于人体大腿上部、骨盆、胸部以及肩部的压力&#xff0c;常见的装备类型为腰带式安全带和背带式安全带两种。坠落防护安全装…

Spring framework :基于 jdk 动态代理实现连接池复用

前言 在数据库开发中&#xff0c;连接池是一种重要的技术手段&#xff0c;它可以提高数据库连接的复用性和性能。连接池的原理是在应用启动时创建一定数量的数据库连接&#xff0c;并将这些连接保存在一个池中&#xff0c;应用程序需要数据库连接时&#xff0c;从连接池中获取…

智能巡检系统有什么特点和功能?它是如何推动企业高效管理?

随着科技的快速发展&#xff0c;智能化管理逐渐成为各行各业的重要发展方向。巡检工作作为企业管理中的重要环节&#xff0c;智能巡检系统综合平台正逐渐成为关注的焦点。本文将从功能、特点和应用场景三个方面&#xff0c;详细解析“的修”工单管理系统的优势和价值。 一、智能…

什么是美颜sdk?直播实时美颜sdk的工作流程和架构分析

在现代社交媒体和娱乐行业中&#xff0c;直播已经成为了一种受欢迎的娱乐形式&#xff0c;同时实时美颜也变得越来越重要。直播实时美颜SDK的工作流程和架构在这一领域起到了关键作用。本文将深入探讨这些SDK的内部机制&#xff0c;从而理解它们如何为用户提供出色的美颜效果。…

推荐一种更高效的打字输入法——双拼输入法

简介 双拼&#xff08;也称双打&#xff09;是一种建立在拼音输入法基础之上的文字输入方法&#xff0c;可视为全拼的一种改进。它通过将每个汉字拼音的声母和韵母各自映射到某个按键上&#xff0c;使得每个汉字最多用两个按键表示&#xff0c;从而极大地提高了拼音输入法的输…

激光雷达反射率标定可提高自动驾驶道路安全

实现自动驾驶从辅助驾驶阶段到部分自动驾驶阶段&#xff0c;再到完全自动驾驶阶段&#xff0c;自动驾驶技术正在逐步实现。虽然完全自动驾驶技术仍需要时间来进一步发展和完善&#xff0c;但其所带来的可能性是无限的。激光雷达在自动驾驶中的应用非常广泛&#xff0c;它能够提…

请问嵌入式或迁移学习要学什么?

请问嵌入式或迁移学习要学什么&#xff1f; 学习嵌入式和迁移学习是一个很好的方向&#xff0c;尤其是在军I领域。以下是一些你可以提前学习的基本 知识和步骤: 嵌入式系统:最近很多小伙伴找我&#xff0c;说想要一些嵌入式资料&#xff0c;然后我根据自己从业十年经验&#…

大模型、实时需求推动湖仓平台走向开放

大模型、实时需求高涨 AGI 时代&#xff0c;以 ChatGPT、Midjourney 等为代表的大模型迅速应用加速了 AI 普及&#xff0c;越来越多的企业选择搭建自己的 AI 基础设施&#xff0c;训练行业大模型。 另一方面&#xff0c;企业为了在瞬息万变的市场环境中更快的做出商业决策&…

华为云文件上传(单个上传和分段上传)

首先引入静态文件&#xff1a; 华为云官网提供js下载的链接 然后后端提供一个公用接口&#xff0c;返回华为云上传的基本配置&#xff1a; 官网提供的链接&#xff1a;华为云obs信息配置 一&#xff1a;单个上传 huaweiyunUpload (file, fileName, name, url, size, callb…

外包干了3年,技术不进步还退了?

外包没有很高的工资是真不能干呀&#xff01;干了3年&#xff0c;把自己废了 先说情况&#xff0c;大专毕业&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近3年的&#xff08;点点点&#xff09;功能测试&#xff0c;今年年中&#xff0c;感觉自己不能够在这样…