assembly 局部变量arg2存储在哪个内存地址?

axkjgtzd  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(92)

我正在处理这段代码的过程调用问题,其中最初%ebp = 0x800060,%esp = 0x800040。我试图找到arg2存储在什么内存地址。
C代码:

int caller()
{
      int arg1 = 534;
      int arg2 = 1057;
      int sum = swap_add(&arg1, &arg2);
      int diff = arg1 - arg2;
      return sum * diff;
}

字符串
装配代码:

caller:
     pushl %ebp
     movl %esp, %ebp
     subl $24, %esp
     movl $534, -4(%ebp)
     movl $1057, -8(%ebp)
     leal -8(%ebp), %eax
     movl %eax, 4(%esp)
     leal -4(%ebp), %eax
     movl %eax, (%esp)
     call swap_add


以下是可能的答案选择:

  1. 0x80003C
  2. 0x800040
  3. 0x800038
  4. 0x800034
  5. 0x800024
    我一直跟着代码,发现arg2存储在0x800028,这不在上面的答案中。我将通过下面的注解显示我的数学:
caller:
     pushl %ebp  /* ebp pushed onto stack, esp decrease counter by 4, becomes: 0x80003C */
     movl %esp, %ebp /* copies value to ebp, ebp & esp = 0x80003C */
     subl $24, %esp /* 24 is 0x18, esp= 0x800024 */
     movl $534, -4(%ebp) /* arg1 stored at address 0x800038 */
     movl $1057, -8(%ebp) /* arg2 stored at address 0x800034 */
     leal -8(%ebp), %eax /* store arg2 at eax */
     movl %eax, 4(%esp) /* copy arg2 to esp increased by counter of 4, esp + 0x4 = 0x800024 +
     0x4 = 0x800028, so arg2 is stored at 0x800028 */
     leal -4(%ebp), %eax /*same process but arg 1 is copied to esp*/
     movl %eax, (%esp)
     call swap_add


所以你可以看到,我最终得到了0x800028。我肯定我的数学在某个地方错了,但我仍然是汇编的初学者,所以我只是不知道哪里错了。任何帮助都是感激的。

kmpatx3s

kmpatx3s1#

movl $1057, -8(%ebp) /* arg2 stored at address 0x800034 */

字符串
在我看来,在这行之后,你已经找到了arg2的位置。
在那之后,arg2arg1的地址被放在堆栈上,因为它们是对swap_add的调用的参数,但是变量arg2的位置没有改变。0x800028是arg2的地址被放在的地方,目的是将其作为参数传递给swap_add,它不是arg2本身。如果问题是“&arg2存储在哪里”,那么这可能就是答案。

相关问题