汇编代码的输出-与add混淆

Output of Assembly code - Confusion with add?

本文关键字:add 混淆 输出 代码 汇编      更新时间:2023-10-16

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

汇编代码:

addi $8, $0, 0     # $8 = $0 + 0 = 0 + 0 = 0
addi $9, $0, 8     # $9 = $0 + 8 = 0 + 8 = 8
L1:
    add $4, $0, $8      # $4 = $0 + $8 = $8
    addi $2, $0, 1     # $2 = $0 + 1 = 0 + 1 = 1
    addi $8, $8, 1     # $8 = $8 + 1
    syscall     # show the number in $4 
bne $8, $9, L1     # if $8 ≠ $9 go to L1 (line 3)

在我看来,上面的代码应该输出数字 0-7 ,但是因为我是汇编的新手,我想把代码翻译成c++来弄清楚,但是在c++中我得到了 1-8 ,因为我倾向于把 add $4, $0, $8 翻译成 $4 = &$8

c++代码:

#include <iostream>
using namespace std;
int main() {
  int $0 = 0, $2, $8, $9, *$4;
  $8 = $0 + 0;      // $8 = 0
  $9 = $0 + 8;      // $9 = 8
  do {
    $4 = &$8;
    $2 = $0 + 1;
    $8 = $8 + 1;
    cout << *$4 << endl;
  }
  while ($8 != $9);
  return 0;
}

问题: Assembly的 add $4, $0, $8 应该被认为是 $4 是指向 $8 的指针还是仅仅等于 $8 的指针?(混淆是由 add 旁边的注释造成的).

您将$4的值设置为$8的值,无论该指令执行时的值是多少。你的代码是说,因为你是将$8的值添加到$0,这与将$8的值加载到$4是一样的。

注意,您可以通过使用move $4 $8完成相同的事情。

正如Zach所提到的,你的c++代码将$4设置为$8地址的值,但程序集将$4设置为$8。因此,下面是正确的c++代码。它打印出来的是一个练习!

另外$2只是为系统调用设置的,所以我们在c++代码中不需要它:我已经删除了它,以摆脱"未使用的变量"警告。

#include <iostream>
using namespace std;
int main() {
  int $0 = 0, $8, $9, $4;
  $8 = $0 + 0;      // $8 = 0
  $9 = $0 + 8;      // $9 = 8
  do {
    $4 = $8;
    $8 = $8 + 1;
    cout << $4 << endl;
  }
  while ($8 != $9);
  return 0;
}