android init.s分析

.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

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值