我正在做一個基本的組件減法函數並將結果打印到控制檯。以下是我認爲應該工作的代碼: (與as output.s
編譯,ld a.out -e _start -o output
)爲什麼x86程序段錯誤沒有.data段?
.bss
output:
.int
.text
.global _start
_start:
movl $9, %eax
movl %eax, %ebx
movl $8, %eax
subl %eax, %ebx
movl %ebx, (output)
# ASCII for digits is 0x30 greater than digit value
addl $0x30, output
movl $2, %edx # write 2 bytes (need 1 for null?)
movl $output, %ecx # output
movl $1, %ebx # write to stdin
movl $4, %eax # syscall number for write
int $0x80 # invoke syscall
# CR
movl $2, %edx
movl $13, (output)
movl $output, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
# LF
movl $2, %edx
movl $10, (output)
movl $output, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
# exit
movl $0, %ebx
movl $1, %eax
int $0x80
不過,這一方案段錯誤。 我發現,如果我在最後添加一個簡單的.data段:
.data
pingle:
.int 666
它工作正常。爲什麼我需要.data段?當我每次寫入2個字節時,是否會溢出其中一個段?或者幾次覆蓋output
這樣做?
任何想法非常感謝!
它在哪裏段錯誤?在gdb中運行你的程序來找出答案。可能有一個'.data'部分恰好將可寫內存放在程序錯誤地嘗試讀取或寫入的位置,但這只是一個猜測,直到您顯示哪條指令是段錯誤並且尋址中使用的寄存器和符號的內容模式。 –
終於找到了重複。 http://stackoverflow.com/questions/36821123/asm-x64-scanf-printf-double-gas有完全不同的症狀,但原因是一樣的:認爲'.double'與一個空列表將保留一個空間雙。 –