1 ldr伪指令有两种用途。
(1)当需要读取到寄存器中的数据超过了MOV,及MVN指令可以操作的范围时,可以使用LDR伪指令将该数据读取到寄存器中。
(2)还未用到。
2 ldr r0,=0x5300000 (把0x5300000下载到r0中)
mov r1,#0
str r1,[r0] (把r1的数据下载到r0中的地址对应的空间,这就是[]的作用)
3
@ 手动设置CPU模式为irq模式
mrs r0,cpsr
bic r0,r0,#0x1F
(清0,先将0x1f取反,低5位变为00000,然后与r0 与运算放到r0中。)
orr r0,r0,#0x12
(清0,先将0x1f取反低5位变为00000, 然后与r0 或运算放到r0中。)
msr cpsr_c,r0 (cpsr中的低8位,,)
涉及到cpsr,spsr,时都用mrs(读状态),msr(写状态)
4 伪指令本身也是指令,只是这条指令能识别不会直接翻译,会把他翻译成其他的机器代码。伪指令为了一些一条指令无法完成的指令。
5 .global _start 伪操作,不会翻译成机器指令,使程序可读性强,类似于C语言中的#号。规GUN ARM汇编器识别。
6 不同的汇编器对汇编语言的语法要求有所不同,目前常用的ARM汇编环境有一下两种。
ARM 汇编 (armasm ARM公司,绝大果树的windows下的开发者都在使用这一环境,他的语法完全按照ARM的规定)
GUN ARM汇编(GUN 计划) GUN交叉编译工具链中的汇编器,所采用的语法与armasm略有不同,LINUX下的开发者一般用这种环境)
7 .global _start
@ 扩展niuniu这个函数的作用域(扩展 出去)
.extern niuniu
(扩展进来)
.extern doirq
8 @ 代码段的结束
.end
9 b 20 的计算方式
0: ea000006 b 20 <reset>
16进制的6加两个0,变为6,变为10进制,
10 _start:
(程序的真正开始)
@ 0地址处存储(sram)的机器代码
@ 相当于C语言中的goto reset
b reset
nop
nop
nop
nop
nop
b irqhandle
nop
11 ldr sp,=0x1000;(这两个sp不同,因为不同的用户空间的sp独立的寄存器, 最大4K,所以0x1000)
ldr sp,0xf00;
12 @ cpu默认是关闭irq中断的,打开irq中断
mrs r0,cpsr
bic r0,r0,#0xC0
(清他的7和6位使中断irq,fiq使能)
msr cpsr_c,r0
13 汇编语言的16进制表示,英文表示。
31 30 29 28 27 26 25 24 23 ....0
头4位的a 1010表示无条件执行。24 L位,1表示返回,0表示不返回。
14 -32M +32M 2的26次方=64M;
15 正数的补码仍然是正数。负数的补码取反加1
16 流水线,3级取指令,译码,执行。
17 PC存的是正在预取得指令。
18 复位以后自动到了特权模式。
19 reset:
@ cpu默认打开看门狗,关闭看门狗
ldr r0,=0x53000000
mov r1,#0
str r1,[r0]
reset对应的地址总线,是下一条指令的地址总线的地址。
20 字32位,半字,16位。
21 b地址跳转
60: ea00005c b 1d8
5c->92,0x60+8->104,
92*4+104=472->0x1d8;