【发布时间】:2016-07-20 00:27:31
【问题描述】:
在 x86 中,我了解多字节对象以小端方式存储在内存中。
现在一般来说,当涉及到 CPU 指令时,操作码决定了指令的用途,并且数据/内存地址可能会跟随操作码的编码格式。我的理解是指令的操作码部分应该是最高有效字节,因此出现在任何给定指令编码表示的最高地址。
有人可以解释这个 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 指令是否甚至没有字节序并且正在考虑某种类型的字符串? (可能离这里很远)
【问题讨论】:
-
#2 是正确的。指令没有字节序,尽管嵌入其中的常量有。正如您在 gdb 转储中所见,操作码 是 的第一个字节(但它前面可能有前缀字节)。另请参阅英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷:指令集参考,A-Z,第 2 章指令格式
-
当涉及到内存表示时,我可能会将多字节整数与包含多个字节的 CPU 指令混淆
-
感谢 Jester 指出操作码 是 编码指令的第一个字节,是我漏掉的。
-
How does the CPU know how many bytes the instruction will take up这个网站上已经有很多答案了
标签: linux assembly x86 endianness