2014-01-12 3 views
0

Нужна помощь в коде nasm. Необходимо найти, если intgr1 mod intgr2 == 0, но не может использовать DIV. Я получаю ошибку сегментации. Из gdb я нашел:Ошибка сегментации NASM (strchrnul)

Запрограммированный сигнал SIGSEGV, ошибка сегментации.

0x00007ffff7aacd2a в strchrnul() из /lib/x86_64-linux-gnu/libc.so.6

Моя программа:

;nasm -f elf64 main.nasm 
;gcc -o main main.o -lc 


section .text 
    global main 
    extern scanf 
    extern printf 

section .data 
    request1: db "Dividendo: ", 0 
    request2: db "Divisor: ", 0 
    message1: db "Eh divisivel", 0 
    message2: db "Nao eh divisivel", 0 
    formatin: db "%d", 0 
    intgr1: times 4 db 0 ; 32-bits integer = 4 bytes 
    intgr2: times 4 db 0 ; 

main: 
    push request1 ;imprime pedido dividendo 
    call printf 
    add esp, 4 

    push intgr1 ;scanf do dividendo 
    push formatin 
    call scanf 
    add esp, 8 

    push request2 ;imprime pedido divisor 
    call printf 
    add esp, 4 

    push intgr2 ;scanf do divisor 
    push formatin 
    call scanf 
    add esp, 8 

    mov eax, [intgr1] 
    mov ebx, [intgr2] 
    jmp L1 

L1: cmp eax, ebx ;compara dividendo divisor 
    jb L2  ;se < entao vai pra l2 
    sub eax,ebx ;dividendo:=dividendo-divisor 
    jmp L1  ;vai pra L1 

L2: cmp eax, 0 ;compara dividendo e 0 
    je L3  ;se igual vai para l3 
    jmp L4  ;se nao vai para l4 

L3: push message1 ;imprime que eh divisivel 
    call printf 
    add esp, 4 

L4:push message2 ;imprime que nao eh 
    call printf 
    add esp, 4 

    MOV AL, 1 ;termina o programa 
    MOV EBX, 0 
    INT 80h 

Любое имеет представление о том, что не так?

Спасибо.

ответ

2

NASM -f elf64 main.nasm

Ваш Сборка приложения 64-битной? Мы не нажимаем параметры на 64-битной земле, а переходим в регистры.

Calling conventions Посмотрите на строку в таблице для x86-64, она сообщит вам, какие регистры использует Linux в своем соглашении о вызове. RDI, RSI, RDX, RCX, R8, R9, XMM0–7

Ваш printf должен быть:

mov  rdi, request1 
xor  rax, rax 
call printf 

Ваш printf вызов необходим параметр форматирования, или вы можете иметь проблемы в будущем, научиться правильно сейчас, и имеют меньше проблем в дальнейшем.

Аналогично, scanf тот же:

mov  rsi, intgr2 
mov  rdi, formatin 
xor  rax, rax 
call scanf 

С вашего связывания с C Library, вам нужно вызвать exit поэтому библиотеку может сделать это очистка.

xor  rdi, rdi 
call exit 
+0

Возврат из основного, а не вызов выхода. –

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