您的位置:首页 > 其它

海思lowlevel_init.S简单分析

2016-04-08 00:46 253 查看
@属性结构:[写寄存器则,前面加8个0]0b0xxxx0000xxxx101[读寄存器则,后面补8个0]
.text
.align	2
.global	init_registers
.type	init_registers, %function
init_registers:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
ldr	r2, [r0, #0]
cmp	r2, #0
mov	r6, #1
bne	.L43 @寄存器地址不为0,则跳转到 .L43
.L2:
ldr	r3, [r0, #4]
cmp	r3, #0
bne	.L43
ldr	r3, [r0, #8]
cmp	r3, #0
ldrne	ip, [r0, #12]
bne	.L3
ldr	ip, [r0, #12]
cmp	ip, #0
beq	.L6 @所有值(4个)均为0时,退出函数,否则(至少有一个不为0)则跳到.L3
.L3:
cmp	r1, #0
beq	.L7 @绝对跳转到 .L7
.L45:
tst	ip, #2
beq	.L8
and	r4, ip, #248
mov	r4, r4, lsr #3
add	r4, r4, #1
cmp	r4, #32
movne	r4, r6, asl r4
andne	ip, ip, #63488
ldr	r5, [r2, #0]
movne	ip, ip, lsr #11
subne	r4, r4, #1
bicne	r5, r5, r4, asl ip
ldrne	r4, [r0, #4]
ldreq	ip, [r0, #4]
orrne	ip, r5, r4, asl ip
cmp	r3, #0
str	ip, [r2, #0]
beq	.L11
.L29:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L29
.L11:
add	r0, r0, #16 @下一个“块”,4个字    “一个轮回的开始”
.L46:
ldr	r2, [r0, #0]
cmp	r2, #0
beq	.L2 @寄存器地址为0,跳转到.L2继续检查,其余3个变量是否为0
@否则,循环之前的操作
.L43:
cmp	r1, #0 @r1恒为0
ldr	r3, [r0, #8] @ r3为delay值
ldr	ip, [r0, #12] @ ip为Attr值
bne	.L45 @不会执行

@4个数值有一个有值都会到这里来处理
@ r2位寄存器地址
.L7:
tst	ip, #4 @对寄存器进行写操作,同时执行需要正常启动时该位是1,其余情况为0,因为前3位是指代excel里面的Y和N这两项,即执行时需要的条件
beq	.L18 @如果此位为0,查下是否为对寄存器进行读操作
@以下是写操作做的工作(若不为31位操作,对,start-1号位置开始置(bits+1)个1)
and	r4, ip, #248 @ r4 = ip&0xF8;提取属性参数里关于“bit to be writed or readed”或者“start bit to be writed or readed”这两项参数
mov	r4, r4, lsr #3 @逻辑右移,即,提取“bit to be writed or readed”
add	r4, r4, #1
cmp	r4, #32 @要写的位是否为31个
movne	r4, r6, asl r4 @r6 一直为1,若不是31位时,r4 = 1<<(1+bits);
andne	ip, ip, #63488 @0xF800
ldr	r5, [r2, #0] @r5为此时寄存器的值
movne	ip, ip, lsr #11 @若不是31位时,通过右移提取到“start bit to be writed or readed”值
subne	r4, r4, #1 @此时r4二进制包含(1+bits)个“1”
bicne	r5, r5, r4, asl ip @若不是31位时,从“start”处开始清零(1+bits)个位,!!!!!!!感觉这句多此一举
ldrne	r4, [r0, #4] @若不是31位时,r4为需要写入的值
ldreq	ip, [r0, #4] @要写31位时,将需要写入的值,写到ip中,(譬如excel表中的C7区域的值)
orrne	ip, r5, r4, asl ip @若不是31位时,从“start”处开始置一(1+bits)个位
cmp	r3, #0
@***************************修改寄存器的值***********************************
str	ip, [r2, #0]
beq	.L11 @不延时,直接指向下一块,继续运行
@若只修改某几位的话就先延时,再指向下一块

@。。。。。。。。。。。。。延时函数。。。。。。。。。。。。
.L32:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L32
@。。。。。。。。。。。。。延时函数。。。。。。。。。。。。

add	r0, r0, #16
b	.L46
.L8:
tst	ip, #131072
bne	.L13
cmp	r3, #0
beq	.L11
.L31:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L31
add	r0, r0, #16
b	.L46
.L18:
tst	ip, #262144 @ip & 0x40000
bne	.L22 @此位为1,代表对寄存器进行读操作,且执行需要正常启动

否则,此位为0代表,对寄存器写,同时,执行不需要正常启动,,以下代码是,直接将指针指到下一块,对后续的寄存器进行操作
cmp	r3, #0
beq	.L11

@。。。。。。。。。。。延时函数。。。。。。。。。。。。。
.L34:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L34
@。。。。。。。。。。。延时函数。。。。。。。。。。。。。

add	r0, r0, #16 @延时后再将指针指到下一块,跳转到.L46
b	.L46
.L13:
and	r4, ip, #16252928
mov	r4, r4, lsr #19
add	r4, r4, #1
mov	r7, r6, asl r4
ldr	r5, [r0, #4]
mov	r8, ip, lsr #27
sub	r7, r7, #1
.L16:
ldr	ip, [r2, #0]
cmp	r4, #32
andne	ip, r7, ip, lsr r8
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
cmp	r5, ip
bne	.L16
cmp	r3, #0
beq	.L11
.L30:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L30
add	r0, r0, #16
b	.L46

@读操作所做的工作
.L22:
and	r4, ip, #16252928
mov	r4, r4, lsr #19
add	r4, r4, #1
mov	r8, r6, asl r4
ldr	r5, [r0, #4]
sub	r8, r8, #1
mov	r7, ip, lsr #27
.L25:
ldr	ip, [r2, #0]
cmp	r4, #32
andne	ip, r8, ip, lsr r7
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
cmp	r5, ip
bne	.L25

@延时为0,则直接下一块的操作
cmp	r3, #0
beq	.L11

@。。。。。。。延时函数。。。。。。。。。。
.L33:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
subs	r3, r3, #1
bne	.L33
@。。。。。。。延时函数。。。。。。。。。。

add	r0, r0, #16
b	.L46 @延时后再指向下一块单元,操作

@.L6是退出函数
.L6:
@ 38 "lowlevel_init.c" 1
nop
@ 0 "" 2
bx	lr
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: