当前位置 博文首页 > 缘分锝天空的博客:块数据传输程序:将由src单元开始的20个字,
? ? ? ?利用汇编语言编程实现具有如下功能的程序:将由src单元开始的20个字,转存到由dst开始的单元中。要求:当传输的数据大于8时,采用多数据传输指令一次传递8个数据;对于不足8个单元的数据数据采用单字节传送指令进行传输。
参考程序:
AREA Block, CODE, READONLY ; 命名这个代码块
num EQU 20 ; 设置要复制的字数
ENTRY ; 标记要调用的第一条指令
start
LDR r0, =src ; r0 = 源数据块地址
LDR r1, =dst ; r1 = 目的数据库块地址
MOV r2, #num ; r2 = 要复制的字的数量
MOV sp, #0x400 ; 设置栈指针
blockcopy ;以32个字节(8个字)为单位进行拷贝
MOVS r3,r2, LSR #3 ;执行r3=r2/8=2(num=20)
;MOVS总是会影响CPSR, 包括N,Z,C标志位,执行MOVS pc, lr时,CPSR会被SPSR覆盖(内核态,USER和SYSTEM模式下没有SPSR)
BEQ copywords ;少于8个字则跳转到copywords处理
STMFD sp!, {r4-r11} ; 连续压栈,保存r4,r5...r11的数据
octcopy
LDMIA r0!, {r4-r11} ;从源地址取出8个字数据分别存放到r4,r5,...,r11中
STMIA r1!, {r4-r11} ;将r4,r5,...,r11中的数据设置到目的数据块地
SUBS r3, r3, #1 ;计数器减一
BNE octcopy ;当CPSR的Z标识位为0时,程序跳转到octcopy,即重复拷贝
LDMFD sp!, {r4-r11} ;相当于恢复寄存器
;start_address = SP
;end_address = SP + 7 * 4
;把堆栈从start_address开始,到end_address内的值恢复到寄存器r4,r5...r11中,并修改SP的值(SP变大),相当于出栈。
copywords ;字拷贝:以4个字节(1个字)为单位进行拷贝
ANDS r2, r2, #7 ;最多拷贝7个,多于8个先使用blockcopy,然后用copywords
BEQ stop ; 判断是否拷贝完毕,完毕了就跳转到Stop
wordcopy
LDR r3, [r0], #4 ;从源地址取出一个字数据放到r3中
STR r3, [r1], #4 ;将r3中的数据设置到目的数据地址
SUBS r2, r2, #1 ;计数器减一
BNE wordcopy ;重复拷贝
stop
MOV r0, #0x18 ;调用软中断 返回操作系统
LDR r1, =0x20026 ;将r1的值设置成ADP_Stopped_ApplicationExit,该宏表示程序正常退出
SWI 0x123456 ;结束程序,将CPU的控制权交回调试器手中
AREA BlockData, DATA, READWRITE ;定义源地址数据以及目标地址
src DCD 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
dst DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
END
cs?以上是个人对程序的理解,发现不对欢迎指正哦!!!
创作不易,三连支持一下哈!!!