我有一些使用scanf和printf的彙編代碼,我遇到了一些問題。當這兩個函數在相同的代碼中使用時,寄存器中的值似乎會丟失。該程序基本上加載一個數字並打印出來。我們運行它使用程序集中的C調用約定(64位) - scanf
nasm -f elf64 file.asm && gcc -o file file.o && ./file
在Linux上
這裏是我們的代碼:
extern printf
extern scanf
section .data
a db "set: ", 0
b db "not set: ", 0
reading db "Please enter a number: ", 0
message db "\n", 0
printsent db "%s", 10, 0
printint db "%d", 10, 0
printchar db "%c", 10, 0
readInt db "%d", 0
input db "%d", 0
section .text
global main
main:
hatta:
push rbp,
mov rbp, rsp,
push rbx,
xor rax, rax,
mov rdi, printsent,
mov rsi, reading
call printf,
pop rbx,
xor rax, rax,
mov rdi, readInt,
call scanf,
mov rbx, rdi
push rbx,
xor rax, rax,
mov rdi, printint,
mov rsi, rbx,
call printf,
pop rbx,
pop rbp,
ret
奇怪的是,如果線mov rdi, printint,
被刪除,我們得到正確的值。但是,如果我們對printsentence執行相同的操作,則會出現分段錯誤。有誰能告訴我們這個原因嗎?
謝謝!
你將不得不說什麼操作系統,因爲調用約定各不相同。調用約定在正則函數和可變參數函數(如printf)之間也有所不同,所以請仔細閱讀您讀取的信息。 – ams
我想這是一個練習,因爲我不認爲在彙編中編寫這樣的東西現在還是有意義的。最簡單的方法是編寫對應的C程序,帶上你最喜歡的編譯器,並用'-S'或相當於彙編器編譯它。 –