【问题标题】:Are local variables necessary? [closed]局部变量是必需的吗? [关闭]
【发布时间】:2017-02-10 11:29:19
【问题描述】:

我的理解是 C 调用约定在调用函数之前将参数放在堆栈上。这些参数可以通过显式堆栈参数在函数内访问,使用EBP 作为引用,例如[EBP + 8][EBP + 12]

我的问题是如果可以这样访问,为什么需要局部变量? - 函数不能直接使用参数吗?是不是只针对函数没有参数,但仍然初始化局部变量供内部使用的情况?

【问题讨论】:

  • 我不太明白这个问题。局部变量通常也被放入堆栈,因此没有真正的区别。或者你的意思是问“为什么将东西加载到 CPU 寄存器中,而不是每次都从堆栈(或其他内存区域)访问它们?”
  • 一个函数确实可以修改它的参数,而且正如你所说的那样。但是,如果一个函数想要存储未作为参数传递的附加数据怎么办?然后它需要一个局部变量。您是在编译的 C 代码的上下文中询问,还是在手动编写汇编时询问?在后一种情况下,实际上没有“局部变量”之类的东西——只是分配在堆栈或内存其他地方的空间。

标签: assembly x86 masm calling-convention


【解决方案1】:

很多时候,函数需要记住的数据不仅仅是参数。例如,考虑这个函数计算其参数中设置的位数:

int popcount(int k)
{
    int count = 0;

    while (k != 0) {
        k &= k - 1;
        count++;
    }

    return (count);
}

除了参数,我们还需要记住我们看到了多少位。因此,需要一个局部变量。

【讨论】:

    猜你喜欢
    • 2012-09-25
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多