堆叠组装

时间:2018-07-01 20:50:15

标签: c assembly stack

我需要汇编代码的帮助。

我正在为此工作,而我的团队只是在执行该汇编代码,而该代码应该与在#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

1 个答案:

答案 0 :(得分:5)

  

当我写mov edx, [ebp-4]或+4或-4,+ 8,-8时,我到底对堆栈做什么?

看一下堆栈(来自Wikipedia's Call Stack article的图表)。请注意,低内存地址位于该图的顶部,而高内存地址位于该图的底部。

stack layout with a frame pointer

帧指针存储在寄存器ebp中(在x86上)。它包含返回地址的地址。

您的局部变量存储在返回地址之前。变量c的大小为4个字节。通过从ebp地址中减去4,您现在指向第一个局部变量c。减去另外4个(使其变为-8),现在您指向第二个局部变量l