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


Shinji KONO / Fri Oct 4 15:52:31 2024