Open2

アセンブリコツコツ(aarch64)

RiiiMRiiiM

標準出力にHello World

    .data
msg:
    .ascii "Hello, World!\n"
    .align 3
    .text
    .global _start
_start:
    mov x0, 1              // file descriptor 1 is stdout
    ldr x1, =msg           // address of string to output
    ldr x2, =14            // number of bytes
    mov x8, 64             // syscall: write
    svc 0                  // make syscall
    mov x0, 0              // exit code 0
    mov x8, 93             // syscall: exit
    svc 0                  // make syscall

コメント

x86_64よりシンプルに感じた
x8にシステムコールセットのため、引数は最大8つっぽい

RiiiMRiiiM

arg[0]をエコーする

    .text
    .global _start
_start:
    mov x29, sp // フレームポインタ
    ldr x0, [x29]
    add x1, x29, 8
    ldr x1, [x1]
    mov x2, 0
len_loop: // strlenの実装
    ldrb w3, [x1, x2] //x1をベースアドレスにしてx2分先のアドレスを読み取る
    cbz w3, len_done //w3が0ならlen_doneに分岐
    add x2, x2, 1
    b len_loop
len_done:
    mov x0, 1
    mov x8, 64 //wite()
    svc 0
    mov x0, 0
    mov x8, 93 // exit()
    svc 0

コメント

[]はアドレスの中身を指す
C言語は高級アセンブリと聞くけどそんな気がしてきた