Gdb NASM分段故障(strchrnul)

Gdb NASM分段故障(strchrnul),gdb,segmentation-fault,nasm,Gdb,Segmentation Fault,Nasm,需要nasm代码的帮助。必须确定intgr1 mod intgr2==0,但不能使用DIV。 我遇到了一个分割错误。从gdb我发现: 程序接收信号SIGSEGV,分段故障 来自/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

需要nasm代码的帮助。必须确定intgr1 mod intgr2==0,但不能使用DIV。 我遇到了一个分割错误。从gdb我发现:

程序接收信号SIGSEGV,分段故障

来自/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
;nasm-f elf64 main.nasm
;gcc-o main.o-lc
第节.案文
全球主要
外部扫描
外部打印
第二节数据
请求1:db“Dividendo:”,0
请求2:db“除数:”,0
消息1:db“Eh divisivel”,0
消息2:db“Nao eh divisivel”,0
格式输入:数据库“%d”,0
intgr1:乘以4 db 0;32位整数=4字节
intgr2:乘以4 db 0;
主要内容:
推送请求1;临时分割
调用printf
添加esp,4
推动intgr1;斯坎夫·多维登多
推格式
呼叫scanf
添加esp,8
推送请求2;即兴足部除数
调用printf
添加esp,4
推动intgr2;scanf-do除数
推格式
呼叫scanf
添加esp,8
mov eax,[intgr1]
mov ebx,[intgr2]
jmp-L1
L1:cmp-eax,ebx;比较除数除数
jbl2;se<恩托瓦伊普拉l2
子eax、ebx;dividendo:=dividendo除数
jmp-L1;瓦伊普拉L1
L2:cmp-eax,0;比较区e 0
乙脑L3;se igual vai第l3段
jmp-L4;se nao vai第l4段
L3:推送消息1;即兴分裂
调用printf
添加esp,4
L4:推送消息2;即兴奎瑙嗯
调用printf
添加esp,4
MOV AL,1;程序终端
MOV-EBX,0
INT 80h
有人知道怎么回事吗

谢谢

nasm-f elf64 main.nasm

你正在组装64位应用程序?我们不在64位焊盘中推送参数,而是传入寄存器

请看表中的
x86-64
行,它将告诉您Linux在其调用约定中使用了哪些寄存器<代码>RDI、RSI、RDX、RCX、R8、R9、XMM0–7

您的
printf
应该是:

mov     rdi, request1
xor     rax, rax
call    printf
您的
printf
调用需要一个format参数,否则您将来可能会遇到问题,现在学习正确的方法,以后问题会少一些

同样地,
scanf
也是一样的:

mov     rsi, intgr2
mov     rdi, formatin
xor     rax, rax
call    scanf
由于链接到C库,因此需要调用
exit
,以便库可以进行清理

xor     rdi, rdi
call    exit

可以从main返回,而不是调用exit。