汇编代码的输出-与add混淆
Output of Assembly code - Confusion with add?
我刚刚开始学习汇编,在一个练习中,我必须找到以下代码的输出,但由于我是非常新的,我不确定它是什么,这主要是因为 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;
}
相关文章:
- 增量运算符与后缀混淆
- C++图形类指针混淆
- OpenCV C++.快速计算混淆矩阵
- 结构和双指针隐藏在其他结构中,多层混淆
- 混淆了如何使用IDL与Ethovision进行通信
- 关于 std::min, std::max 中的比较运算符的混淆
- Visual Studio - Cmake Project - Add NetCDF
- 对单链表的混淆
- CMake - 模块 + 库混淆
- 与 for 循环中的变量混淆
- 与浅拷贝构造函数和深拷贝构造函数混淆
- 模板参数部分中有关包扩展的一些混淆
- NS3 插槽混淆(需要帮助理解)
- 与指针算术混淆
- write() 和 read() 中几乎没有混淆
- 与C++哈希表的基础知识混淆
- 混淆 Begin() 方法作为参数
- 编译器生成的默认构造函数具有 constexpr 混淆行为
- 重命名 win32api 函数以进行混淆
- 汇编代码的输出-与add混淆