【发布时间】:2013-02-22 22:59:31
【问题描述】:
在我在汇编中创建的函数中使用 printf 时,我遇到了一些麻烦。我做的功能是:
printnstars:
movl $0, %edi
movl 4(%esp), %ebx
starloop:
cmpl %ebx, %edi
je exitloop
incl %edi
pushl $star
call printf
addl $4, %esp
jmp starloop
exitloop:
ret
该函数接受一个数字作为参数,我将其移至 %ebx,并使用以下方法打印该数量的“*”:
star:
.asciz "*"
这个函数做了它应该做的事情,但是当我尝试做这样的事情时遇到了问题:
pushl (%ecx)
call printnstars
pushl (%ecx)
call printnstars
其中 (%ecx) 是 2。如果我只调用一次,它的行为与预期一样并打印 2 颗星,但当我再次调用它时,它会打印出无限颗星。很明显 %ecx 一定是在 printf 内部弄乱了,因为我没有在我创建的任何东西中使用该寄存器。我该怎么做才能确保 (%ecx) 通过多次调用 printnstars 保持不变?
还需要注意的是,这是在一个函数内部使用的,该函数正在打印一个直方图,每行上都有星号,表示一个数字出现的次数。我的所有频率值都基于 %ecx,这就是我使用 (%ecx) 的原因。
【问题讨论】:
-
杰克,请停止污蔑你的问题。我不会删除它,因为这是一个很好的问题,也有很好的答案。