汇编保留寄存器值?

时间:2013-02-22 22:59:32

标签: assembly x86 printf

我遇到了一些麻烦,我相信是在我在汇编中创建的函数中使用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)。

1 个答案:

答案 0 :(得分:2)

  

如何通过多次调用printnstars来确保(%ecx)保持不变?

将寄存器值保存在堆栈的局部变量中。

另外,请记住printf()采用可变数量的参数,因为它事先不知道它们有多少以及哪种类型,它不会删除堆栈参数并删除它们从堆栈(通过调整esp)成为调用者的责任。