【问题标题】:can someone explain me the stack of this code?有人可以解释一下这段代码的堆栈吗?
【发布时间】:2017-08-13 16:09:03
【问题描述】:

英语不是我的母语,所以如果我拼错了一些单词,对不起。我的堆栈有些麻烦,我将放在这里的所有代码都可以正常工作。

例如这个代码很简单,我理解它的堆栈。

.globl f F: 推%ebx movl 8(%esp), %eax movl 12(%esp), %ebx 添加 %ebx, %eax ret

堆栈

-------- VAR Y --> ESP + 12 -------- VAR X --> ESP + 8 -------- RET --> 返回 -------- %EBX --> %ESP --------

但是有了这段代码,我有一些 t

.code32 .globl f F: 推%ebx movl 8(%esp), %ebx subl $8, %esp # Creo posto nella stack per i parametri movl $1, (%esp) movl $2, 4(%esp) 打电话给 添加 %ebx, %eax addl $8, %esp #Tolgo posto nella stack 人口 %ebx ret

代码完美运行,但我对此有很多疑问? %ebx 和 ret 现在在哪里?

用c翻译的asm代码:

整数 f(整数 x){ 返回 x + g(y,z); }

这是我做的堆栈

堆栈

-------- 8(%esp) --> 函数 f 的 x 参数 -------- 4(%esp) --> 函数 g 的 z 参数 -------- (%esp) --> 函数 g 的 y 参数 --------

所以现在的问题是 %ebx 和 ret 现在在这个堆栈上的什么位置?

【问题讨论】:

    标签: linux assembly stack att


    【解决方案1】:

    第一个代码将返回到旧的ebx 值(可能不是有效地址),而不是原始返回地址,它在ret 之前缺少pop ebx。

    第二次调用ss:esp地址处的内存,在call a指令之前,包含:

    dword 1                     +0 (current esp)
    dword 2                     +4
    dword old_ebx_value         +8
    dword return_address_from_f +12
    dword x                     +16
    ... older stack content ...
    

    您的“esp+x”符号不起作用,因为 esp 确实会动态变化,所以如果您想这样描述堆栈,您必须说明您在代码中的哪个位置(esp 的哪个值)使用。 IE。在f 的入口处,mov eax,[esp+4] 将加载“x”,但在push ebx 之后只有一条指令,mov eax,[esp+8] 实现了同样的事情(英特尔语法,转换为“机器”gas/at&t 语法靠你自己,我是人类)。

    但即便如此,如果您将其想象为内存值,它会随着每个push 或写入内存而动态变化,因此您仍然必须指定您在哪个执行点描述堆栈(就像我所做的那样在call a 之前,因为在call a 之后有指令addl %ebx, %eax 的地址写在该值1 之前,而a 处的代码没有显示问题。

    无论如何,旧的ebx 和返回地址一直在内存中的同一位置(除非a 覆盖它们),移动的不是内容。 push/pop/add/sub 正在调整指针 esp。 (即使在您 pop 之后,内存内容也会保留一段未定义的时间,假设其他代码覆盖它需要多长时间是不安全的,以防 SW 中断处理程序正在使用应用程序堆栈它可能是随时覆盖,尽管在 x86 32b 模式下,应用程序通常有自己的堆栈,所以这些值可能会保留在那里,直到你用下一个 push 或 call 或其他方式覆盖它们。

    最后,只需编译这些东西,并在调试器中运行它们,将内存视图放在开头ss:esp-32,然后观察内存是如何被call或push等指令写入的,以及esp 如何更改为指向“堆栈顶部”。在调试器中“观看”通常比阅读像我的答案这样的文本要容易得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多