繁体   English   中英

堆叠组装

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM