我在使用汇编语言中创建的函数中,遇到了一些问题,我认为这与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个星号,但当我再次调用它时,它会打印无数个星号。很明显,在 printf 函数内部 %ecx 必须已经被篡改了,因为我没有在自己创建的任何内容中使用该寄存器。我该怎么做才能确保在多次调用 printnstars 时 (%ecx) 的值保持不变呢?
此外,也许需要注意的是,这是在一个函数内使用的,该函数打印带有星号的直方图,每行星号表示数字出现的次数。 我所有基于 %ecx 的频率值,所以我正在使用 (%ecx)。