簡體   English   中英

如何讓這個簡單的程序集運行?

[英]How to get this simple assembly to run?

這是我第一次嘗試使用匯編進行編程。 我正在使用64位Mac OS。 我也在使用NASM。 我已經做了很多尋找解決方案,但我找不到適用於我的機器的任何東西。

任何人都可以幫我解決這個問題嗎? 這是代碼和錯誤,謝謝!

hello.asm

    global start

    section .text
start:
    mov rax, 1
    mov rdi, 1
    mov rsi, message
    mov rdx, 13
    syscall
    mov eax, 60
    xor rdi, rdi
    syscall
message:
    db "Hello, World", 10  

我嘗試執行:

nasm -f macho64 hello.asm -o hello.o
ld -arch i386 -o hello hello.o
./hello

錯誤

ld: warning: -macosx_version_min not specified, assuming 10.10
ld: warning: ignoring file hello.o, file was built for unsupported file format ( 0xCF 0xFA 0xED 0xFE 0x07 0x00 0x00 0x01 0x03 0x00 0x00 0x00 0x01 0x00 0x00 0x00 ) which is not the architecture being linked (i386): hello.o
Undefined symbols for architecture i386:
  "_main", referenced from:
     implicit entry/start for main executable
ld: symbol(s) not found for architecture i386

鏈接器錯誤的原因是您使用NASM創建了一個64位的強壯對象,但隨后針對可執行文件定位了i386。 您可能會遇到的是64位可執行文件,可以通過刪除-arch來完成,如下所示:

ld -o hello hello.o

至於運行程序時的段錯誤,似乎您可能會遵循可能是為Linux設計的教程。 OS / X不是基於Linux,它是從BSD派生的,所以Syscalls是不同的。 我們可以告訴你正在使用Linux Syscalls,因為syscall 1是sys_writesys_exit是rax = 60.不幸的是,OS / X不一樣。 在64位OS / X代碼中, sys_exit是rax = 0x20000001, sys_write是rax = 0x20000004。

您的代碼必須更改為:

    global start

    section .data
message: db "Hello, World", 10  

    section .text
start:
    mov rax, 0x20000004
    mov rdi, 1
    mov rsi, message
    mov rdx, 13
    syscall
    mov rax, 0x20000001
    xor rdi, rdi
    syscall

您還會觀察到我明確聲明了一個.data部分並將您的變量放入其中。 在某些環境中,如果將數據變量放在代碼中,則可能會出現問題。

如果在OS / X上創建32位代碼(在這種情況下不是這樣),則Syscalls從每個代碼中減去0x20000000。 因此,在32位OS / X代碼中, sys_exit是eax = 0x1, sys_write是eax = 0x4。

可以在此Apple信息中找到OS / X上所有Syscalls(及其參數)的參考 只需為圖表的第一列中的每個數字添加0x20000000即可獲得64位匯編程序代碼。

您可能想要找到有關Syscalls的64位OS / X教程。 這很簡單

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM