gpt4 book ai didi

Linux x86 CPU指令布局困惑

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:08 25 4
gpt4 key购买 nike

在 x86 中,我理解多字节对象存储在内存小端字节序中。

现在一般来说,当涉及到 CPU 指令时,OPCODE 决定了指令的目的,数据/内存地址可能遵循其编码格式的操作码。我的理解是指令的操作码部分应该是最重要的字节,因此出现在任何给定指令编码表示的最高地址。

有人可以解释一下这个 x86 linux gdb 示例的内存布局吗?我认为操作码 0xb8 会出现在更高的地址,因为它是最重要的字节。

(gdb) disassemble _start

Dump of assembler code for function _start:
0x08048080 <+0>: mov eax,0x11223344

(gdb) x/1xb _start+0
0x8048080 <_start>: 0xb8
(gdb) x/1xb _start+1
0x8048081 <_start+1>: 0x44
(gdb) x/1xb _start+2
0x8048082 <_start+2>: 0x33
(gdb) x/1xb _start+3
0x8048083 <_start+3>: 0x22
(gdb) x/1xb _start+4
0x8048084 <_start+4>: 0x11

看起来指令 mov eax, 0x11223344 编码为 0x11 0x22 0x33 0x44 0xb8。

问题。

1.) 如果 CPU 看到的第一个字节不是操作码,它如何知道指令将占用多少字节?

2.) 我想知道 x86 cpu 指令是否甚至没有字节顺序并且正在考虑某种类型的字符串? (可能离这里很远)

最佳答案

x86 是一个可变长度的指令集,你从一个没有字节序的字节开始,它在任何地方。

然后根据操作码,可能会有更多字节,例如,这些字节可能是 32 位立即数,并且(如果该字节组是立即数或某种地址)这些字节将是小端字节序。假设您有五个字节 ABCDE(没有字节序,想想数组或字符串)。 A 字节是操作码,B 字节是立即数的低 8 位,E 是立即数的高 8 位。

操作码是一个很难使用的术语,在这些较旧的 8/16 位 CISC 处理器(如 x86)中,整个字节都是一个操作码,您基本上可以在表格中查找它的含义(并且在处理器内部他们确实使用了表来弄清楚如何执行它)。当您查看 MIPS 或 ARM 或其他(当然是 RISC)指令集时,只有 32 位的一部分是“操作码”,在这两种情况下,一条指令到另一条指令都不是同一组位,您必须查看指令中的不同位置(是的,有重叠以使解码理智),MIPS 更加一致,你在一个地方看到一个 blob,但其中一个模式要求你查看另一个 blob位完全解码。 ARM 你从一个公共(public)位开始,随着你的工作,你正在进一步解码指令,然后你可能需要捕获一些随机的点来完全解码。其余位是操作数,要使用的寄存器或立即数,或者在 CISC 中您需要查找表的任何类型的东西(由操作码暗示但未由操作码中的位定义)。

1) 前一条指令之后的下一个字节将被解释为一个操作码,即使它不是一个操作码(如果执行继续到那个字节并且没有分支)。我不记得我的 x86 表是为了知道是否有任何未定义的指令,如果未定义,那么它会遇到一个处理程序,否则它会将它找到的内容解码为机器代码,如果它的格式不正确,指令可能会崩溃,有时你很幸运,它只是搞砸了一些事情并继续前进,或者更幸运,你不能说它几乎崩溃了。

2) 对于这些 8/16 位 CISC 或类似指令集,您是正确的,它们更像是您线性解析的字符串。

关于Linux x86 CPU指令布局困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38470549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com