嵌入式开发 (2)
1、编绎执行下列汇编程序sy1.S,要在开发板上执行。程序执行后返回到调用处,使用uboot的md 0x20009000 1命令查看0x20009000处的值。理解程序如何返回的调用处的,程序调用要做哪些工作。如果省去最后mov pc,lr指令,则会出现什么结果,为什么?
.text.global _start_start:mov r0,#0x04mov r1,#0x03add r2,r0,r1Ldr r3,=0x20009000str r2,[r3]mov pc,lr.end
答案:
.text.global _start_startmov r0,#3mov r1,#4add r2,r0,r1ldr r0,=0x20009000str r2,[r0]mov pc,lr.end
2、将sy1程序下载到0x20007000处,编写汇编程序sy2.S,调用sy1,并能正确返回。
Tftp 20007000 sy1.binTftp 20008000 sy2.binGo 20008000
答案:
3、编写程序sy3.S,功能:开中断,禁止快速中断。
答案:
.text.global _start_start:mrs r0,cpsrorr r0,#0x40msr cpsr,r0mov pc,lr
4、编写程序sy4.S,读取内存地址为0x20008000处的值入r0,修改r0低8位为0x1f,其他位保持不变。并将r0的值存入内存单元0x20009000处。
.text.global _start_start:ldr r0,=0x20008000orr r0,#0x1fldr r1,=0x20009000str r0,[r1]mov pc,lr .end
5、Sy5.S使用循环计算1+2+…+100 并将结果存入0x20009000处(答案:0x13ba)
.text.global _start_start:mov r1,#1mov r0,#0for:cmp r1,#100bgt endforadd r0,r0,r1add r1,r1,#1b forendfor:ldr r2,=0x20009000str 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,#0mov R5,#1for2:cmp R5,#20bgt endfor2mov R0,R5bl addnadd R4,R4,R0add R5,R5,#1b for2endfor2:ldr R0,=0x20009000str R4,[R0]ldmfd sp!,{lr}mov pc,lraddn:mov R1,#0for:cmp R0,#1blt endforadd R1,R1,R0sub R0,R0,#1b forendfor:mov R0,R1mov pc,lr
7、Sy7.S使用循环计算1到100之间能被4整除的所有数的和,并将结果存入0x20009000处。(结果:0x514)
.text.global _start_start:mov r0,#1MOV r1,#0myloop:cmp r0,#100bgt exittst r0,#0X3addeq r1,r1,r0add r0,r0,#1b myloopexit:ldr r0,=0x20009000str 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,=0x20008000ldmfd r0! ,{r0,r1-r4,r5}ldr r0,=0x20009000stmea r0!, {r0,r1-r4,r5}ldmfd sp!,{r0,r1-r4,r5}mov pc,lr.end