汇编程序和C编程linux -m32(汇编程序中寄存器的char-byte)

时间:2013-05-04 13:14:17

标签: c linux assembly cpu-registers

我对汇编编程很新,我在C中编写了一个函数,需要在汇编中调用另一个函数。似乎寄存器想要返回四个字符(字节)而不是一个,这就是我想要的。

跳转后忽略代码,因为我只是跳过这部分代码,直到我正常工作。

这实际上应该是我自己在C中的sprintf简化版本的一部分。 我删除了一些代码只是为了让事情发挥作用。它应该返回带有%的第一个参数。因此,当我在C中调用此汇编程序函数时,我可以编写printf("%s", res);(或此示例中为%c)并打印%

.globl printpercent

# Name:        printpercent
# Synopsis:    A simplified sprintf
# C-signature: int printpercent(unsigned char *res, unsigned char *format, ...);
# Registers:   %eax: first argument
#              %ebx: second argument

printpercent:                       # sprinter
    pushl       %ebp        # start of
    movl        %esp, %ebp  # function

    movl        8(%ebp), %eax   # first argument
    movl        12(%ebp), %ebx  # second argument

loop:
    movb        $37, %bl        # lowest bits to %
    movb        %bl, %al
    jmp         exit
    movb        (%ebx), %dl     # 
    cmp         $0, %dl         # Check if 0

    je              exit        # if 0 -> exit

    cmp     $37, %dl            # Check '%' 


    movb        %dl, (%eax)     # if it doesnt equal any above/or default
                                # add to register %eax

    jmp     loop                # jump back to the start of the loop


exit:
    popl        %ebp            # popping standard end of function
                                # 0-byte ?
    ret                         # return

2 个答案:

答案 0 :(得分:1)

您的函数返回int,因此编译将alayws将完整寄存器作为返回值。在您的环境中所有int == 4个字节之后。您必须清除EAX,确保其中没有随机值。

答案 1 :(得分:1)

您可以使用xor轻松清除寄存器,以便在再次使用前清除寄存器:

df[, c(1, x)]