2014-01-12 2 views
0

nasm 코드에서 도움이 필요합니다. intgr1 mod intgr2 == 0인지 찾아야하지만 DIV는 사용할 수 없습니다. 세그먼트 오류가 발생했습니다. gdb에서 찾았습니다 :NASM 분할 오류 (strchrnul)

프로그램 수신 신호 SIGSEGV, Segmentation fault. /lib/x86_64-linux-gnu/libc.so.6

에서 strchrnul()에서

0x00007ffff7aacd2a 내 프로그램 :

;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 conventionsx86-64에 대한 표를 보면 리눅스가 호출 규칙에서 사용하는 레지스터를 알 수 있습니다. RDI, RSI, RDX, RCX, R8, R9, XMM0–7

귀하의 printf가 있어야한다 :

mov  rdi, request1 
xor  rax, rax 
call printf 

귀하의 printf 호출은 형식 매개 변수를 필요로하거나, 미래의 문제가 지금 올바른 방법을 배우고, 나중에 더 적은 문제가있을 수 있습니다.

마찬가지로, scanf은 동일은 : C 라이브러리와 연결 이후

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

, 당신은 그래서 도서관이 정리의 할 수 exit를 호출해야합니다.

xor  rdi, rdi 
call exit 
+0

exit를 호출하는 대신 main에서 리턴 할 수 있습니다. –