section .data
text db 'Put a number',10,0
scanform db '%d'
number dw 0
section .text
extern printf,scanf
global main
main:
push rbp
mov rbp,rsp
push rdi
push rsi
push rbx
mov rdi,text
mov rax,0
call printf
mov rsi,number
mov rdi,scanform
mov rax,0
call scanf
pop rbx
pop rsi
pop rdi
ret
这是我的代码,我整天都在编写其他代码,但是我没有遇到任何问题,但是现在当我调用scanf时,写程序收到信号SIGSEV,segfault ...在不同文件中指定了第一行和最后一行。我不明白此消息,有人可以帮助我吗?
答案 0 :(得分:4)
您遇到以下问题:
pop rbp
。%d
写入4个字节的整数,但仅使用dw
分配了2个字节。可能的固定版本:
section .data
number dd 0
text db 'Put a number',10,0
scanform db '%d', 0
section .text
extern printf,scanf
global main
main:
push rbp
mov rbp,rsp
push rdi
push rsi
push rbx
push rbx ; for alignment
mov rdi,text
mov rax,0
call printf
mov rsi,number
mov rdi,scanform
mov rax,0
call scanf
pop rbx
pop rbx
pop rsi
pop rdi
pop rbp
ret
由于rsi
和rdi
是调用者保存的寄存器,而rbx
没有被触摸,因此可以简化代码。我还更改为xor
归零和相对撕裂寻址,如下所示:
section .data
number dd 0
text db 'Put a number',10,0
scanform db '%d', 0
section .text
extern printf,scanf
global main
main:
push rbp
lea rdi, [rel text]
xor eax, eax
call printf
lea rsi, [rel number]
lea rdi, [rel scanform]
xor eax, eax
call scanf
pop rbp
ret