Home | Notifications | New Note | Local | Federated | Search | Logout

Note Detail


諏訪子@suwako@sns.076.moe (2026-02-12 20:39:58)
CとC++プログラマの間では、ループは3種類あるとされている:whileループ、forループ、do-whileループ
然し、実は秘密の「4つ目のループ」が存在する事を知っているの?int main(void) {
int i = 0;

loop:
if (i >= 10) goto done;
printf("%d\n", i);
++i;
goto loop;

done:
return 0;
}
此の書き方は、アセンブリ言語の命令にも自然にマッピングされる.section .data
i: db 0 ; int i = 0;

.section .bbs
fmt: db "%d", 13, 10 ; const char fmt = "%d\n\0";

.section .text
.global _start

_start:
cmp byte [i], 10 ; if (i == 10)
jge .done ; i >= 10 の場合、goto done;

.loop:
mov rsi, byte [i] ; rsi = i;
lea rdi, [rel fmt] ; rdi = fmt;
xor rax, rax ; AL = 0
call printf ; printf("%d\n", i);

inc byte [i] ; i++;
jmp .loop ; goto loop;

.done:
xor rdi, rdi ; return 0;
mov rax 1 ; SYS_EXIT (FreeBSD版)
syscall
Reply

---Replies---
諏訪子@suwako@sns.076.moe (2026-02-12 23:09:24)
修正:_start:
.loop:
cmp byte [i], 10 ; if (i == 10)
jge .done ; i >= 10 の場合、goto done;

mov rsi, byte [i] ; rsi = i;
lea rdi, [rel fmt] ; rdi = fmt;
xor rax, rax ; AL = 0
call printf ; printf("%d\n", i);

inc byte [i] ; i++;
jmp .loop ; goto loop;
失礼しました・・・