0
extern printf
extern scanf
global main
section .text
main:
sub rsp, 0x10
mov rbx, rsp
add rbx, 0x08
mov rdi, format1
mov rsi, rbx
xor rax, rax
call scanf
mov rdi, format2
mov rsi, [rbx]
xor rax, rax
call printf
add rsp, 0x10
ret
format1:
db "%d", 0
format2:
db "%d", 0xa, 0
value:
dd 0xa
上面的源代碼使用scanf函數一樣的是與ASM語言
#include <stdio.h>
int main(void)
{
int tmp;
scanf("%d", &tmp);
printf("%d\n", tmp);
}
它運作良好。但我有問題。如果我將源代碼更改爲
extern printf
extern scanf
global main
section .text
main:
mov rdi, format1
mov rsi, value
xor rax, rax
call scanf
mov rdi, format2
mov rsi, [value]
xor rax, rax
call printf
ret
format1:
db "%d", 0
format2:
db "%d", 0xa, 0
value:
dd 0xa
它使分段錯誤。我認爲上述源代碼和第一個源代碼沒有區別。我誤解了嗎?
你踩通過與像GDB調試器? –
結果它說核心被轉儲,但是我找不到核心文件。如果沒有核心文件,我不知道如何使用gdb來分析程序,寫入nasm – Damotorie
'gdb。/ nameofprogram',然後使用'layout asm'然後'layout reg'並在main上設置一個斷點,使用'b main ',用'run'啓動程序,然後用'ni'按指令執行指令?或者像'ddd'一樣使用GDB的圖形前端? –