汇编代码的输出 - 与添加混淆?

Output of Assembly code - Confusion with add?

我刚开始学习汇编,在一个练习中我必须找到以下代码的输出,但由于我是新手,我不确定它是什么,这主要是因为 add.

汇编代码:

addi , [=10=], 0     #  = [=10=] + 0 = 0 + 0 = 0
addi , [=10=], 8     #  = [=10=] + 8 = 0 + 8 = 8
L1:
    add , [=10=],       #  = [=10=] +  = 
    addi , [=10=], 1     #  = [=10=] + 1 = 0 + 1 = 1
    addi , , 1     #  =  + 1
    syscall     # show the number in  
bne , , L1     # if  ≠  go to L1 (line 3)

按照我的看法,上面的代码应该输出数字0-7,但是由于我是汇编新手,所以我想到了翻译代码到 C++ 来弄清楚,但在 C++ 中我得到 1-8,因为我倾向于将 add , [=15=], 翻译为 = &.

C++代码:

#include <iostream>
using namespace std;

int main() {
  int [=11=] = 0, , , , *;

   = [=11=] + 0;      //  = 0
   = [=11=] + 8;      //  = 8

  do {
     = &;
     = [=11=] + 1;
     =  + 1;
    cout << * << endl;
  }
  while ( != );
  return 0;
}

问题: Assembly 的 add , [=15=], 是否被认为是 是指向 的指针,或者简单地等于当时 的指针。 (混乱是由 add 旁边的评论造成的).

您正在将 $4 的值设置为 $8 的值,无论执行该指令时它是什么。您的代码表示,由于您将 $8 的值添加到 $0,这与将 $8 的值加载到 $4 是一样的。

请注意,您可以使用 move 来完成同样的事情。

如 Zach 所述,您的 C++ 代码将 $4 设置为 $8 地址的值,但程序集将 $4 的值设置为 $8。因此正确的 C++ 代码如下。打印出来的留作练习!

此外,$2 只是为系统调用设置的,因此我们的 C++ 代码中不需要它:我已将其删除以消除 "unused variable" 警告。

#include <iostream>
using namespace std;

int main() {
  int [=10=] = 0, , , ;

   = [=10=] + 0;      //  = 0
   = [=10=] + 8;      //  = 8

  do {
     = ;
     =  + 1;
    cout <<  << endl;
  }
  while ( != );
  return 0;
}