@属性结构:[写寄存器则,前面加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
海思lowlevel_init.S简单分析
最新推荐文章于 2023-02-25 14:43:21 发布