实验代码

2020-04-15 05:20

例1:程序将数据从源数据区src复制到目标数据区dst复制时,以8个字为单位进行。对于最后所剩不足8个字的数据,以字为单位进行复制,这时程序跳转到copywords处执行。在进行以8个字为单位的数据复制时,保存了所用的8个工作寄存器。 在ADS编译环境下,程序如下: AREA NUM

B1ock,CODE,READONLY ;设置本段程序的名称及属性 EQU 20

;设置将要复制的字数 ;标识程序人口点

ENTRY

LDR R0,=src ;R0寄存器指向源数据区src LDR R1,=dst ;Rl寄存器指向目标数据区dst MOV MOV

R2,#NUM ;R2指定将要复制的宇数 SP,#&400

;设置数据栈指针,用于保存工作寄存器数值

Bcopy MOVS R3,R2,LSR #3 ;需要进行的以8个字为单位的复制次数 BEQ Cword ;不足8个字的数据,跳转到Cword以字为单位复制 STMFD SP!,{R4-R11} ;保存工作寄存器

Ocopy LDMIA R0!,{R4-R11} ;从源数据区读取8个字的数据,放到8个寄

;存器中,并更新目标数据区指针R0 ;目标数据区指针R1

STMIA R1!,{R4-R11} ;将这8个字数据写入到目标数据区中并更新

SUBS R3,R3,#1 ;将块复制次数减l

BNE Ocopy ;循环,直到完成以8个字为单位的块复制 LDMFD SP!,{R4-R11} ;恢复工作寄存器值 Cword Wcopy

ANDS R2,R2,#7 ;剩下不足8个字的数据的字数

Stop ;数据复制完成

R3,[R0],#4 ;读取剩下的数据放到R3 ,并更新目标数据区指针R0 ;并更新目标数据区指针R1

;循环,直到完成以字为单位的数据复制

R3,[R1],#4 ;将这R3中数据写入到目标数据区中 LDR

BEQ

STR

SUBS R2,R2,#1 ;将字数减l BNE Stop MOV LDR AREA

Wcopy

;程序结束处理

R0,#0x18 ;本条与下条指令的作用是参数传递 R1,=&20026

SWI 0x123456 ;将CPU的控制权交给调试器

Bdata,DATA,READWRITE ;定义数据区Bdata

src DCD 1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4 dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

;这里的DCD定义源数据区src及目标数据区dst

;结束汇编

END

编写程序循环对R4-R11进行累加8次起始值,R4-R11起始值分别为1~8,每次累加操作后把R4-R11的内容放入SP堆栈中,SP初始设置为0x40000000。最后把R4-R11用LDMFD指令清空赋值为0。 AREA Start

B1ock,CODE,READONLY ;设置本段程序的名称及属性

;标识程序人口点

ldr r0,=src ENTRY ldr r1,=reset mov sp,#0x40000000

ldmia r0!,{r4-r11} mov r2,#7 add r5,r5,#2 add r6,r6,#3 add r7,r7,#4 add r8,r8,#5 add r9,r9,#6 add r10,r10,#7 add r11,r11,#8 stmia sp!,{r4-r11} sub r2,r2,#1 cmp r2,#0 bne DoAdd ldmfd

r1!,{r4-r11}

stop

DoAdd add r4,r4,#1

stop

b

AREA Bdata,DATA,READWRITE ;定义数据区Bdata src DCD 1,2,3,4,5,6,7,8 reset DCD 0,0,0,0,0,0,0,0 end

3、用ARM汇编语言设计程序实现求20!(20的阶乘),并将其64位结果放在[R9:R8]中(R9中存放高32位)。

AREA Fctrl, CODE, READONLY ENTRY CODE32 STARY

MOV R8, #20 MOV R9, #0 SUB R0, R8, #1 LOOP

MOV R1, R9 UMULL R8, R9, R0,R8 MLA R9,R1,R0,R9 SUBS R0,R0, #1 BNE LOOP STOP

B STOP END

编写1+2+3+……+100的汇编程序: AREA Block, CODE, READONLY ENTRY

start

mov r0,#0; mov r1,#1 aga

add r0,r0,r1 add r1,r1,#1 cmp r1,#101 bne aga

MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 END

