2016-10-04 5 views
0

Я пытаюсь преобразовать этот кусок кода С в 64 битном NASMStack в сборке NASM

int gcd (int a, int b) 
{ 
    int c; 
    while (a != 0) { 
    c = a; 
    a = b%a; 
    b = c; 
    } 
    return b; 
} 

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

вызова

push word[max] 
push word[min] 
call gcf 
pop word[num1_ones] 

функция стека

gcf: 
    mov ebp, esp 
while: 
    cmp word[ebp+4], 0 
    je return 

    mov dx, 0 
    mov ax, word[ebp+6] 
    mov bx, word[ebp+4] 
    div bx         

    mov word[ebp+4], dx   
    mov word[ebp+6], bx   

    jmp while 

return: 
    ret 2 

Когда я бегу, я получаю это:
terminal output

+0

так что происходит, когда вы запускаете его? Похоже, он должен собраться. Но вы не описываете, в чем проблема, так что это не [mcve]. –

ответ

0

Очевидная вещь, которая хватает толчок/поп НОП.

Также вы используете это в 16 или 32-битном режиме? Это влияет на размер обратного адреса, нажатого CALL, что влияет на ваши смещения ... Пока вы не уточните, как вы его создаете/запускаете, я не могу сказать ничего более конкретного.

Я бы предложил использовать отладчик, чтобы посмотреть на регистры/память.

+0

Извините, я отредактировал свой вопрос, и я надеюсь, что теперь это немного яснее. Я использую 64-разрядный nasm, и у меня нет ошибок или ошибок сегментации в моем коде, но вывод, который я получаю, неверен. – Samantha

+0

@ Саманта: изображения текста намного хуже фактического текста; вы должны скопировать/вставить с вашего терминала в блок кода, чтобы проиллюстрировать вывод. –

+0

@ Саманта: Я удивлен, что «mov ebp, esp' не приводит к segfaults в 64-битном режиме, поскольку вы обрезаете RSP до 32 бит. Обычно стек находится не в 4 ГБ виртуальной памяти. Таким образом, вы, вероятно, на самом деле строите 32-битный код, но вы можете включить команды, которые вы используете, чтобы подтвердить это. Также удивительно, что ваша программа не сработает после того, как ваша функция вернется, так как вы не сохранили RBD вашего вызывающего абонента –