组件,多个参数-m32 / Linux的(C相同stdarg头文件)(Assembly, multi

2019-09-02 00:46发布

为了解决这个问题,我理解C,和我仍然在大会初学者所以我有点坚持一点点问题就在这里。

我遇到一些麻烦把多个参数,也许算来,如果我要做到这一点,在我的汇编代码使用的格式参数。

尝试一些字节添加到许多参数的字符串。 我知道如何把前两个参数的堆栈上,而是先经过其他参数是格式(如%S,%d,%C等)和第一个参数是应该是变量i的一个要写入。 在C,标准主要有说法计数器。 我可能要在这里藏汉算参数!? 我如何能做到这一点,如果这是它是如何做?

     .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

Answer 1:

参数可变型函数是C的功能,所以你可能会被检查出怎样的开源实现来提供最好的服务va_startva_argva_end为建筑/ ABI你感兴趣的内容。

你并不需要一个明确的说法计数printf样的功能,因为这些信息嵌入在格式字符串-一个可变参数预期由格式说明符的数量和细节给出的数量和类型。

需要了解程序调用方面的ABI是相当严重的细节让这一切工作正常。 例如,做浮点和整数参数去同组,或者是一些在寄存器传递? 你需要什么尺寸,以促进类型,以确保您va_arg相当于总能得到正确的事情在正确的时间正确的类型? 等等...



Answer 2:

路上我会做到这一点,如下所示:

你已经知道前两个参数。 下一个参数是16(%EBP),所以我把这个地址转换成注册和使用它作为基址。 现在,我分析我的字符串,因为这给了我多少我登记需要的信息。 对于每一个遇到的说法,从我的基地址获得的价值和四增加它,作为一个参数将在那里。

我想,有没有真正的需要在寄存器中的所有参数在同一时间,因为你可能会扫描formatstirng顺序。



文章来源: Assembly, multiple arguments -m32 / linux (same as stdarg in C)