1、编绎执行下列汇编程序sy1.S,要在开发板上执行。程序执行后返回到调用处,使用uboot的md 0x20009000 1命令查看0x20009000处的值。理解程序如何返回的调用处的,程序调用要做哪些工作。如果省去最后mov pc,lr指令,则会出现什么结果,为什么?
.text
.global _start
_start:
mov r0,#0x04
mov r1,#0x03
add r2,r0,r1
Ldr r3,=0x20009000
str r2,[r3]
mov pc,lr
.end
答案:
.text
.global _start
_start
mov r0,#3
mov r1,#4
add r2,r0,r1
ldr r0,=0x20009000
str r2,[r0]
mov pc,lr
.end
2、将sy1程序下载到0x20007000处,编写汇编程序sy2.S,调用sy1,并能正确返回。
Tftp 20007000 sy1.bin
Tftp 20008000 sy2.bin
Go 20008000
答案:
3、编写程序sy3.S,功能:开中断,禁止快速中断。
答案:
.text
.global _start
_start:
mrs r0,cpsr
orr r0,#0x40
msr cpsr,r0
mov pc,lr
4、编写程序sy4.S,读取内存地址为0x20008000处的值入r0,修改r0低8位为0x1f,其他位保持不变。并将r0的值存入内存单元0x20009000处。
.text
.global _start
_start:
ldr r0,=0x20008000
orr r0,#0x1f
ldr r1,=0x20009000
str r0,[r1]
mov pc,lr
.end
5、Sy5.S使用循环计算1+2+…+100 并将结果存入0x20009000处(答案:0x13ba)
.text
.global _start
_start:
mov r1,#1
mov r0,#0
for:
cmp r1,#100
bgt endfor
add r0,r0,r1
add r1,r1,#1
b for
endfor:
ldr r2,=0x20009000
str r0,[r2]
mov pc,lr
.end
6、编写程序sy6.S计算 1+(1+2)+(1+2+3)+….+(1+2+…+20),并将结果存入0x20009000处,要编写子程序addn 计算1+2+…n,主程序调用该子程序最终完成计算( 结果: 0x604 )。
.text
.global _start
_start:
stmfd sp!,{
lr}
mov R4,#0
mov R5,#1
for2:
cmp R5,#20
bgt endfor2
mov R0,R5
bl addn
add R4,R4,R0
add R5,R5,#1
b for2
endfor2:
ldr R0,=0x20009000
str R4,[R0]
ldmfd sp!,{
lr}
mov pc,lr
addn:
mov R1,#0
for:
cmp R0,#1
blt endfor
add R1,R1,R0
sub R0,R0,#1
b for
endfor:
mov R0,R1
mov pc,lr
7、Sy7.S使用循环计算1到100之间能被4整除的所有数的和,并将结果存入0x20009000处。(结果:0x514)
.text
.global _start
_start:
mov r0,#1
MOV r1,#0
myloop:
cmp r0,#100
bgt exit
tst r0,#0X3
addeq r1,r1,r0
add r0,r0,#1
b myloop
exit:
ldr r0,=0x20009000
str r1,[r0]
mov pc,lr
8、编写程序sy8.S, 将内存0x20008000开始的5个数据(每个数据4个字节)复制到内存0x20009000这个位置。(要求使用ldm,stm指令)
.text
.global _start
_start:
stmfd sp!,{
r0,r1-r4,r5}
ldr r0,=0x20008000
ldmfd r0! ,{
r0,r1-r4,r5}
ldr r0,=0x20009000
stmea r0!, {
r0,r1-r4,r5}
ldmfd sp!,{
r0,r1-r4,r5}
mov pc,lr
.end