我需要汇编代码的帮助。
我正在为此工作,而我的团队只是在执行该汇编代码,而该代码应该与在#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
答案 0 :(得分:5)
当我写
mov edx, [ebp-4]
或+4或-4,+ 8,-8时,我到底对堆栈做什么?
看一下堆栈(来自Wikipedia's Call Stack article的图表)。请注意,低内存地址位于该图的顶部,而高内存地址位于该图的底部。
帧指针存储在寄存器ebp
中(在x86上)。它包含返回地址的地址。
您的局部变量存储在返回地址之前。变量c
的大小为4个字节。通过从ebp
地址中减去4,您现在指向第一个局部变量c
。减去另外4个(使其变为-8),现在您指向第二个局部变量l
。