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

时间:2016-10-27 00:31:28

标签: c++ assembly mips add

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

汇编代码:

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) ,但由于我是Assembly的新手,我想把代码翻译成C ++来计算它out,但是在C ++中我得到了 0-7 ,因为我倾向于将 1-8 翻译为 add $4, $0, $8

C ++代码:

$4 = &$8

问题:大会的 #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; } 被认为是 add $4, $0, $8 指向的指针$4 或简单地等于当时的 $8 (混淆是由 $8 旁边的评论创建的

2 个答案:

答案 0 :(得分:2)

您将$ 4的值设置为$ 8的值,无论执行该指令时是什么。您的代码说,因为您要将$ 8的值添加到$ 0,所以只需将$ 8的值加载到$ 4即可。

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

答案 1 :(得分:2)

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

此外,系统调用只设置了2美元,因此我们在C ++代码中不需要它:我已将其删除以删除&#34;未使用的变量&#34;警告。

#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;
}