2016-12-16 1 views
0

Я недавно начал собираться в сборку, и я использую NASM, потому что я могу легко найти учебники. Из-за его сложности я решил, что начну очень мало, создав программу для добавления 1 и 3 и вывода 4. Я достаточно проработал, чтобы не получать сообщения об ошибках или предупреждениях, но ничего не выводит из ш-4,3 $.Что не так с этим сумматором сборщиков NASM?

segment .text 
    global _start 
_start: 
    mov eax, '1' 
    sub eax, '0' 

    mov ecx, '3' 
    sub ecx, '0' 

    add ecx, eax 
    add ecx, '0' 

    mov edx, 1 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov eax, 1 
    int 0x80 
+0

В какой ОС вы работаете, на что вы работаете? Если это Windows, я настоятельно рекомендую использовать SASM как идеал и отладчик. Это здорово, если вы учитесь, вы можете пройти и посмотреть значения в каждом регистре. https://dman95.github.io/SASM/english.html – Eric

+0

Из-за различных проблем я фактически вынужден практиковать все с помощью NASM по адресу http://www.tutorialspoint.com/codingground.htm. Хотя из того, что я понимаю, терминалы эмулируют ОС Linux. –

+0

Если у вас есть шанс, я все же очень рекомендую его. К сожалению, на языке кодирования tutorialspoint нет подключенного отладчика. – Eric

ответ

1

Переместить свой результат в переменную, а затем отображать переменную:

section .data 
    result : db ' ',10   ◄■■ VARIABLE 
segment .text 
    global _start 
_start: 
    mov eax, '1' 
    sub eax, '0' 

    mov ecx, '3' 
    sub ecx, '0' 

    add ecx, eax 
    add ecx, '0' 
    mov [result], cl   ◄■■ MOVE RESULT INTO THE VARIABLE. 

    mov ecx, result   ◄■■ DISPLAY THIS VARIABLE. 
    mov edx, 1 
    mov ebx, 1 
    mov eax, 4 
    int 0x80 

    mov eax, 1 
    int 0x80  

Вы должны сохранить адрес переменной в ECX, а не само значение.

+0

О, теперь я чувствую себя глупым. Системный вызов sys_write принял вход const char * в ecx. Я получаю это сейчас. Это, как говорится, является их любым возможным способом, я могу использовать «адрес памяти» одного из регистров? –

+0

Извините, я просто понял, что могу использовать регистрацию адресов. Спасибо, Хосе –

+1

@ N.D.H .: вы заметили бы проблему, если бы вы запускали вашу программу с помощью 'strace./A.out'. Вы увидите 'write (...) = -EFAULT' для системного вызова, так как вы передаете недопустимый указатель. –

Смежные вопросы