装配堆栈,这是对的吗?

时间:2015-04-17 13:58:29

标签: assembly return

我听说你调用一个函数时,保证保持不变的唯一值在技术上是esp / ebp。因此,如果你在%ebx中有一个值并且你调用了一个函数,那么你不应该期望它在函数返回后保留。但是,如果你不在函数中操作%ebx,那么值可能保持不变只是因为它没有在内存中触及,并且寄存器的地址总是保持不变,所以无论值在地址中是什么%ebx会留在那里吗?

关于返回值,请说我有这段代码:

movl $8, %eax
movl $8, %ebx
pushl $4
call function

function:
pushl %ebp
movl %esp, %ebp
imul %ebx, %eax
movl $4, %ebx
movl %ebp, %esp
popl %ebp
ret

所以8 * 8的返回值是在%eax中,因为它被放在另一个函数中,然后4将保留在%ebx中?或者如果我从未将任何东西移到%ebx中,那么%ebx会保持8吗?

我认为这显然是显而易见的,但我想要绝对肯定,所以我也不会形成明显错误的概念。

1 个答案:

答案 0 :(得分:2)

  

所以8 * 8的返回值是%eax,因为它放在那里   在另一个函数中,然后4将保留在%ebx中?或者如果我从来没有   将任何东西移到%ebx,%ebx会保持8吗?

是的,寄存器会保留其值,直到更改为止。 您通常不了解被调用函数的内部知识,因此只有约定指定您可以期望不变的内容。呼叫者和被呼叫者都应该就此达成一致,并进行相应的编码。