当前位置 博文首页 > 缘分锝天空的博客:块数据传输程序:将由src单元开始的20个字,

    缘分锝天空的博客:块数据传输程序:将由src单元开始的20个字,

    作者:[db:作者] 时间:2021-07-21 09:48

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