【发布时间】:2010-03-01 10:20:47
【问题描述】:
当在 C 代码的循环中使用 continue 语句时,GCC 会在循环块结束之前创建一个带有 nop 指令的新标签并跳转到它,而不是跳转到循环块本身的末尾。比如下面的C代码
for (i=0; i<10; i++) {
puts("blah\n");
if (i < 10) continue;
puts("This shouldn't be printed.\n");
}
产生以下 ASM 等效项(使用 gcc -S ):
movl $0, 28(%esp)
jmp L2
L5:
movl $LC0, (%esp)
call _puts
cmpl $9, 28(%esp)
jle L7
L3:
movl $LC1, (%esp)
call _puts
jmp L4
L7:
nop
L4:
incl 28(%esp)
L2:
cmpl $9, 28(%esp)
jle L5
(插入了 if (i
我的问题是,为什么不直接跳到 L4 呢? IMO 我们也可以跳到 L4,我错过了什么吗?
【问题讨论】: