aaaaaaaaaaaa
代码改变世界

arm指令

2018-02-05 16:37  二进制乐谱  阅读(1006)  评论(0编辑  收藏  举报
BL 和 BLX 指令可将下一个指令的地址复制到 lr(r14,链接寄存器)中。

BX 和 BLX 指令可将处理器的状态从 ARM 更改为 Thumb,或从 Thumb 更改为 ARM。

BLX label 无论何种情况,始终会更改处理器的状态。

BX Rm 和 BLX Rm 可从 Rm 的位 [0] 推算出目标状态:

如果 Rm 的位 [0] 为 0,则处理器的状态会更改为(或保持在)ARM 状态

如果 Rm 的位 [0] 为 1,则处理器的状态会更改为(或保持在)Thumb 状态。

adr指令:
10: _start 
0x0000000C           E1A00000           NOP 
11:           nop
ldr           r0, _start //从内存地址 _start 的地方把值读入。执行这个后,r0 = 0xe1a00000
adr         r0, _start   //adr r0, _start 得到 r0 = 0x00000010 这里和具体运行位置无关

 

LDR/STR:

ldr内存到寄存器,str寄存器到内存,刚好相反

LDR     R1,=0xE0000000  ;R1=0xE0000000
LDR     R1,0xE0000000   ;将内存中地址为0xE0000000的内容载入到R1
LDR     R1,[R0]         ;将R0中的数所指定的地址的内容传输到R1

STR R1,[R0]

 beq:

.text:00001070 00 29                       CMP             R1, #0  ; Alternative name is '__aeabi_idiv'
.text:00001072 56 D0                       BEQ             loc_1122 

 

bx lr

arm中lr中保存的是返回地址,与x86的好像是不同的

 

指令后带.w说明是32位

 

ADD R3,R2,R1,LSL#3; R3ßR2+8*R1

其中LSL #3 为左移三位

移位指令:

        LSL:逻辑左移

        LSR:逻辑右移

        ASR:算术右移

        ROR:循环右移

        RRX:扩展为1的循环右移

//表示r0右移31位与r0相加放入r0
ADD
.W R0, R0, R0,LSR#31

 

aaaaaaaaaaaaa