0

我正在尝试制作一个汇编程序,将未知数量的 int 加在一起,例如

总和(int a,int b,...)

我的代码是

.globl notnull

notnull:
    leal    4(%esp),%ebx
    jmp next2
next:
    leal    4(%ebx),%ebx
next2:
    cmp $0,(%ebx)
    je  end
    movl    (%ebx),%eax
    jmp     next
end:
    ret

我用这个程序测试它:

#include <stdio.h>

extern int notnull();

int main()
{
    int x=notnull(3,2,1,0);
    printf("3,2,1,0 = %d\n",x);

    x=notnull(2,1,0);
    printf("2,1,0 = %d\n",x);

    x=notnull(1,0);
    printf("1,0 = %d\n",x);

    x=notnull(0);
    printf("0 = %d\n",x);

    x=notnull();
    printf("_ = %d\n",x);

    return 0;
}

Wich 给了我这个输出:

3,2,1,0 = 1 (#1)
2,1,0 = 1 (#2)
1,0 = 1 (#3)
0 = 8 (#4)
_ = 8 (#5)

我想要的是程序在没有变量时返回 0(参见 #5),并且还可以使其工作而不必将 0 作为最后一个数字。

notnull(3,2) 的完美输出为 2 和 notnull()=0

4

1 回答 1

1

您需要阅读 C 参数传递约定。

基本上,没有办法自动确定有多少参数被传递给一个函数。

这就是为什么所有 C 函数要么有固定数量的参数,要么如果它们使用可变参数(varargs),它们在可变部分之前有一个固定参数,它以某种方式表示传递了多少额外的参数。

使用空参数列表可以以任何方式有效地调用函数,但它无助于(在函数中)确定有多少参数可用的核心问题。

可能可以通过检查堆栈来解决这个问题,但当然,这需要深入了解您的特定编译器如何选择实现调用。这也可能因不同数量的参数而异。

于 2013-04-26T08:30:52.063 回答