2014-01-12 75 views
0

在nasm代碼中需要幫助。必須找到intgr1 mod intgr2 == 0,但不能使用DIV。 我遇到分段錯誤。從gdb我發現:NASM分段錯誤(strchrnul)

程序接收到的信號SIGSEGV,分段故障。

0x00007ffff7aacd2a從/lib/x86_64-linux-gnu/libc.so.6

strchrnul()我的程序:

;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庫的鏈接,你需要調用exit使圖書館可以做到這一點的清理。

xor  rdi, rdi 
call exit 
+0

可以從main返回而不是調用exit。 –