Я пытаюсь создать for loop
в сборке.
Вот то, чего я пытаюсь добиться, написав на C:
#include <stdio.h>
int main(){
for(int i = 0; i < 10; i++){
printf("%d\n", i);
}
return 0;
}
Вот так выглядит мой ассемблерный код:
.text
.globl _main
loop0.0:
movl -4(%rbp), %eax #eax = i
cmpl $10, %eax #compare i with 10
jg loop0.2 #if 10 > i goto loop0.2
loop0.1:
leaq _format(%rip), %rdi #set arg1 to format
movl -4(%rbp), %esi #set arg2 to i
call _printf #printf(format, i)
movl -4(%rbp), %esi #set esi to i
addl $1, %esi #esi++
movl %esi, -4(%rbp) #i = esi
jmp loop0.0
_main: #int main
pushq %rbp
movq %rsp, %rbp
movl $0, -4(%rbp) #i = 0
jmp loop0.0 #goto loop0.0
loop0.2:
xor %eax, %eax #return 0;
popq %rbp
retq
.data
_format:
.asciz "%d\n"
Когда я запускаю этот код, я получаю текущий вывод:
0
2
2
2
2
2
2
и т. Д.
Почему это такмой код сначала показывает 0
(как и должно быть), а затем два в течение бесконечного количества времени?Я надеюсь, что мои комментарии точны, так как это то, что я думаю, что каждая строка кода делает.