【问题标题】:Assembly, multiple arguments -m32 / linux (same as stdarg in C)汇编,多参数 -m32 / linux(与 C 中的 stdarg 相同)
【发布时间】:2013-04-29 10:15:55
【问题描述】:

为了解决这个问题,我了解 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 assembly format arguments


    【解决方案1】:

    可变参数函数是 C 功能,因此最好查看 va_start、va_arg 和 va_end 的开源实现如何用于您感兴趣的架构/ABI。

    printf-like 函数不需要显式参数计数,因为该信息嵌入在格式字符串中 - 期望的可变参数的数量和类型由格式说明符。

    您将需要了解 ABI 的过程调用方面是非常重要的细节,以使所有这些正常工作。例如,浮点和整数参数是否进入同一个堆栈,或者是否有一些在寄存器中传递?您需要什么大小来提升类型以确保您的 va_arg 等价物总是在正确的时间为正确的类型获得正确的东西?等等……

    【讨论】:

    • 我读了一些关于它的信息。好像我不能使用寄存器作为参数。不知道该怎么做。希望它不是太多的代码。如果有很多参数,我不应该把它们放在寄存器中吗?
    • 如果我知道这个函数能够接受多少个参数,那就太好了,但现在我需要确保它至少接受两个参数,最多有无限个参数。
    • @KimJonatanWesselBjørneset,函数调用的寄存器和堆栈的使用由您的 ABI/过程调用标准定义。如果您正在发明自己的 ABI,那么您可以做任何您想做的事情。但是请记住,您的寄存器数量有限,因此您可能需要一些方法将额外的内容放入堆栈。
    【解决方案2】:

    我的做法如下:

    您已经知道前两个参数。下一个参数将在 16(%ebp) 上,所以我会将这个地址放入寄存器并将其用作基地址。现在我解析我的字符串,因为这给了我需要多少寄存器的信息。对于遇到的每个参数,从我的基地址获取值并将其增加四,因为下一个参数将在那里。

    我想没有必要同时在寄存器中保存所有参数,因为您可能会按顺序扫描格式。

    【讨论】:

    • 是的,我认为这可能是一个很好的解决方案。现在尝试在每个参数之后将地址增加四。除了我不确定如何...尝试了 addl 4(%ebp),但运行时出现 seg 错误:(
    • 您正在增加内存而不是寄存器。您必须执行“添加 4,%reg”
    • 如果您不确定寻址模式,我会编写一个简单的 C 程序并查看编译器输出。您可以让编译器创建一个您可以查看的 asm 文件,该文件非常具有指导性。
    • 我明白了。像这样:movb 16(%ebp, %ebx, 4), %al # next arg
    猜你喜欢
    • 2013-04-28
    • 2021-09-16
    • 2017-03-21
    • 2011-04-10
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多