baobao
10/23/2018 - 5:59 AM

helloworld.asm

; global シンボル名で公開したいシンボルを定義(外部から参照可能になる)
global _main

; DATAセクションの始まりを定義
section .data

; str_helloというラベルを定義(あとから参照できるようにする)
; db 文字列で、指定文字列をASCIIコードに変換して数値として連続して書き込むということを意味する
; db "H","e","l","l","o", " World", 0x0a と記述しても同じ
; 0x0aは改行の意味
str_hello:   db  "Hello World", 0x0a

; TEXTセクションの始まりを定義
section .text

; _mainの処理
_main:
    ; 実行するシステムコールの指定4は標準出力
    ; x64の場合は0x2000000を加算した値にする
    mov rax, 0x2000004  
    
    ; 標準出力システムコールの第1引数 出力のファイルディスクリプタの指定
    ; 1を指定すると標準出力, 2は標準エラー出力, 0は標準入力
    mov rdi, 1
    
    ; 標準出力システムコールの第2引数
    ; 出力するデータの先頭アドレスを指定する
    ; 定義済の"Hello World", 0x0aのアドレスがコピーされる
    mov rsi, str_hello
    
    ; 標準出力システムコールの第3引数
    ; 出力するデータのバイト数を指定
    ; 13バイトを指定している
    mov rdx, 13
    
    ; 標準出力システムコール実行
    syscall
    
    ; exitシステムコール 1を指定(現在のプロセスを終了)
    ; x64環境なので先程と同じで0x2000000を加算した値にする
    mov rax, 0x2000001
    
    ; exitシステムコールの第1引数を指定する
    ; ステータスコードをコピー
    mov rdi, 0
    
    ; exitシステムコール実行
    syscall