我需要有关汇编代码的帮助。
我正在与我合作,我的团队刚刚完成了这段汇编代码,它应该和我在 #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
最佳答案
When I write
mov edx, [ebp-4]
or +4, or -4, +8, -8 what am I doing with the stack, exactly?
看看堆栈(来自 Wikipedia's Call Stack article 的图表)。请注意,低内存地址位于该图的顶部,而高内存地址位于底部。
帧指针 存储在寄存器 ebp
中(在 x86 上)。它包含返回地址的地址。
您的局部变量存储在返回地址之前。变量 c
的大小为 4 个字节。通过从 ebp
地址中减去 4,您现在指向您的第一个局部变量 c
。再减去 4(使其为 -8),您现在指向第二个局部变量 l
。
关于c - 堆栈组装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126917/