cのfor文、while文とassembler

### for

int main(void) {

    for(int i = 0; i < 5; i++) {
        printf("hello\n");
    }

    return 0;
}
        stp         fp,lr,[sp,#-0x20]!
        mov         fp,sp
        mov         w8,#0
        str         w8,[sp,#0x10]
        b           |$LN4@main|
|$LN2@main|
        ldr         w8,[sp,#0x10]
        add         w8,w8,#1
        str         w8,[sp,#0x10]
|$LN4@main|
        ldr         w8,[sp,#0x10]
        cmp         w8,#5
        bge         |$LN3@main|
        adrp        x8,|$SG4984|
        add         x0,x8,|$SG4984|
        bl          printf
        b           |$LN2@main|
|$LN3@main|
        mov         w0,#0
        ldp         fp,lr,[sp],#0x20
        ret

for文は、その記述の通り、0でmov, strして、その後ad w8 w8 #1として、cmpで5より小さいか判定してprintfしていますね。c言語だとi++より先にi<10と書いているが、assemblerではi++が上に来るのが興味深い ### while [code] #include <stdio.h> int main(void) { int count = 0; while (count < 5) { printf("hello\n"); count++; } return 0; } [/code] [code] |main| PROC |$LN5| stp fp,lr,[sp,#-0x20]! mov fp,sp mov w8,#0 str w8,[sp,#0x10] |$LN2@main| ldr w8,[sp,#0x10] cmp w8,#5 bge |$LN3@main| adrp x8,|$SG4983| add x0,x8,|$SG4983| bl printf ldr w8,[sp,#0x10] add w8,w8,#1 str w8,[sp,#0x10] b |$LN2@main| |$LN3@main| mov w0,#0 ldp fp,lr,[sp],#0x20 ret [/code] whileの場合も内部処理的にはcmpして、そのまま処理するか、bgeでjumpするかを記述しており、forと似たような処理となっている。 compilerを作る際には、ASTで条件式に応じてラベル出力まで出力しないといけないのか。中間言語生成のところが結構考えないといけないのかもしれない。 アセンブラ自体は単純で、高級言語の予約語がそれぞれ機能的になっていることがわかる。