.section .text.start
.section .text 前这段可以理解是代码段 .start是个什么鬼
.equ MODE_USR ,0x10
.equ MODE_FIQ ,0x11
.equ MODE_IRQ ,0x12
.equ MODE_SVC ,0x13
.equ MODE_MON ,0x16
.equ MODE_ABT ,0x17
.equ MODE_UNDEF ,0x1B
.equ MODE_SYS ,0x1F
.equ I_BIT ,0x80
.equ F_BIT ,0x40
.equ INT_BIT ,0xC0
arm CPU的7种模式
一、ARM体系的CPU有以下7种工作模式:
1、用户模式(usr):正常的程序执行状态
2、快速中断模式(fiq): 处理快速中断,支持高速数据传送或通道处理
3、中断模式(irq): 处理普通中断
4、管理模式(svc):操作系统使用的保护模式
5、系统模式(sys):运行具有特权的操作系统任务
6、数据访问终止模式(abt):数据或指令预取终止时进入该模式
7、未定义指令终止模式(und):未定义的指令执行时进入该模式
.globl _start
_start:
b resethandler
声明整个程序的入口地址
resethandler:
LDR r6, =bldr_args_addr
把bldr_args_addr这个地址存如寄存器r6
小知识
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。 比如想把数据从内存中某处读取到寄存器中,只能使用ldr 比如: ldr r0, 0x12345678 就是把0x12345678这个地址中的值存放到r0中。 而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。 x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。 另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如: ldr r0, =0x12345678 这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。 ldr伪指令和ldr指令不是一个同东西
resethandler:
LDR r6, =bldr_args_addr
STR r4, [r6]
MOV r0, #0
MOV r1, #0
MOV r2, #0
MOV r3, #0
MOV r4, #0
MOV r5, #0
MOV r6, #0
MOV r7, #0
MOV r8, #0
MOV r9, #0
MOV r10, #0
MOV r11, #0
MOV r12, #0
MOV sp, #0
MOV lr, #0
各个寄存器清0