2015-04-17 36 views
1

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

和关于返回值,说我有这样的代码:

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吗?

我假设这是公然明显的,但我想绝对确定,所以我也不会形成公然错误的观念。

+0

“保证是相同的”对于'ebp'和'esp'来说是不正确的,因为你可以自由地改变它们。但是,这会让你的程序崩溃。所以'保证'实际上只是一个*约定*,其他寄存器也是如此。 – usr2564301

+0

这是哪个ISA? – mstbaum

回答

2

因此,返回值是8×8是在%eax中,因为它被放在那里 中其他功能,但会4则留在%EBX?或者,如果我从未将 任何内容移动到%ebx中,那么%ebx会保持为8?

是的,寄存器保持它们的值直到改变。 您通常对被调用函数的内部没有深入的了解,因此只有约定指定了您可以预期的未改变的内容。主叫方和被叫方应该就此达成一致,并进行相应的编码。