能力值:
( LV5,RANK:70 )
|
-
-
2 楼
arm 三级流水线
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我记得也不是很清楚,所以如果有错请指正。首先,ARM指令又是32位的,而上面的.text的数字则是十六进制,2表示32位,所以是2。ARM的三级流水线说的很清楚,但是请注意,单位是不一样的。4表示的是地址,而8则是从字节上加上去。至于为什么突然将指令32位,我觉得是0x29c没法用16位表示了把。
|
能力值:
( LV1,RANK:0 )
|
-
-
4 楼
因为arm的汇编指令是按照这个汇编段的字节位数去占的,就像一个小于255赋值的 mov r1,#0x1,这是占两个字节也就是16个二进制位,arm汇编通常占用2字节和4字节的汇编代码,也就是16和32为二进制位,而为什么ldr要变成ldr.w呢,因为ldr本身是2字节,在使用过程中会因为位置,所带入的寄存器数量,参数大小而不够用,加上w变成ldr.w可以变成32位就是4字节提高这个ldr指令的可行性就像图中的ldrw r3,[sp,#0x18+var_10]意思是从sp寄存器{也就是r13堆栈指针}加上个函数开辟的var10空间数据和0x18的偏移位获取的32为4字节数据存储到r3寄存器,很显然,这个提取内容的完成能力ldr的二字节位置根本不够用,所以要用ldrw四字节来写,但是ldr和ldrw本身功能一样,只不过ldrw增加了ldr指令的使用范围 关于pc寄存器是这样 当处理器处于ARM状态时,每条ARM指令为4个字节,所以PC寄存器的值为当前指令地址 + 8字节 当处理器处于Thumb状态时,每条Thumb指令为2字节,所以PC寄存器的值为当前指令地址 + 4字节
|
|
|