我正在嘗試撰寫一個 x86 版本的“cat”程式作為匯編中系統呼叫呼叫的訓練。
我在命令列引數上苦苦掙扎。我使用主符號作為入口點,所以我想我會在 %rdi 中找到 argc 引數,在 %rsi 中找到 argv 引數。實際上 argc 正如預期的那樣在 %rdi 中,但是在嘗試將 argv[1] 傳遞給打開的系統呼叫時,我一直在發生段錯誤。
不知道我做錯了什么,這是我的匯編代碼:
main:
cmp $2, %rdi // If argc != 2 return 1
jne .err1
lea 8(%rsi), %rdi // Move argv[1] -> %rdi
xor %rsi, %rsi // 0 to %rsi -> O_RDONLY
xor %rdx, %rdx
mov $2, %rax // Open = syscall 2
syscall
cmp 0, %rax // If open returns <0 -> exit status 2
jl .err2
mov %rax, %rdi // Move fd to %rdi
call cat
ret
.err1:
mov $1, %rax
ret
.err2:
mov $2, %rax
ret
uj5u.com熱心網友回復:
您的代碼有兩個問題。
首先,您使用lea 8(%rsi), %rdi檢索第二個引數。請注意,它rsi指向一個指向命令列引數的指標陣列,因此要檢索指向第二個引數的指標,您必須8(%rsi)使用類似mov 8(%rsi), %rdi.
其次,您忘記了 in 前面的美元0符號cmp $0, %rax。這會導致選擇地址的絕對地址模式,0從而有效地取消參考空指標。要解決此問題,請添加缺少的美元符號以選擇立即尋址模式。
當我解決這兩個問題時,就您發布的代碼而言,它似乎作業得很好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/411263.html
標籤:
