块数据传输程序:将由src单元开始的20个字,转存到由dst开始的单元中(带详细注释)

       利用汇编语言编程实现具有如下功能的程序:将由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

 以上是个人对程序的理解,发现不对欢迎指正哦!!!

创作不易,三连支持一下哈!!!

  • 12
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员-小李

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值