我是汇编编程的新手,我用 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/