### 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で条件式に応じてラベル出力まで出力しないといけないのか。中間言語生成のところが結構考えないといけないのかもしれない。 アセンブラ自体は単純で、高級言語の予約語がそれぞれ機能的になっていることがわかる。