@ 状态寄存器传送指令 .text .global _start _start: @ 状态寄存器指令 @ 读CPSR到R1 MSR R1,CPSR @写到CPSR MSR CPSR, #0x10 STOP: B STOP .end
ARM的异常向量表默认在以0x00为起始地址的32字节内存空间。
每个偏移地址存储的是一个中断产生后执行的指令,如软中断产生执行的指令位于0x00+0x08。
@ 软中断指令 .text .global _start _start: @ 4x8=32字节的异常向量表 B MAIN B . B SWI_HANDLER @ SWI中断指令写为跳转到SWI_HANDLER B . B . B . B . B . MAIN: @ 复位和软中断都是SVC模式 @ 所以用的是同一个栈顶指针寄存器SP_<SVC mode> MOV SP,#0x40000020 @ 初始化SVC模式的栈顶指针 MSR CPSR, #0x10 @ 切换为User模式 @ 在这里操作的是User的栈顶指针SP_<User mode> @ 在这里初始化栈顶指针在软中断中没用 @ MOV SP,#0x40000020 MOV R1,#1 MOV R2,#2 @ 软中断指令 SWI #1 ADD R3,R1,R2 B STOP SWI_HANDLER: STMFD SP!,{R1,R2,LR} @ 压栈,保护现场 MOV R1,#5 MOV R2,#6 LDMFD SP!,{R1,R2,PC}^ @出栈(出栈写入的第三个寄存器为PC,可以直接跳转) @^执行切换user模式 STOP: B STOP .end
协处理器指令是指ARM本身不处理的指令,但是会交给ARM支持的协处理器执行的指令。
如MMU, CP15是两种协处理器。
...
ARM伪指令本质上不是指令,不会对应一条能被CPU直接执行的机器码,但是能被编译器转换成若干条指令。
@ 伪指令 .text .global _start _start: NOP @ 空指令,它是一条伪指令,实际上被编译成 MOV R0,R0 @LDR @ 它根据格式不同,可以是指令,也可以是伪指令 LDR R1,[R2] @ 这是一条指令 @ LDR伪指令格式 LDR R1, =0x12345678 @ 这一条伪指令,可以将任意一个32位的数据放到寄存器中 @ 实际上被编译成LDR R1,[PC] 和 0x12345678 LDR R1,=STOP @ 将STOP的地址写入R1寄存器 LDR R1,STOP @ 将STOP地址中的内容写入R1寄存器 STOP: B STOP .end
END