Стек в сборке - PullRequest
       12

Стек в сборке

0 голосов
/ 01 июля 2018

Мне нужна помощь с кодом в ассемблере.

Я работаю над этим, и моя группа только что сделала этот ассемблерный код, где она должна была сделать то же самое, что я делал в # c.

Может ли кто-нибудь помочь мне понять, что происходит с де-стэк хотя бы на первых шагах, чтобы я мог продолжить и завершить остальное?

Я новичок в ассемблере, но я знаю, что эти строки просто сохраняют значение для вызывающей функции, берут кадр для вызываемой функции и сохраняют место для локальных переменных, но я не могу выяснить следующую первую шаги.

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 голосов
/ 02 июля 2018

Когда я пишу mov edx, [ebp-4] или +4, или -4, +8, -8, что именно я делаю со стеком, точно?

Взгляните на стек (диаграмма из Статья Википедии о стэке вызовов ). Обратите внимание, что нижние адреса памяти находятся вверху этой диаграммы, а более высокие адреса памяти - внизу.

stack layout with a frame pointer

Указатель кадра сохраняется в регистре ebp (на x86). Он содержит адрес Обратный адрес .

Ваши локальные переменные хранятся до Обратного адреса . Переменная c имеет размер 4 байта. Вычитая 4 из адреса ebp, вы теперь указываете на свою первую локальную переменную, c. Вычтите еще 4 (делая это -8), и вы теперь указываете на свою вторую локальную переменную l.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...