c - 堆栈组装

标签 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

最佳答案

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 的图表)。请注意,低内存地址位于该图的顶部,而高内存地址位于底部。

stack layout with a frame pointer

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

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

关于c - 堆栈组装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51126917/

相关文章:

c++ - 使用 printf 将 em-dash 打印到控制台窗口?

c - 在 NASM 中调用 C 函数时遇到问题

c - 在 XLC 编译器中使用内联汇编时如何避免标签翻译?

assembly - 写入 PIC 上的 EEPROM

c++ - 使用堆栈获取 BST 的高度

c++ - 递归 : Implement least recently used algorithm using a stack

java - java如何通过内存对象堆分配在android中工作

C 对齐特定用例的字符串文字

在 Eclipse 中更改 autotools C 项目的设置

c - 如何获取函数的长度(以字节为单位)?