Assembly 推送局部变量

Assembly 推送局部变量,assembly,Assembly,阿洛 在我阅读了有关函数和堆栈的文章之后,我有一个关于局部变量的问题 文章快照: 这意味着可以通过引用ebp访问局部变量。考虑下面的C代码片段和相应的汇编代码: a = 10; b = 5; c = 2; mov [ebp - 4], 10 ; location of variable a mov [ebp - 8], 5 ; location of b mov [ebp - 12], 2 ; location of c 记住,推动基本上是这样做的: sub esp, 4

阿洛

在我阅读了有关函数和堆栈的文章之后,我有一个关于局部变量的问题

文章快照:


这意味着可以通过引用ebp访问局部变量。考虑下面的C代码片段和相应的汇编代码:

a = 10;
b = 5;
c = 2;

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c
记住,推动基本上是这样做的:

sub esp, 4   ; "allocate" space for the new stack item
mov [esp], X ; put new stack item value X in

为什么局部变量不能像这样推入堆栈:

push 10
push 5
push 2
而不是

sub esp, 12

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c

与其说是技术正确性问题,不如说是语义问题:
push
pop
用于保存和恢复寄存器或值;但是为函数提供局部变量
推送
/
pop
的常规用途不符。因此,堆栈在这里是手动管理的(除了
push ebp
pop ebp
,因为这里我们实际上想要保存和恢复真正意义上的
push
/
pop
),如果您知道在一次操作中需要并保留多少堆栈空间,那么就可以使用执行速度比push-immed快的mov指令(尤其是现在偏移量计算有专用硬件)。可能还有一个遗留组件与以下事实有关:直到80186/80188处理器发布,x86上才提供push immed。到那时,sub/mov惯例已经成为一种成熟的模式。

你可以在船道上做,但要小心推动订单!子esp,4-mov[esp],10不等于mov[ebp-4],解释为10?Thx。快照用于函数中的局部变量,而不是函数的参数。在这篇文章中,他们对函数使用push-for参数,这让我很困惑,为什么局部变量不是functionUps中的push-like参数,我很困惑。我指的是局部变量。很抱歉我现在编辑了这篇文章。我明白了。我不认为关于推送的遗留问题对我来说是个问题。但是我发现使用push时性能会产生影响。推送对每个局部变量使用[sub esp,4]额外指令
sub esp, 12

mov [ebp -  4], 10  ; location of variable a
mov [ebp -  8], 5   ; location of b
mov [ebp - 12], 2   ; location of c