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