当前位置: 首页 > 知识库问答 >
问题:

Linux x86 CPU指令布局混乱

池赞
2023-03-14

在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指令是否甚至没有endian,是否正在考虑某种类型的字符串?(可能离这里很远)

共有1个答案

姜松
2023-03-14

x86是一个可变长度的指令集,你从一个没有尾数的单字节开始,不管它在哪里。

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

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

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

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

 类似资料:
  • 阅读本章之前,请先阅读概要. 本章会教你通过给布局器一些指导来创建预期的布局;具体的例子可以见教程 简介 Graph::Easy的布局器负责把一个内部的图像表示转换成一个特定的布局,下面是从同一个输入图像产的两个不同的布局: +---+ +---+ +---+ | A | --> | C | --> | D | +---+ +---+ +---+

  • 本文向大家介绍vue  directive定义全局和局部指令及指令简写,包括了vue  directive定义全局和局部指令及指令简写的使用技巧和注意事项,需要的朋友参考一下 directive定义全局和局部指令以及指令简写 1.使用Vue.directive()定义一个全局指令    Vue.directive('指令名称',{对象}) 2.参数一:指令的名称,定义时指令前面不需要写v- 3.参

  • 问题内容: 我们正在运行一个使用几种不同语言的大型项目:Java,Python,PHP,SQL和Perl。 到目前为止,人们一直在自己的私有存储库中工作,但是现在我们希望将整个项目合并到一个存储库中。现在的问题是:目录结构应该如何显示?我们应该为每种语言提供单独的目录,还是按组件/项目将其分开?python / perl / java如何处理常见的目录布局? 问题答案: 我的经验表明,这种布局是最

  • 问题内容: 我使用的是Mac OS X 10.6,在键盘输入选择器菜单中有Dvorak,US Extended和Norwegian,而US Extended是我使用的菜单。 当我使用键盘输入来运行Pygame程序时, 无论 实际选择了什么,pygame似乎都认为我正在使用dvorak 。 这是接受键盘输入的代码部分: 箭头键可以正常工作,但是WASD键以与Dvorak一致的方式分布在键盘上。因此,

  • 我尝试将它注入函数,就像您应该对服务做的那样,以便在全局范围内拥有一个实例,但这并不奏效

  • Tabris.js使用原生平台的能力来对UI界面进行布局。由于显示密度在移动设备之间差异很大,因此Tabris.js中的像素始终用设备独立像素表示。 布局数据 全部控件都支持layoutData属性,该属性定义了控件的排列方式。layoutData的值必须是下列属性组成的一个对象: left right top bottom centerX centerY baseline width heigh