为了解决这个问题,我了解C,而且我仍然是汇编的初学者,所以我在这里遇到了一个小问题。
我在获取多个参数时遇到了一些麻烦,如果我应该这样做的话,也许可以对它们进行计数,并在汇编代码中使用格式参数。
尝试向具有许多参数的字符串添加一些字节。我知道如何将前两个参数放在堆栈上,但第一个参数之后的其他参数是格式(如 %s、%d、%c 等),第一个参数应该是变量 i想写信给.
在 C 中,标准 main 有参数计数器。我可能也想计算这里的争论!?如果是这样的话,我该怎么做?
.globl minisprintf
# Name: minisprintf
# Synopsis: A simplified sprintf
# C-signature: int minisprintf(unsigned char *res, unsigned char *format, ...);
# Registers: AL: for characters
# %ECX: first argument, res
# %EDX: second argument, args
#
minisprintf: # minisprintf
pushl %ebp # start of
movl %esp, %ebp # function
movl 8(%ebp), %ecx # first argument
movl 12(%ebp), %edx # second argument
# other arguments
# checking last byte of string res
可变参数函数是一项 C 功能,因此您可能最好了解一下以下内容的开源实现:va_start
, va_arg
, and va_end
对于您感兴趣的架构/ABI。
您不需要明确的参数计数printf
-like 函数,因为该信息嵌入在格式字符串中 - 期望的可变参数的数量和类型由格式说明符的数量和详细信息给出。
You will需要了解 ABI 的过程调用方面是非常重要的细节,才能使所有这些正常工作。例如,浮点和整数参数是否进入同一个堆栈,或者某些参数是否传入寄存器?您需要将类型提升到什么尺寸才能确保您的va_arg
等价物总是在正确的时间为正确的类型提供正确的东西?等等...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)