C++ 汇编语言中的while循环

C++ 汇编语言中的while循环,c++,assembly,C++,Assembly,C++中有这样的代码: #include <iostream> int main(){ int a = 4; while(a--){ std::cout << (a + 1) << '\n'; } return 0; } 检查while循环a是否为零并跳转难道不是很简单吗?我已经很久没有做过汇编了,但我认为这是一些优化,以保持管道繁忙/优化寄存器使用。while条件在形式上等同于: while ( a -- != 0 ) (省略比

C++中有这样的代码:

#include <iostream>

int main(){
  int a = 4;
  while(a--){
    std::cout << (a + 1) << '\n';
  }
  return 0;
}

检查while循环a是否为零并跳转难道不是很简单吗?

我已经很久没有做过汇编了,但我认为这是一些优化,以保持管道繁忙/优化寄存器使用。

while条件在形式上等同于:

while ( a -- != 0 )
(省略比较是一种法律混淆。)

编译器正在生成代码以将
a
0
进行比较,保存 在寄存器
al
中生成结果,然后递减
a
,然后测试保存的 结果

因为
a--
意味着

tmpval=a;
a=a-1;
return tmpval;
因此,编译器需要保存
a
的上一个值。
在此程序中,while的主体部分将在
a=0
时执行(在
a--
之后,因此它将打印
1
)。

它实现后减量运算符。先测试,后修改。a的最终值为-1,而不是0。大概是因为需要再次添加1才能显示。附录:是的,编译器本可以对其进行更好的优化,但这段代码可能更容易生成。@Tintorius仅查看代码,我假设没有进行优化。(通过优化,我希望变量
a
完全消失,它的值保存在寄存器中。当然还有更聪明的生成代码的方法:像
suba,1;jc
这样的方法出现在我的脑海中。)
while ( a -- != 0 )
tmpval=a;
a=a-1;
return tmpval;