字符串拷贝子程序,将r1指向的字符串拷贝到r0指向的地方,字符串以0作结束标志 AREA SCopy, CODE, READONLY

EXPORT strcopy strcopy

; r0 points to destination string ; r1 points to source string

LDRB r2, [r1],#1 ; load byte and update address STRB r2, [r0],#1 ; store byte and update address; CMP r2, #0 ; check for zero terminator BNE strcopy ; keep going if not MOV pc,lr ; Return END

5、 存储器从0x400000开始的100个单元中存放着ASCII码,编写程序,将其所有的小写字母转换成大写字母,对其它的ASCII码不做变换。

4、 编写程序,比较存储器中0x400000和0x400004两无符号字数据的大小,并且将比较结果存于0x400008的字中,若两数相等其结果记为0,若前者大于后者其结果记为1,若前者小于后者其结果记为-1。

解:

MOV MOV LDRB

R0,#0x400000 R1,#0 R2,[R0,R1]

LP

CMP R2,#0x61 BLO NEXT CMP R2,#0x7B SUBLO

;0x7A为z

R2, R2,#0x20

STRBLO R2,[R0,R1] ADD R1, R1,#1 CMP R1,#100 BNE LP

NEXT

解: MOV

R0,#0x400000

;取第1个数

;两个数相比较

;R1大 ;R1小 ;两个数相等

LDR R1,[R0] CMP R1,R2 MOVHI

LDR R2,[R0,#4] ;取第2个数

R1,#1

MOVLO R1,# -1 MOVEQ R1,#0 STR

R1,[R0,#8]

求两个数的最大值,并将最大值放R0寄存器

AREA MAX,CODE,READONLY ENTRY MOV R1,#0x16 M0V R2,#0x17 CMP R1,R2 MOVMI R0,R2 MOVPL R0,R1

START

STOP

B STOP END

7、 编写一程序,存储器中从0x400200开始有一个64位数。(1)将取反,再存回原处;(2)求其补码,存放到0x400208处 。 解:

LDR R0,=0x400200 LDR R2,=0xFFFFFFFF LDR R1,[R0] EOR R1,R1,R2 STR ADDS STR

;取低32位数

;取反

;存低32位反码

;又加1为求补

R1,[R0] R1,R1,#1

R1,[R0,#8] ;存低32位补码

;取反 ;高32位求补

;存高32位补码

LDR R1,[R0,#4] ;取高32位数 EOR R1,R1,R2 STR STR

ADC R1,R1,#0

R1,[R0,#4] ;存高32位反码 R1,[R0,#12]

5、8421码是一种十进制数,它采用4个bit位表示一个十进制位,分别用0000~1001表示十进制的0~9。设计汇编程序将一个可以表示8位十进制的8421码数据转换成等价的整数形数据。

AREA Dec, CODE, READONLY ENTRY CODE32

LDR R0,=0x12345678 Dec2int

MOV R1, #0 MOV R2, #8 MOV R5,#10 Dec2int_l1

MUL R4, R1, R5 MOV R0, R0, ROR #28 AND R3, R0, #0Xf ADD R1, R4, R3 SUBS R2, R2, #1 BNE Dec2int_l1 STOP

B STOP END

有100个有符号的字数据,存放在内存BUFF中,编完整的程序(包括代码段、数据段)找出最大值、最小值分别放入内存单元MAX、MIN中。 AREA Block, CODE, READONLY ENTRY start

ldr r0,=BUFF; mov r1,#100 ldr r4,[r0];max ldr r5,[r0];min cmpe ldr r3,[r0] cmp r4,r3 bgt cmpnext; mov r4,r3;小于等于 cmpnext

cmp r5,r3 blt loop mov r5,r3; 小于 loop add r0,r0,#4 sub r1,r1,#1 cmp r1,#0 bne cmpe ldr r0,=MAX; str r4,[r0] ldr r0,=MIN; str r5,[r0]

MOV r0, #0x18 LDR r1, =0x20026 SWI 0x123456 AREA BlockData, DATA, READWRITE

BUFF DCD 1,-2,3,4,5,6,7,-8,1,2,3,4,5,6,7,8,1,2,3,12 MAX DCD 0 MIN DCD 0 END


实验代码.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于进一步加强公司接待费用管理的通知

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: