我是很新,在Mac上的x64組裝,所以我越來越糊塗在64位移植一些32位代碼。
程序應該簡單地通過C標準庫中的printf
函數打印出一條消息。
我已經開始使用此代碼:64 NASM:推動內存地址到堆棧和通話功能
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
push msg
call _printf
mov rsp, rbp
pop rbp
ret
與NASM這樣編譯它:
$ nasm -f macho64 main.s
返回以下錯誤:
main.s:12: error: Mach-O 64-bit format does not support 32-bit absolute addresses
我試圖解決這個問題字節更改代碼這樣:
section .data
msg db 'This is a test', 10, 0 ; something stupid here
section .text
global _main
extern _printf
_main:
push rbp
mov rbp, rsp
mov rax, msg ; shouldn't rax now contain the address of msg?
push rax ; push the address
call _printf
mov rsp, rbp
pop rbp
ret
它編譯罰款與上述nasm
命令,但現在有一個警告,而與gcc
編譯對象文件到實際的程序:
$ gcc main.o
ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not
allowed in code signed PIE, but used in _main from main.o. To fix this warning,
don't compile with -mdynamic-no-pic or link with -Wl,-no_pie
因爲它是一個警告不是我執行的a.out
文件的錯誤:
$ ./a.out
Segmentation fault: 11
希望有人知道我做錯了什麼。
該函數是否應該從堆棧中刪除參數或者調用者是否應該刪除它們? (如果堆棧中有任何參數) – qwertz
調用者應在調用後清理堆棧。 –
你的回答並不能解釋爲什麼NASM不會創建目標文件。原因是Mac OS X的限制。OS X上的圖像基大於2^32。OP的原始代碼與elf64很好地組裝在一起。 [馬赫 - 鄰 - 64位格式此結果不支持的32位絕對地址-NASM](https://stackoverflow.com/questions/26394359/mach-o-64-bit-format- do-not-support-32-bit-absolute-addresses-nasm/26402647#26402647) –