程序集调用堆栈 - 术语问题

2023-12-02

我对 Assembly 完全陌生,希望确认以下陈述中我有误解并需要纠正的地方。

堆栈指针 (ESP) 指的是栈顶(最低内存地址)。

基指针 (EBP) 用于在构建堆栈帧时临时存储各种内存地址。它通常保存当前堆栈帧的最高内存地址。

指令指针 (EIP)指的是内存的文本(代码)段中一行代码的内存地址

一旦某些内容被推入堆栈,就无法就地更改。 IE。要是我们PUSH EBP到堆栈中,我们将当前值压入EBP,而不是某种引用或指向它的指针。我们无法就地更改该值。

传递给函数的参数通常被移动到地址空间中,该地址空间是堆栈指针的偏移量。 IE。[ESP-12].

当调用函数时(使用CALL),会发生以下情况:

  1. 返回地址被添加到堆栈(紧随当前地址的内存)EIP所以我们知道被调用的函数完成后要返回到哪里
  2. 保存的帧指针被添加到堆栈中,该指针通常是调用函数的堆栈帧的堆栈指针
  3. 然后我们将进入被调用函数的序言

谢谢。我正在努力解决这些问题。


传递给函数的参数通常被移动到地址空间中,该地址空间是堆栈指针的偏移量。 IE。 [ESP-12]。

通常参数被压入堆栈,before的电话。

push paramA  ; ( some 32bit value, register, whatever )
push paramB
call myFunct

这导致以下堆栈内容:

---------------
|    paramA   |
---------------
|    paramB   |
---------------
| return addr |   <-- ESP
--------------- 

由于返回地址(由call) 为 4 个字节,该函数的参数位于[ESP+4] and [ESP+8].

如果你的函数添加了一个堆栈帧,通常你会这样做

myFunct:  push EBP
          mov EBP, ESP

现在堆栈看起来像这样:

---------------
|    paramA   |
---------------
|    paramB   |
---------------
| return addr |   
---------------     
|   saved EBP |   <-- EBP, ESP
--------------- 

参数位于[EBP+8] and [EBP+12],即使您推送更多值(或为局部变量添加一些位置),因为EBP不再改变:

myFunct:  push EBP
          mov EBP, ESP
          sub ESP, 12      ; make room for 3 32bit local variables

          mov eax, [EBP+8] ; access one of the parameters
          mov [EBP-4], eax ; save it in local variable #1

rel |  rel |
to  |  to  |
ESP |  EBP |
----|------|--------------
+24 | +12  |    paramA   |
    |      |--------------
+20 | +8   |    paramB   |
    |      |--------------
+16 | +4   | return addr |  
    |      |--------------
+12 |      |   saved EBP |  <-- EBP   (is fixed here for now)
    |      |--------------- 
+8  | -4   |    local#1  |
    |      |--------------- 
+4  | -8   |    local#2  |
    |      | --------------- 
0   | -12  |    local#3  |  <--- ESP  (keeps growing, by pushing, calling etc)
           --------------- 

局部变量位于[EBP-4], [EBP-8], [EBP-12] etc.
退货地址位于[EBP+4]

