Compiler Construction Lecture No.3
Menu先週はさまざまなCPUのレジスタアーキテクチャ(Register architecture)について学んだ。
ARM64 (Aarch) のアセンブラ
例えば、
adrp x8, _a@PAGE x8 レジスタに大域変数の場所を入れる ldr x9, [x8, _a@PAGEOFF] x8 レジスタの差している 変数 a のoffset から x9 に値(64bit)を読み込む sub x9, x9, x10 x9 から x10を引いて、x9 に入れる add x0, x9, #124 124を x9 に足して x0 に入れる str x0, [x8, _a@PAGEOFF] x8 レジスタの差している 変数 a のoffset に x0 の値を格納する stp x0, x1, [sp, -96]! ! を付けると addressing された offset address を sp に入れる
問題3.1
x86_64 アセンブラの実行 Aarch64 アセンブラの実行
アセンブラ(Assembler)を使った計算
intel64 では、基本的に演算は、register to register で行われる。ここでは、以下のプログラムを使おう。
long a=4,b=3; main() { a = a+1-(b-123); return a; }これを clang -O -S でコンパイルしてみると、.s というファイルに以下の内容がかかれる。(コメントはでないが...)
.section __TEXT,__text,regular,pure_instructions .build_version macos, 12, 0 sdk_version 12, 3 .globl _main ; -- Begin function main .p2align 2 _main: ; @main .cfi_startproc ; %bb.0: adrp x8, _a@PAGE ldr x9, [x8, _a@PAGEOFF] # 変数aを x10に持ってくる Lloh0: adrp x10, _b@PAGE Lloh1: ldr x10, [x10, _b@PAGEOFF] # 変数bを x10に持ってくる sub x9, x9, x10 # x9 から x10 の内容を引いて x9 に置く add x0, x9, #124 # 124 を に加算して x0 に置く str x0, [x8, _a@PAGEOFF] # x0 の値を変数 a に格納する ; kill: def $w0 killed $w0 killed $x0 ret .loh AdrpLdr Lloh0, Lloh1 .cfi_endproc ; -- End function .section __DATA,__data .globl _a ; @a .p2align 3 _a: .quad 4 ; 0x4 .globl _b ; @b .p2align 3 _b: .quad 3 ; 0x3 .subsections_via_symbolsとなる。a: などが大域変数の場所を表している。