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。它出现在字节序列的末尾,但在解码中变为前导零(甚至未打印)。