注意:正如你所看到的,这是可能的

  • 通过访问ESP(然后你做not需要一个帧指针,但是您需要跟踪您推送了多少数据,以“查找”参数和变量)
  • or by EBP(ofc 增加了一些开销)。在许多函数中,根本不需要帧指针,并且由编译器优化掉。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序集调用堆栈 - 术语问题 的相关文章

  • GCC 内联 asm NOP 循环在编译时未展开

    走出我通常的 VC 领域 进入 GCC 的世界 通过 MINGW32 尝试创建一个主要由 NOP 组成的 Windows PE ala for i 0 i lt 1000 i asm nop 但要么我使用了错误的语法 要么编译器正在通过它们
  • LDR指令如何将常量加载到寄存器中?

    我刚刚读了一本ARM指令书 看到一条指令我无法解释 It says LDR将 32 位常量加载到r0登记 LDR r0 pc const number 8 pc const number DCD 0xff00ffff 我不明白什么 pc c
  • 如何在 Linux 中制作一个将文件转换为大写的 x86 汇编程序?

    我找到了一个名为 ProgrammingGroundUp 1 0 booksize pdf 的 pdf 文件 其中一个项目是制作一个汇编程序 该程序接收文件并将其转换为大写 section data CONSTANTS system cal
  • 编写一个新的 jit

    我有兴趣用 C 启动我自己的 JIT 项目 我对汇编或编译器设计等并不熟悉 但是 我对生成的机器代码格式非常不熟悉 比如 当一切都说了和完成后 mov 指令实际上是什么样子 是时候调用它了函数指针 那么 创建这样的东西的最佳资源是什么 编辑
  • 给寄存器赋值并加减

    我对此完全迷失了 我需要使用寄存器来计算以下表达式的编程 varA varA varB varC varD 其中 varA varB 等是变量 将整数值分配给上述变量的 EAX EBX ECX 和 EDX 寄存器 这意味着 您可以对输入进行
  • Linux 内核中是否使用了扩展指令集(SSE、MMX)?

    好吧 它们带来 至少应该带来 性能的巨大提升 不是吗 所以 我还没有看到任何 Linux 内核源代码 但很想问 它们是否以某种方式被使用 在这种情况下 对于没有此类指令的系统 必须有一些特殊的 代码上限 SSE 和 MMX 指令集在音频 视
  • 如何在Python中另一个类的函数中获取调用者类名?

    我的目标是模拟应用程序的序列图 为此我需要有关运行时调用者和被调用者类名的信息 我可以成功检索调用者函数 但无法获取调用者类名 Scenario caller py import inspect class A def Apple self
  • 如何创建一个扩展为“(x+y*240)*2”这样的表达式的 GNU GAS 宏?

    我正在使用 GAS 为 ARM Linux 构建一个程序 但我想做一些宏以使我的开发更加智能 然后我想知道 我怎样才能为此做一个宏 x y 240 2 were x and y are int 将像这样使用 mov r0 MACRO SHO
  • RISC-V反汇编器与秒杀运行结果不符?

    我已经设置了一个 hello world 程序只是为了测试我的riscv32 unknown elf工具链 spike pk等等虽然我设法使用打印了 hello worldspike isa RV32 pk hello elf 我发现如果我
  • 返回地址预测堆栈缓冲区与堆栈存储的返回地址?

    一直在阅读 Agner Fog 的 Intel AMD 和 VIA CPU 的微架构 他在第 34 页描述了 返回地址预测 http www agner org optimize microarchitecture pdf http www
  • 调用/返回/jmp等后x86代码执行?

    我希望这个问题不会太愚蠢 因为它看起来似乎很明显 当我对缓冲区溢出进行一些研究时 我偶然发现了一个简单的问题 调用 返回 跳转后转到新指令地址后 CPU是否会执行该地址处的OP代码 然后将一个字节移动到下一个地址并执行下一个OP代码 依此类
  • int 13h 42h 不会在 Bochs 中加载任何内容

    我将引导加载程序从 CHS 更改为 LBA 因此我更换了int 13h 02h with int 13h 42h 它在 QEMU 中工作正常 但是 我在 Bochs 和我的笔记本电脑上运行它时遇到问题 我将引导加载程序写入 USB 闪存驱动
  • 段错误...关于你好世界

    这段代码非常简单 但我在 x86 64 Linux 系统上遇到了段错误 这让我很烦恼 刚开始接触asm 请耐心等待 与 NASM 组装nasm f elf64 test asm 与连接ld o test test o SECTION tex
  • 与 SSE 比较 16 字节字符串

    我有 16 字节的 字符串 它们可能更短 但您可能会假设它们在末尾用零填充 但您可能不会假设它们是 16 字节对齐的 至少不总是 如何编写一个例程将它们与 SSE 内在函数进行比较 是否相等 我发现这个代码片段可能会有帮助 但我不确定它是否
  • 为什么 x86-64 上的 GCC 在函数内插入 NOP?

    给定以下 C 函数 void go char data char name 64 strcpy name data x86 64 上的 GCC 5 和 6 编译 普通gcc c g o其次是objdump 这到 00000000000000
  • GCC 从 C++ 程序生成的汇编代码中的 .cfi 和 .LFE 是什么?

    我有以下 C 代码 int factorial int n if n 0 return 1 return n factorial n 1 int main void factorial 5 return 0 当我使用 g S Factori
  • 在 x86 汇编语言中获取文件大小的简单方法

    假设我已经在汇编中打开了一个文件 并且在寄存器 eax 中有该文件的文件句柄 我将如何获取文件的大小 以便为其分配足够的缓冲区空间 我在这里研究了另一个讨论 建议使用sys fstat 28 系统调用来获取文件统计信息但无法实现它 My a
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • 查找用户输入中的第一个和最后一个大写字母

    输入将从 a z 或 A Z 中获取 并且输入以星号结束 我们需要将输入字符的第一个和最后一个大写字母作为输出 另外 我们应该显示每次输入的内容 注意 我们逐个字符地获取输入 而不是作为字符串 测试用例1 输入 aAbCcP 输出 AP 测
  • 汇编程序中的过程调用如何工作?

    我刚刚开始摆弄 ASM 我不确定我对过程调用的理解是否正确 假设代码中的某个时刻有一个过程调用 call dword ptr 123 该过程仅包含一个命令 ret ret 0004 该过程调用的效果是什么 返回值将存储在哪里 我在某处读到

