[英]Stack in Assembly
我需要汇编代码的帮助。
我正在为此工作,而我的小组只是在执行此汇编代码的地方执行了与我在#c中所做的相同的工作。
有人可以帮助我至少在开始的步骤中至少了解de stack的情况,以便我继续进行总结吗?
我是Assembly的初学者,但是我知道这些行仅保存调用函数的值,为被调用函数添加一个框架,并为局部变量节省空间,但是我不知道接下来的第一步。
mov ebp
mov ebp,esp
sub esp, 16
这是我在#c中所做的:
void mult_integer(int X[A_Linhas][A_Colunas], int number)
{
int c, l;
for (l = 0; l < A_Linhas; l++)
{
for (c = 0; c < A_Colunas; c++)
{
X[l][c] = number * X[l][c];
}
}
}
这是汇编中的代码:
mul_integer:
push ebp
mov ebp, esp
sub esp, 16
mov dword [ebp-4H], 0
jmp L_020
L_017: mov dword [ebp-8H], 0
jmp L_019
L_018: mov edx, dword [ebp-4H]
mov eax, edx
add eax, eax
add eax, edx
shl eax, 2
mov edx, eax
mov eax, dword [ebp+8H]
lea ecx, [edx+eax]
mov edx, dword [ebp-4H]
mov eax, edx
add eax, eax
add eax, edx
shl eax, 2
mov edx, eax
mov eax, dword [ebp+8H]
add edx, eax
mov eax, dword [ebp-8H]
mov eax, dword [edx+eax*4]
imul eax, dword [ebp+0CH]
mov edx, eax
mov eax, dword [ebp-8H]
mov dword [ecx+eax*4], edx
add dword [ebp-8H], 1
L_019: cmp dword [ebp-8H], 2
jle L_018
add dword [ebp-4H], 1
L_020: cmp dword [ebp-4H], 3
jle L_017
nop
leave
ret
当我写
mov edx, [ebp-4]
或+4或-4,+ 8,-8时,我到底对堆栈做什么?
看一下堆栈(来自Wikipedia的Call Stack文章的图表)。 请注意,低内存地址位于该图的顶部,而高内存地址位于该图的底部。
帧指针存储在寄存器ebp
(在x86上)。 它包含返回地址的地址 。
您的局部变量存储在Return Address之前。 变量c
大小为4个字节。 通过从ebp
地址中减去4,您现在指向第一个局部变量c
。 减去另一个4(使它成为-8),现在您指向第二个局部变量l
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.