吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 696|回复: 11
收起左侧

[已解决] 求指导:函数调用的压栈为什么总是ebx、esi、edi

[复制链接]
HackYike 发表于 2024-3-22 22:25
本帖最后由 HackYike 于 2024-3-23 10:53 编辑

刚开始看堆栈变化的时候没太关注,有点想当然了,在裸函数部分突然意识到函数调用后的总是有以下的一些代码,其他的我都了解它想做什么,好奇为什么压到栈里的总是ebx、esi、edi,这几个寄存器是有什么特殊功能吗?求指导

[Asm] 纯文本查看 复制代码
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 48             sub         esp,48h
00401026 53                   push        ebx
00401027 56                   push        esi
00401028 57                   push        edi
00401029 8D 7D B8             lea         edi,[ebp-48h]
0040102C B9 12 00 00 00       mov         ecx,12h
00401031 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401036 F3 AB                rep stos    dword ptr [edi]

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

DEATHTOUCH 发表于 2024-3-22 23:00
在x86下,eax、edx、ecx这三个是易失寄存器,被调用方不需要保存和恢复,但是ebx、esi、edi是非易失寄存器,被调方需要保存和恢复,esp和ebp是栈用途的寄存器。

免费评分

参与人数 1热心值 +1 收起 理由
HackYike + 1 如果条件允许,期待您进一步解惑!

查看全部评分

Vvvvvoid 发表于 2024-3-22 23:41
约定的吧
寄存器就那么几个, 每个方法栈都排着队用;
但是 a 用完 给 b , push
b 用完返回给 a 的时候要保证返回的时候跟给你的时候,保证一样; pop
至少不要影响我计算我的局部变量的位置;

免费评分

参与人数 1吾爱币 +1 收起 理由
HackYike + 1 热心回复!最低等级评分额度用光了……

查看全部评分

 楼主| HackYike 发表于 2024-3-22 23:53
DEATHTOUCH 发表于 2024-3-22 23:00
在x86下,eax、edx、ecx这三个是易失寄存器,被调用方不需要保存和恢复,但是ebx、esi、edi是非易失寄存器 ...

感谢解答,我搜索了一下易失寄存器,所以换大白话就是编译器躺平了,反正eax、edx、ecx易失,索性就不管它,把不易失的几个保存一下?我好奇的就是为什么单挑这几个压到栈里去,是它就这么规定的,还是有什么不时之需,因为有些时候最后pop出来也没用上……
 楼主| HackYike 发表于 2024-3-22 23:58
Vvvvvoid 发表于 2024-3-22 23:41
约定的吧
寄存器就那么几个, 每个方法栈都排着队用;
但是 a 用完 给 b , push

初学,有些表达还看不太懂,而且我遇到的局部变量都是放到缓冲区的,好像也和ebx、esi、edi的压栈关系不太强
DEATHTOUCH 发表于 2024-3-23 00:59
实际上这是人为规定的,通常是操作系统。
我看了一下Intel手册第一卷的6.4.3节,提供了多种解决办法,包括寄存器和栈。
再看一下Linux在x86的系统调用约定:https://syscalls.w3challs.com/?arch=x86,就是用7个寄存器来传参的。
fengliuyang 发表于 2024-3-23 01:04
看不懂最后一部分,解答不了
alicc 发表于 2024-3-23 01:20
x32里面全靠一级级压入参数,x64随便浪
alicc 发表于 2024-3-23 01:21
HackYike 发表于 2024-3-22 23:53
感谢解答,我搜索了一下易失寄存器,所以换大白话就是编译器躺平了,反正eax、edx、ecx易失,索性就不管 ...

每个寄存器有不同自己的作用,不叫易失
爱飞的猫 发表于 2024-3-23 05:32
本帖最后由 爱飞的猫 于 2024-3-24 00:33 编辑

可以参考 MSDN 文档

x86 体系结构具有多个不同的调用约定。 幸运的是,它们都遵循相同的寄存器保留和函数返回规则:

  • 函数必须保留所有寄存器,eaxecxedx 除外(可以在函数调用中更改)和 esp(必须根据调用约定进行更新)。
  • 如果结果为 32 位或更小, 则 eax 寄存器接收函数返回值。 如果结果为 64 位,则结果存储在 edx:eax 这两个寄存器中,edx 为高 32 位。

因为函数需要确保 ebx/esi/edi/ebp 等寄存器在函数退出时的值和进入时一致。所以你能更常看到 push ebx 却少见 push eax / pop eax 组合。

免费评分

参与人数 1热心值 +1 收起 理由
HackYike + 1 谢谢@Thanks!

查看全部评分

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 10:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表