实验目的
通过实验掌握使用LDB/STB,b等指令完成较为复杂的存储区访问和程序分支,学会使用条件码。
实验环境
硬件:PC 机
软件:ADS1.2 集成开发环境
实验内容
熟悉开发环境的使用并完成一块存储区的拷贝。
完成分支程序设计,要求判断参数,根据不同参数,调用不同的子程序。
实验要求
(1)按照2.3节介绍的方法,在ADS下创建一个工程asmlab2,定义两个数据存储区Src和Dst,Src用于存放原字符串,Dst用于存放目的字符串。堆栈地址0x400,将变量原字符串的内容拷贝到目的字符串中,要能判断原字符串的结束符(0),并统计字符串的个数。通过AXD查看寄存器和memory和寄存器中数据的变化。
(2)在指令后面加上适当注释,说明指令功能。
(3)指出程序执行完后各相关寄存器及存储器单元的具体内容。
实验代码:
AREA Init,CODE,READONLY
ENTRY
CODE32
start
MOV SP, #0x400 ;设置堆栈地址(这个好像没用到)
LDR R0, =Src ;将原字符串地址给R0
LDR R1, =Dst ;将目的字符串地址给R1
MOV R3,#0 ;R3赋值为0
strcopy
LDRB R2,[R0],#1 ;存储器地址为R0的字节内容读入寄存器R2,并把新地址R0+1的值存入R0
CMP R2,#0 ;比较R2和0,检测字符串是否结束
BEQ endcopy ;等于0则跳转至endcopy
STRB R2,[R1],#1 ;将R2中的字节数据写入以R1为地址的存储器中,并把新地址R1+1的值存入R1
ADD R3,R3,#1 ;R3自加一,记录字符个数
B strcopy ;循环
endcopy
LDR R0, =ByteNum ;把字符数的地址给R0
STR R3,[R0] ;把R3的值放到R0中
B .
AREA Datapool,DATA,READWRITE
Src DCB "string",0 ;初始字符串存储空间
Dst DCB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ;目的字符串存储空间
ByteNum DCD 0
END
练习题
编写程序循环对R4~R11 进行累加8 次赋值,R4~R11 起始值为1~8,每次加操作后把 R4~R11 的内容放入SP 栈中,SP 初始设置为0x800。最后把R4~R11清空赋值为0。
提示:多字的加载与存储使用多寄存器寻址,使用的指令为LDM和STM。如:
LDMIA R0!, {R4-R11}
STMIA R1!, {R4-R11}
实验代码:
AREA Init,CODE,READONLY
ENTRY
CODE32
main NOP
NUM EQU 8
start
MOV SP,#0X800
LDR R0,=src ;把src的地址赋给R0
MOV R2,#NUM ;把循环次数赋给R2
MOV R4,#1
MOV R5,#2
MOV R6,#3
MOV R7,#4
MOV R8,#5
MOV R9,#6
MOV R10,#7
MOV R11,#8 ;给寄存器赋初值
loop
ADD R4,R4,#1
ADD R5,R5,#1
ADD R6,R6,#1
ADD R7,R7,#1
ADD R8,R8,#1
ADD R9,R9,#1
ADD R10,R10,#1
ADD R11,R11,#1 ;循环累加,每个寄存器值加一
STMFD SP!,{R4-R11} ;多寄存器寻址,把R4~R11的内容放入SP栈中
SUBS R2,R2,#1 ;R2中的循环次数减一
BNE loop ;不为0则跳转到loop继续循环
LDMIA R0!,{R4-R11} ;将以R0起始地址的值存入R4-R11,即把R4~R11清空赋值为0. IA模式表示:每次传送后地址+4(After Increase)
Stop
B Stop
LTORG ;声明数据缓冲池
src DCD 0,0,0,0,0,0,0,0
END
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
- 最新
- 最热
只看作者