2018年5月30日 星期三

組合語言編譯器:Netwide Assembler

升級MacPorts的時候,發現nasm這個程式吃了不少CPU,查了一下原來這是名叫做Netwide Assembler組合語言編譯器。這個x86 assembler一開始的發展人是Simon Tatham和Julian Hall,現在則是由H. Peter Anvin領導的團隊在維護,官方網頁請參考NASM

參考後面的組合語言程式碼64.asm,編譯與執行的方式如下:
  1. nasm -f macho64 64.asm
  2. ld -macosx_version_min 10.7.0 -lSystem -o 64.exe 64.o
  3. file 64.o 64.exe
    64.o: Mach-O 64-bit object x86_64
    64.exe:   Mach-O 64-bit executable x86_64
  4. ./64.exe
    Hello, x86_64 world!
上面指令的意思分別是
  1. 用nasm將組合語言程式碼64.asm編譯成叫64.o的目的檔
  2. 將目的檔鍊結成叫做64.exe的執行檔
  3. 用file這個指令看目的檔與執行檔格式
  4. 執行64.exe

上面的64.asm程式碼來自FiloSottile,詳細內容如下
; /opt/local/bin/nasm -f macho64 64.asm && ld -macosx_version_min 10.7.0 -lSystem -o 64 64.o && ./64

global start


section .text

start:
    mov     rax, 0x2000004 ; put the write-system-call-code into register rax
    mov     rdi, 1         ; tell kernel to use stdout
    mov     rsi, msg       ; rsi is where the kernel expects to find the address of the message
    mov     rdx, msg.len   ; rdx is where the kernel expects to find the length of the message
    syscall

    mov     rax, 0x2000001 ; exit system call
    mov     rdi, 0
    syscall


section .data

msg:    db      "Hello, x86_64 world!", 10
.len:   equ     $ - msg


參考資料與備註

_EOF_

3 則留言: