嵌入式汇编实验二
环境:ADS
软件:Metrowerks CodeWarrior for ARM Developer Suite v1.2
一、复制数据
要求:用汇编语言编程实现:将存储器中起始地址M1处的4个字数据复制到地址M2处。
AREA SCopy,CODE,READONLY
M1 DCD 0x0001,0x0002,0x0003,0x0004
M2 DCD 0x0000,0x0000,0x0000,0x0000
ENTRY
CODE32
START
LDR R0,=M1 ;M1的地址
LDR R1,=M2 ;M2的地址
LDMIA R0!,{R4-R7}
STMIA R1!,{R4-R7}
END
二、累加
要求:用汇编语言编程实现:100+101+102+…+200,其和存于R0。
AREA Test,CODE,READONLY
ENTRY
CODE32
START
MOV R0,#0
MOV R1,#100
LOOP
ADD R0,R0,R1
ADD R1,R1,#1
CMP R1,#201
BNE LOOP
END
三、寻找最小值
要求:用汇编语言编程实现:从存储器中起始地址M1处的20个字节数据中,找出一个最小数存放在R0中。
AREA TEST2,DATA,READWRITE
M1 DCB 0x20,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11
DCB 0x10,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01
AREA TEST1,CODE,READONLY
ENTRY
CODE32
START
LDR R1,=M1
LDRB R0,[R1],#1 ;存放最小值
MOV R3,#1 ;次数
FIND
LDRB R2,[R1],#1
CMP R0,R2
MOVHS R0,R2
ADD R3,R3,#1
CMP R3,#20
BNE FIND
END
四、跳转表
要求:利用跳转表的思想编写一个汇编子程序,根据键入的值(存放在R0中)不同来完成不同的子程序跳转(假设有四个子程序SUB0、SUB1、SUB2、SUB3)。
AREA Test,CODE,READONLY
ENTRY
CODE32
START
MOV R0,#1
BL JUMPTAB
B Stop
JUMPTAB
ADR R1,SUBTAB
LDR PC,[R1,R0,LSL #2] ;R0 * 4 + R1 -> PC
SUBTAB
DCD SUB0
DCD SUB1
DCD SUB2
DCD SUB3
SUB0
;要执行的代码
MOV PC,LR
SUB1
MOV R3,#1
MOV PC,LR
SUB2
;要执行的代码
MOV PC,LR
SUB3
;要执行的代码
MOV PC,LR
Stop
MOV R0,#0x18
LDR R1,= &20026
SWI 0x123456
END
说明:
SUBTAB下面的四个DCD:分配4个连续字地址,假如是0x00008014、0x00008018、0x0000801C、0x00008020,这四个地址中存放的值就是各个SUB段的地址,例如上面的代码,SUB0,SUB2,SUB3只有一行代码,SUB1有两行代码,那么SUB[i] 对应的地址为:
[0x00008014] -> 0x00008024 ; SUB0的地址
[0x00008018] -> 0x00008028 ; SUB1的地址
[0x0000801C] -> 0x00008030 ; SUB2的地址
[0x00008020] -> 0x00008034 ; SUB3的地址SUB1有两行代码,所以SUB2的地址需要 +8
所以这条指令 LDR PC,[R1,R0,LSL #2] 相当于 取SUB[i] 的地址赋值给PC,实现了跳转