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: などが大域変数の場所を表している。