c - 汇编程序和 C 编程 linux -m32(来自汇编程序寄存器的字符字节)

标签 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

最佳答案

您的函数返回 int,因此编译当然会将整个寄存器作为返回值。毕竟 int == 4 bytes 在你的环境中。您必须清除 EAX 以确保其中没有随机值。

关于c - 汇编程序和 C 编程 linux -m32(来自汇编程序寄存器的字符字节),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374677/

相关文章:

c - 如何读取文件和分离值

c - 延迟/保留 opencv 连续帧中的文本

linux - 传递\*作为参数的参数

linux - 使用 Linux find 的奇怪结果

c - double 型矩阵 [n]x[n] 传输至 ASSEMBLY

c++ - 在 cmake 中,cmake 文件夹和 CMakeLists.txt 可以放在不同的文件夹中吗?

c - 数组赋值给C中的指针

linux - 是否有与 freebsd hwpmc 等效的 linux/端口?

gcc - 英特尔汇编语法 OFFSET

assembly - 混合使用EVEX和VEX编码方案的代价是什么?