【问题标题】:Use LEA (LEAL) to create an x86 assembly counter使用 LEA (LEAL) 创建 x86 汇编计数器
【发布时间】:2013-04-26 08:26:52
【问题描述】:

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

sum(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

【问题讨论】:

  • notnull(1,2) 将使 4(%esp)=1 和 8(%esp)=2 和 12(%esp) 未使用。如何确定 12(%esp) 是否为空/无?

标签: variables assembly x86


【解决方案1】:

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

基本上,没有办法自动确定传递给函数的参数数量。

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

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

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

【讨论】:

  • 有没有办法可以比较 %esp 或 %ebx 并找出它是否未使用?
猜你喜欢
  • 1970-01-01
  • 2011-04-29
  • 2012-02-27
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多