我对汇编编程很新,我在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
答案 0 :(得分:1)
您的函数返回int,因此编译将alayws将完整寄存器作为返回值。在您的环境中所有int == 4个字节之后。您必须清除EAX,确保其中没有随机值。
答案 1 :(得分:1)
您可以使用xor轻松清除寄存器,以便在再次使用前清除寄存器:
df[, c(1, x)]