Arm 检测Thumb-2指令和PC偏移位置

Arm 检测Thumb-2指令和PC偏移位置,arm,thumb,Arm,Thumb,我对ARM有点陌生,我试图理解指令是如何解释/执行的: 据我所知,ARM非常简单,因为每条指令占用4个字节,并且全部由4个字节对齐 Thumb-2的问题在于,它们的指令可能都是16/32位长。我读过这篇文章,为了确定当前指令的长度是否为16/32位,处理器读取一个字(32位)并在某些位上计算前半个字[15:11]。如果这些位是0b11101/0b11110/0b11111,则该半字是32位指令的第一个半字,否则它是16位指令(我不太明白为什么这些特定字节决定了这一点)。因此,一个例子应该是: 0

我对ARM有点陌生,我试图理解指令是如何解释/执行的:

据我所知,ARM非常简单,因为每条指令占用4个字节,并且全部由4个字节对齐

Thumb-2的问题在于,它们的指令可能都是16/32位长。我读过这篇文章,为了确定当前指令的长度是否为16/32位,处理器读取一个字(32位)并在某些位上计算前半个字[15:11]。如果这些位是0b11101/0b11110/0b11111,则该半字是32位指令的第一个半字,否则它是16位指令(我不太明白为什么这些特定字节决定了这一点)。因此,一个例子应该是:

0x4000 16-bit
0x4002 32-bit
0x4006 16-bit
0x4008 16-bit
0x400a 32-bit
然后处理器应该从0x4000抓取到0x4004,计算前半个字(0x4000到0x4002),如果指令是16位的,那么它只跳到下半个字并重复该过程,但是如果半个字指示32位地址,那么它跳过下半个字并执行该32位指令


另外,我对thumb-2中的PC指向何处感到困惑,是否还有两条指令

我们大多数人不知道/不知道它在逻辑中是如何实现的(而且有各种不同的核心,因此每个都可能不同)。但是以前未定义的指令变成了thumb-2扩展,在armv6-m中有几十个,然后在armv7-m中有150个

想象一下处理器获取16位指令,有时它会运行在可变长度的指令上。就像其他可变长度处理器一样,x86将查看一个字节的指令,然后基于此,它可能需要也可能不需要查看下一个字节,依此类推,直到它解析了整个指令。这里也是一样,它查看一个半字来确定它是否拥有它所需要的一切,如果没有,它会抓住下一个半字来获取其余的信息

0x4000 16-bit
0x4002 32-bit
0x4006 16-bit
0x4008 16-bit
0x400a 32-bit
处理器抓取0x4000,看到它有它需要的,就执行。处理器抓取0x4002,发现它需要另一个半字,抓取0x4004,执行。处理器抓取0x4006执行所需的操作。抓取0x4008具有所需的功能。抓取0x400A发现它需要另一个半字,抓取0x400C,执行

这些位模式以前是未定义的指令,现在它们是可变长度指令定义的一部分。就像以0b010000开头的指令是数据处理指令一样,要确定它是加法还是异或,必须查看其他位。这些位模式定义thumb-2扩展,然后这两个半字中的其他位定义完整指令

为什么要使用这些位模式?如果你愿意,你可以认为它是任意的,所有的指令集都有人(/组)坐下来决定什么位模式在哪里意味着什么,这里没有什么不同。指令集空间中有一定的模式空间,因此使用了这些模式。在处理器系列的后期添加指令并不少见,以x86为例。加上许多其他的,对于x86或6502之类的8位指令,您可以使用8位指令/操作码作为下一条新指令,或者将以前未使用的字节/操作码扩展为更多的字节/操作码,例如,您使用一个未使用的字节/操作码,该字节现在意味着查看下一个字节,下一个字节最多可以是256条新指令,或者它可以简单地补充第一个字节,指定寄存器或操作等。在这方面没有什么不同,arm扩展了thumb指令集,消耗了一定百分比的指令,表明这是一条变长指令,但是,在这32位中,仍然有相当多的位允许使用具有更多选项的更大指令。(但由于失去了thumb指令和arm指令之间的一对一关系,所有thumb指令(不是thumb-2扩展)都直接映射到一个完整大小的arm指令中)

每个内核都是不同的,它们不都一次提取一个字,thumb-2扩展不必对齐,因此对于进行字提取的处理器,整个thumb-2指令不一定适合对齐的字提取。将(预)取数器和解码器视为两个独立的东西,因为它们在功能上是,解码器在thumb模式下一次需要16位,它是如何具体实现的?不知道。他们会在解码第一个半字之前等待两个半字准备好吗?不知道。每个实现都一样吗?我不知道,我想不会。就抓取而言,它们与您在ARM文档中看到的不同,我认为芯片供应商在编译时至少可以选择一种(如果不是更多的话)

例如,如果您来自一本基于MIPS的教科书,并试图理解其他处理器,这可能会令人困惑,要理解这些教科书和术语是用于理解和词汇表的,管道一般没有那么深,一般来说,您不会一次获取完整的指令(x86不能一次提取一个字节,它一次提取多条指令)。risc-v的问题甚至比arm和mips更严重,因为您可以有16位压缩指令、32位指令和64位指令,32位指令不必在risc-v(或64位)上对齐因此,一次获取32条指令并不能得到完整的指令,一旦足够多的指令存在,取回器就会与解码器分离,然后解码器就可以完成

我想说thumb是两个超前的(独立于thumb2扩展或不独立于thumb2扩展),所以pc+4应该很容易理解

Disassembly of section .text:

00000000 <hello-0xe>:
   0:   e005        b.n e <hello>
   2:   bf00        nop
   4:   bf00        nop
   6:   f000 b802   b.w e <hello>
   a:   bf00        nop
   c:   bf00        nop

0000000e <hello>:
   e:   bf00        nop
节的反汇编。文本:
00000000 :
0:e005北东
2:bf00无
4:bf00无
6:f000 b802 b.w.e
a:bf00不
c:bf00无
0000000e:
e:bf00无
是的,所以在这两种情况下,前面都有两个拇指大小的半字(pc+4)。如果前面有两条指令,情况会复杂得多