C++ Y86 反汇编程序 - 如何解释 .quad
C++ Y86 Disassembler - How to interpret .quad
因此,对于 class 作业,我们正在用 C++ 编写 Y86(玩具处理器)反汇编程序。很简单,我几乎完成了所有事情,除了将指令反汇编成 .quad 指令。
quad 指令接受一个数字或十六进制值,然后将其转换为一个 8 字节 "instruction"(它不是真正的指令,.quad 是处理器中唯一需要 8 个字节的东西所以如果您遇到 8 字节的行,您会自动知道您正在查看代表该值的四边形)。下面是一个例子,因为我的解释可能不是很好:
https://image.prntscr.com/image/h5xAoE4YRryl7HSJ13o5Yg.png
很容易看出前两个四边形在反汇编时向右移动了 2 位,但接下来的两个向左移动了 2 位。我在这里缺少什么模式?这里有一些更多的拆解四边形的例子:
0x0a0: 0300000000000000 | value: .quad 3
0x0a8: | list:
0x0a8: ffffffffffffffff | .quad -1
0x0b0: 0300000000000000 | .quad 3
0x0b8: 0500000000000000 | .quad 5
0x0c0: 0900000000000000 | .quad 9
0x0c8: 0300000000000000 | .quad 3
0x0d0: 2800000000000000 | .quad 40
0x0d8: 3000000000000000 | .quad 48
0x0e0: fcffffffffffffff | .quad -4
0x0e8: 0300000000000000 | .quad 3
0x0f0: 0700000000000000 | .quad 7
0x0f8: 0200000000000000 | .quad 2
0x100: 0300000000000000 | .quad 3
0x108: f6ffffffffffffff | .quad -10
0x110: f8ffffffffffffff | .quad -8
本质上,我正在尝试编写一种算法,该算法将获取那些屏幕截图左侧的内容(汇编处理器代码)和 return“.quad 0xblahblah”,但我无法弄清楚是什么它正在处理十六进制值,以便让它们像那样。
我目前的C++代码如下:
unsigned int x;
stringstream oss;
oss << "0x" << std::uppercase << std::left << std::setw(20) << std::hex << hex;
string result = oss.str();
std::istringstream converter(result);
converter >> std::hex >> x;
但是当它应该 returning 你在我发布的第一个屏幕截图中看到的 .quads 时,它 returning 这个:
0x0d000d000d000000
0xc000c000c0000000
0x000b000b000b0000
0x00a000a000a00000
当我需要弄清楚它在做什么以结束时,这是汇编机器代码的确切值
0x000d000d000d0000
0x00c000c000c00000
0x0b000b000b000000
0xa000a000a0000000
如示例屏幕截图所示。
It's easy enough to see that the first two quads there are bit shifted 2 to the right on disassembly, but then the next two are bit-shifted 2 to the left.
没有 2 位移位。如果不密切注意,会出现 2 个半字节(8 位)的移位。
What's the pattern I'm missing here?
这不是移位,而是字节倒序。
不要尝试使用 000A000A000A 等重复模式,而是尝试使用 0123456789AB 等计数模式
并注意最重要的词,在几乎所有示例中都是 0x0000。它出现在字节序列的末尾,但在解码中变为前导零(甚至未打印)。
因此,对于 class 作业,我们正在用 C++ 编写 Y86(玩具处理器)反汇编程序。很简单,我几乎完成了所有事情,除了将指令反汇编成 .quad 指令。
quad 指令接受一个数字或十六进制值,然后将其转换为一个 8 字节 "instruction"(它不是真正的指令,.quad 是处理器中唯一需要 8 个字节的东西所以如果您遇到 8 字节的行,您会自动知道您正在查看代表该值的四边形)。下面是一个例子,因为我的解释可能不是很好:
https://image.prntscr.com/image/h5xAoE4YRryl7HSJ13o5Yg.png
很容易看出前两个四边形在反汇编时向右移动了 2 位,但接下来的两个向左移动了 2 位。我在这里缺少什么模式?这里有一些更多的拆解四边形的例子:
0x0a0: 0300000000000000 | value: .quad 3
0x0a8: | list:
0x0a8: ffffffffffffffff | .quad -1
0x0b0: 0300000000000000 | .quad 3
0x0b8: 0500000000000000 | .quad 5
0x0c0: 0900000000000000 | .quad 9
0x0c8: 0300000000000000 | .quad 3
0x0d0: 2800000000000000 | .quad 40
0x0d8: 3000000000000000 | .quad 48
0x0e0: fcffffffffffffff | .quad -4
0x0e8: 0300000000000000 | .quad 3
0x0f0: 0700000000000000 | .quad 7
0x0f8: 0200000000000000 | .quad 2
0x100: 0300000000000000 | .quad 3
0x108: f6ffffffffffffff | .quad -10
0x110: f8ffffffffffffff | .quad -8
本质上,我正在尝试编写一种算法,该算法将获取那些屏幕截图左侧的内容(汇编处理器代码)和 return“.quad 0xblahblah”,但我无法弄清楚是什么它正在处理十六进制值,以便让它们像那样。
我目前的C++代码如下:
unsigned int x;
stringstream oss;
oss << "0x" << std::uppercase << std::left << std::setw(20) << std::hex << hex;
string result = oss.str();
std::istringstream converter(result);
converter >> std::hex >> x;
但是当它应该 returning 你在我发布的第一个屏幕截图中看到的 .quads 时,它 returning 这个:
0x0d000d000d000000
0xc000c000c0000000
0x000b000b000b0000
0x00a000a000a00000
当我需要弄清楚它在做什么以结束时,这是汇编机器代码的确切值
0x000d000d000d0000
0x00c000c000c00000
0x0b000b000b000000
0xa000a000a0000000
如示例屏幕截图所示。
It's easy enough to see that the first two quads there are bit shifted 2 to the right on disassembly, but then the next two are bit-shifted 2 to the left.
没有 2 位移位。如果不密切注意,会出现 2 个半字节(8 位)的移位。
What's the pattern I'm missing here?
这不是移位,而是字节倒序。
不要尝试使用 000A000A000A 等重复模式,而是尝试使用 0123456789AB 等计数模式
并注意最重要的词,在几乎所有示例中都是 0x0000。它出现在字节序列的末尾,但在解码中变为前导零(甚至未打印)。