我正在学习循环和跳转程序集,我尝试做一个简单的循环。我希望调用printf
命令10次。我已将counter
变量设置为1.我还将%edx
设置为1,然后在每次迭代时递增它。如果它等于10,那么我们应该退出循环。但现在循环是无限的。我已使用gdb
调试,%edx
似乎在printf
函数中被覆盖。这就是为什么我push %edx
到堆栈而pop
在printf
调用之后回来,但它不起作用。我错过了什么?
.section .data
output:
.asciz "Value is %d\n"
val1:
.int 123
counter:
.int 1
.section .text
.globl _start
_start:
nop
movl counter, %edx # start at 1
gohere:
movl val1, %ebx # move value 123 to %ebx
pushl %edx # push %edx to stack
pushl %ebx # push %ebx to stack
pushl $output
call printf # call printf
popl %edx # pop %edx value
inc %edx
cmp $10, %edx # if %edx is less than 10...
jl gohere # ... go to gohere, otherwise exit
movl $0, %ebx
movl $1, %eax
int $0x80
答案 0 :(得分:2)
你推了output
作为最后一次推送,所以第一个pop会弹出output
。它是Stack,它是LIFO。在弹出它之后,代码output
将在edx
中。
解决它在popl edx
之前放了两个pop:
popl output
popl ebx