我刚刚开始学习汇编,在一个练习中我必须找到以下代码的输出,但由于我很新,我不确定它是什么,这主要是因为 {{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
旁边的评论创建的。
答案 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;
}