基于ARM Cortex-M3微控制器(STM32系列)基础知识(四)——ARM汇编语言程序设计

Thumb伪指令

在这里插入图片描述

LDR (大范围的地址读取伪指令)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

ARM汇编程序结构

AREA:用于定义一个代码段或数据段伪操作。

CODE16:用于告诉汇编器后面的指令序列为16位的Thumb指令。

ARM或CODE32:用于告诉汇编器后面的指令序列为32位的ARM指令。

GBLA伪操作用于定义一个全局的数字变量并初始化为0。
在这里插入图片描述
在汇编语言程序中,用AREA伪操作定义一个段,并说明所定义段的相关属性,本例定义一个名为Init的代码段属性为只读。ENTRY伪操作标识程序的入口点,接下来为指令序列,程序的末尾为END伪指令,该伪操作告诉编译器源文件的结束,每一个汇编程序段都必须有一条END伪操作,指示代码段的结束。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意

在这里插入图片描述
在这里插入图片描述

例题

在这里插入图片描述

1. AREA(段定义伪指令)

在这里插入图片描述

例题

在这里插入图片描述

2. CODE16、CODE32

在这里插入图片描述

3. ENTRY(程序入口指示伪指令)

在这里插入图片描述

4. END(程序结束伪指令)

在这里插入图片描述

5. EQU(等价伪指令)

在这里插入图片描述

6. EXPORT(全局标号声明伪指令)

EXPORT伪操作用于在程序中声明一个全局的标号,该标号可在其他的文件中引用。EXPORT可用GLOBAL代替。标号在程序中区分大小写。
在这里插入图片描述

7. IMPORT(标号引用并加入声明伪指令)

在这里插入图片描述

8. 数据定义伪操作(DCB、DCD、DCW)

在这里插入图片描述
在这里插入图片描述

汇编语言程序设计

在这里插入图片描述

编制一个汇编语言程序的步骤如下:

在这里插入图片描述

例题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

C程序实现5个整数求和

在这里插入图片描述
在这里插入图片描述

数据块复制应用举例

在这里插入图片描述

 AREA reset,CODE,READONLY
num    EQU  20                         ;设置复制的字数
       ENTRY                           ;程序入口
start  LDR  r0,=src                    ;r0指向源数据块首地址
       LDR  r1,=dst                    ;r1指向目标数据块首地址
       MOV  r2,#num                    ;r2复制的字数
       MOV  sp,#0x400                  ;设置堆栈指针,用于保存工作寄存器数值
blockcopy
       MOVS r3,r2,LSR #3               ;需要进行的以8个字为单位的数据复制
       BEQ  copywords                  ;对剩余不足8个字数据,跳转到copywords
                                       ;以字为单位复制
       STMFD sp!,{
    
    r4-r11}              ;保存工作寄存器
octcopy
       LDMIA r0!,{
    
    r4-r11}               ;从数据源取出8个字数据放到寄存器,并更新R0
       STMIA r1!,{
    
    r4-r11}               ;将数据写入目的地址,并更新R1
       SUBS  r3,r3,#1                  ;将块复制次数减1
       BNE   octcopy                   ;循环直到完成以8个字为单位的复制

        LDMFD sp!,{
    
    r4-r11}              ;恢复工作寄存器
copywords
       ANDS r2,r2,#7                   ;剩余不足8个字的数据的字数
       BEQ  stop                       ;数据复制完成则跳转到stop  
wordcopy
       LDR  r3,[r0],#4                 ;从数据源取出一个字数据到R3,并更新R0
       STR  r3,[r1],#4                 ;将字数据存储到目标地址,并更新R1
       SUBS r2,r2,#1                   ;字复制次数减1
       BNE  wordcopy                   ;循环,直到字复制完毕
                                       ;定义数据区SRC和DST
stop 
       b stop                                      
       AREA reset,DATA,READWRITE
src    DCD 1,2,3,4,5,6,7,8,8,7,6,5,4,3,2,1
       dcb "abcd1234efgh5678"
dst    DCD 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
       END

在这里插入图片描述

如果喜欢我的文章,请记得三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持,下期更精彩!!!

猜你喜欢

转载自blog.csdn.net/qq_44631615/article/details/118693259