随机推荐

  • 在 ie10 中强制浏览器和文档模式为 ie9

    这段代码 似乎只将文档更改为ie9而不是浏览器 除了按 F12 并手动更改之外 还有其他想法吗 站点无法设置浏览器模式 在浏览器从站点请求内容之前选择浏览器模式 这指定了站点如何识别浏览器 例如 UA 字符串 正如您所提到的 文档模式可以由
  • DataSet TableAdapter 抛出 OVER SQL 构造或不支持的语句

    我有一个 t sql 查询写成这个示例帮助 SELECT t gName AS Product isnull SUM CASE WHEN t Col 1 THEN t Quantity END 0 AS 180ml isnull SUM C
  • 除了使用自适应卡之外,还有其他方法可以启用日历选项作为 V4 聊天机器人 C# 中的输入吗?

    有没有办法在聊天机器人中启用日期和时间输入 即日历选项 而不使用自适应卡 正如我从下面的链接中了解到的 除 Microsoft 渠道外 所有渠道均不支持自适应卡 如何使用 C 添加通过卡片内的提示选项显示的自定义选项以及在 BOT V4 中
  • Beautifulsoup 丢失节点

    我正在使用 Python 和 Beautifulsoup 来解析 HTML 数据并从 RSS 源中获取 p 标签 但是 某些 url 会导致问题 因为解析的 soup object 不包括文档的所有节点 例如我尝试解析http feeds
  • 如何更改实体框架生成日期时间 SQL 精度的方式

    我有一个表使用 id 和 DateTime 列作为 pk 但是当我尝试通过实体框架更新数据时 如下所示 using Entities context new Entities var item from item in context Ba
  • Objective C 类的默认基类

    这个问题的答案可能是显而易见的 但我需要确定 当类定义中没有显式定义基类时 所有目标 c 类是否共享一个公共的默认基类 不 如果您没有在类定义中显式定义超类 那么您将创建一个根类 From 可可核心竞争力 根类不继承自其他类 并定义其下层次
  • 如何修复使用 Graphicsmagick 收集的损坏的 alpha 通道(残留像素)的 .gif?

    我想将带有 Alpha 通道的 avi 转换为 gif 首先 我使用 ffmpeg i source avi vf scale 720 1 flags lanczos fps 10 frames ffout 03d png 将 avi 转换
  • 如何“解码”字体文件的eexec?

    我有一个 pfa 字体文件我想阅读渲染字体的 算法 然而 大部分信息都隐藏在二进制行中 currentfile eexec 743F8413F3636CA85A9FFEFB50B4BB27302A5F6C876586CCC1670A7EF5
  • 如何在 PHP 中请求 facebook 权限?

    如何在 PHP 中请求 facebook 权限 你能给我举个例子吗 thanks 假设你有用户的access token 你可以通过 facebook gt getAccessToken 用户登录后 try permissions face
  • 推送消息不使用分布式证书发送

    我可以使用沙箱使用开发人员 p12 文件发送推送通知 但我在应用程序商店上的应用程序 我使用与 gateway push apple com 消息一起使用的分发证书 f12 文件无法到达设备 在分布式证书上激活推送通知服务 我检查了deve
  • 基于位置追踪的iOS全时后台服务

    我目前正在编写一个应用程序 该应用程序依赖于位置跟踪并将有关位置的数据发送到服务器 然而 问题是它必须 24 7 运行 目前我遇到每 2 3 天发生一次的随机崩溃 为了使应用程序在后台持续运行 我所做的是将 NSTimer 放入 appli
  • 如何从标记存储在变量中的树中选择节点?

    考虑以下 XSLT 脚本
  • Windows 中 Git 克隆权限失败

    当我在 Windows 10 v 1909 上使用 CMD 或带有 ssh agent 的 PowerShell 从 GitHub 克隆时 显示以下内容 email protected Permission denied publickey
  • 如何动态改变网页的标题?

    我有一个网页 它实现了一组选项卡 每个选项卡显示不同的内容 单击选项卡不会刷新页面 而是在客户端隐藏 取消隐藏内容 现在需要根据页面上选择的选项卡更改页面标题 出于 SEO 原因 这可能吗 有人可以建议一个解决方案 通过 javascrip
  • 通过多索引的子集从 pandas 中选择行

    我在 pandas 中有一个多索引数据框 索引中有 4 列 还有一些数据列 示例如下 import pandas as pd import numpy as np cnames K1 K2 K3 K4 D1 D2 rdata pd Data
  • HTML - 阿拉伯语支持

    我有一个网站 我必须在其中添加一些阿拉伯语行 如何做到这一点 在哪里获取阿拉伯文本字符 如何使页面支持阿拉伯语 我必须每页放一行 而且有很多页面 所以不能四处制作图像并放置它们 这是所需的答案 但每个人都只回答了其中的一部分 Step 1
  • MySQL 从一个表中选择不在另一个表中的特定条目

    当尝试从表中选择不在另一个表中的特定条目时 我在 MySQL 中遇到问题 我知道这句话听起来很疯狂 但这是我想做的一个例子 表用户 user id username password plus other columns not impor
  • 覆盖非活动选项卡的 setTimeout 行为

    我目前正在使用 WebRTC 在 JavaScript 中开发一个点对点游戏 它将其中一个对等点 即主机 视为服务器 而任何其他加入的对等点则通过 Node js 代理服务器连接到主机 我目前正在尝试解决以下问题 如果主机切换选项卡以使游戏
  • 从 ASP.NET 背后的代码调用 Javascript 函数

    我试图在单击按钮时从后面的代码调用其自己文件中的 javascript 方法 aspx 文件 protected void Next Click object sender EventArgs e if hidden Value Respo
  • 程序集调用堆栈 - 术语问题

    我对 Assembly 完全陌生 希望确认以下陈述中我有误解并需要纠正的地方 堆栈指针 ESP 指的是栈顶 最低内存地址 基指针 EBP 用于在构建堆栈帧时临时存储各种内存地址 它通常保存当前堆栈帧的最高内存地址 指令指针 EIP 指的是内