我遇到了一些麻烦,我相信是在我在汇编中创建的函数中使用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)。
答案 0 :(得分:2)
如何通过多次调用printnstars来确保(%ecx)保持不变?
将寄存器值保存在堆栈的局部变量中。
另外,请记住printf()
采用可变数量的参数,因为它事先不知道它们有多少以及哪种类型,它不会删除堆栈参数并删除它们从堆栈(通过调整esp
)成为调用者的责任。