鉴于前两个参数是动态数组,如何访问函数的最后一个参数的值?

qwe*_*_99 0 x86 assembly gnu-assembler calling-convention att

C中的函数是

void f(int* out, int* in, int nbElements){
    // do stuff
}
Run Code Online (Sandbox Code Playgroud)

由于int nbElements是第一个被压入堆栈in并且out具有可变大小,我如何访问 的值nbElements?据我了解,堆栈看起来像这样:

          esp
          ebp
     return address         # -4(%ebp) 
1st element of int* out     # -8(%ebp)
1st element of int* in      # (%ebp - 8 - 4*nbElements)
      nbElements            # not sure how I can access the value of this
Run Code Online (Sandbox Code Playgroud)

那么如何在nbElements不知道其地址的情况下访问的值呢?

Sor*_*tir 5

不,数组内容不会被复制,只有它们的地址,所以堆栈看起来像(假设从右到左调用约定,地址从高到低显示):

nbElements
in
out
return-address
(locals...)
Run Code Online (Sandbox Code Playgroud)

每个参数都有一个固定的地址,相互比较(检查 C 调用这样一个函数的代码,以确认这一点)。最后一个参数将是 ebp+12(假设您已经完成了作为标准序言的一部分的 push ebp。

看看函数和堆栈帧,尽管您需要转换为 at&t 语法。