Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux x86 CPU指令布局混乱_Linux_Assembly_X86_Endianness - Fatal编程技术网

Linux x86 CPU指令布局混乱

Linux x86 CPU指令布局混乱,linux,assembly,x86,endianness,Linux,Assembly,X86,Endianness,在x86中,我知道多字节对象存储在内存中的是little endian样式 现在一般来说,当涉及到CPU指令时,操作码决定指令的用途,数据/内存地址可能以其编码格式跟随操作码。我的理解是指令的操作码部分应该是最高有效字节,因此出现在任何给定指令编码表示的最高地址 有人能解释一下这个x86 linux gdb示例上的内存布局吗?我可以想象操作码0xb8会出现在更高的地址,因为它是最重要的字节 (gdb) disassemble _start Dump of assembler code for

在x86中,我知道多字节对象存储在内存中的是little endian样式

现在一般来说,当涉及到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

问题

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


二,。我想知道x86CPU指令是否甚至没有endian,是否正在考虑某种类型的字符串?x86是一个可变长度的指令集,您可以从一个没有尾数的字节开始,无论它在哪里

然后,根据操作码的不同,可能会有更多的字节,例如,这些字节可能是32位立即数,如果这组字节是立即数或某种类型的地址,那么这些字节将是小尾数。假设你有五个字节ABCDE无尾数,想想数组或字符串。A字节是操作码,B字节是立即数的下8位,E字节是立即数的上8位

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

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


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

x86是一个可变长度的指令集,您从一个无尾端的单字节开始,无论它在哪里

然后,根据操作码的不同,可能会有更多的字节,例如,这些字节可能是32位立即数,如果这组字节是立即数或某种类型的地址,那么这些字节将是小尾数。假设你有五个字节ABCDE无尾数,想想数组或字符串。A字节是操作码,B字节是立即数的下8位,E字节是立即数的上8位

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

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


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

2是正确的。指令没有尾数,尽管其中嵌入的常量有尾数。正如您在gdb转储中所看到的,操作码是第一个字节,但前面可能有前缀字节。另请参见英特尔®64和IA-32体系结构软件开发人员手册第2卷:指令集参考,A-Z,第2章指令格式当涉及到内存表示时,我可能会混淆多字节整数与包含多个字节的CPU指令感谢Jester指出操作码是编码指令的第一个字节,CPU是如何知道指令将占用多少字节的呢?在这个网站上有很多关于这个问题的答案。re:endianness:2是正确的。指令没有尾数,尽管其中嵌入的常量有尾数。正如您在gdb转储中所看到的,操作码是第一个字节,但前面可能有前缀字节。另请参见英特尔®64和IA-32体系结构软件开发人员手册第2卷:指令集参考,A-Z,第2章指令格式当涉及到内存表示时,我可能会混淆多字节整数与包含多个字节的CPU指令感谢Jester指出操作码是编码指令的第一个字节,CPU是如何知道指令将占用多少字节的在这个站点上有很多关于这个问题的答案alreadyNear duplicate:,和re:endianness:是的,我很清楚ARM和MIPS在一些内核中有16位的备用指令集,ARM甚至更糟糕,它使用了一个可变长度的16位指令集thumb2对thumb的扩展。加上所有的浮点数据,可能是JAVA数据,等等。为了便于解释,上面只讨论固定32位指令是可以的。如果你在谷歌上搜索一下,你会发现mips和arm的编码,也许你可以看到它们是如何解码的,它们的设计方法都不同。谢谢你,德韦尔奇,我很感谢你的见解。我想我可能没有回答问题1。cpu是如何知道它读取的操作码并告诉它的。它从操作码和/或附加字节中知道该指令需要多少字节。它是可变长度的,因此一些指令短至一个字节,而另一些指令可能相对较长。我想什么是最长的英特尔指令这个问题已经被问了很多次了,在我看来不是那么有趣,但一些人也同意了。你在我看来基本上是正确的。操作码讲述了这个故事,后面的直接数、地址和偏移量都是小端点。但它们被视为小字节串,它们不在任何边界上对齐,因为它们的长度随指令和该指令的选项而变化。intel文档对此进行了说明,文档很容易通过联机或打印方式获得。因此,当我们将一个字的数据从内存传输到寄存器EAX时,该字最低地址的LSB将传输到EAX的低位8位。。简单地说,CPU的指令寄存器是否相似,因为它将指令传输到CPU中,并且指令寄存器的最高有效字节指的是传输到CPU中的指令的操作码?是的,我很清楚ARM和MIPS在一些内核中有16位备用指令集,ARM甚至更糟糕,它使用了一个可变长度的16位指令集thumb2对thumb的扩展。加上所有的浮点数据,可能是JAVA数据,等等。为了便于解释,上面只讨论固定32位指令是可以的。如果你在谷歌上搜索一下,你会发现mips和arm的编码,也许你可以看到它们是如何解码的,它们的设计方法都不同。谢谢你,德韦尔奇,我很感谢你的见解。我想我可能没有回答问题1。cpu是如何知道它读取的操作码并告诉它的。它从操作码和/或附加字节中知道该指令需要多少字节。它是可变长度的,因此一些指令短至一个字节,而另一些指令可能相对较长。我想问题是什么
是最长的英特尔指令被多次询问,在我看来并不是那么有趣,但有些人也这么做了。在我看来,你基本上是正确的。操作码讲述了这个故事,后面的直接数、地址和偏移量都是小端点。但它们被视为小字节串,它们不在任何边界上对齐,因为它们的长度随指令和该指令的选项而变化。intel文档对此进行了说明,文档很容易通过联机或打印方式获得。因此,当我们将一个字的数据从内存传输到寄存器EAX时,该字最低地址的LSB将传输到EAX的低位8位。。简单地说,CPU的指令寄存器是否相似,因为它将指令传输到CPU中,并且指令寄存器的最高有效字节指的是传输到CPU中的指令的操作码?