因此,似乎everyone知道OSX系統調用總是16字節堆棧對齊。太棒了,這是有道理的,當你有這樣的代碼:瞭解OSX 16字節對齊
section .data
message db 'something', 10, 0
section .text
global start
start:
push 10 ; size of the message (4 bytes)
push msg ; the address of the message (4 bytes)
push 1 ; we want to write to STD_OUT (4 bytes)
mov eax, 4 ; write(...) syscall
sub esp, 4 ; move stack pointer down to 4 bytes for a total of 16.
int 0x80 ; invoke
add esp, 16 ; clean
完美,堆棧對齊到16個字節,是非常有道理的。儘管我們稱之爲系統調用(1)(exit
)。從邏輯上講,將是這個樣子:
push 69 ; return value
mov eax, 1 ; exit(...) syscall
sub esp, 12 ; push down stack for total of 16 bytes.
int 0x80 ; invoke
這不工作,雖然,但這:
push 69 ; return value
mov eax, 1 ; exit(...) syscall
sub esp, 4 ; push down stack for total of 8 bytes.
int 0x80 ; invoke
這工作正常,但是這隻有8個字節???? Osx很酷,但是這個ABI讓我瘋狂。有人可以闡明我不瞭解的東西嗎?
您確定堆棧指針在您顯示的代碼之前是16字節對齊的嗎?另外,正如你所知,蘋果公司在系統調用級別不保持二進制兼容性,僅在系統庫級別。 –
是的,事實上,我可以只寫最後一段代碼,它按預期工作。但它並沒有真正凝聚我所聽到的有關16字節對齊的所有信息。 – sircodesalot