8.1 汇编程序格式

  • 源程序中的语句可以分为两种类型:指令性语句、指示性语句
  • 指示性语句就是一些伪操作,在 MDK 编译环境下的伪操作有下面几种:
    • 符号定义伪操作
    • 数据定义伪操作
    • 汇编控制伪操作
    • 其他伪操作

8.1.1 符号定义伪操作

  • 符号定义伪操作用于定义 ARM 汇编程序中的 “变量”,此变量不会在内存上分配空间,只是用来辅助编译器工作,帮助我们用于循环控制、逻辑运算和条件判断等等操作

    • 用于定义全局变量的 GBLA、GBLL 和 GBLS
    • 用于定义局部变量的 LCLA、LCLL 和 LCLS
    • 用于对变量赋值的 SETA、SETL、SETS
    • 为一个通用寄存器列表定义别名:RLIST(List    RLIST {R0-R3})
    • 为一个协处理器的寄存器定义名称:CN  (Power    CN   6)
    • 为一个协处理器定义名称:CP
    • 为一个双精度的 VFP 寄存器定义名称:DN
    • 为一个单精度的 VFP 寄存器定义名称:SN
    • 为一个浮点寄存器定义名称:FN
  • 注意:全部变量用于程序体中,而局部变量用于宏定义中,常用于循环控制,逻辑运算,条件判断中,不会分配空间,这些变量是在编译器的预处理阶段进行的。

8.1.2 数据定义伪操作

  • 数据定义伪操作:用于为特定的数据分配存储单元, 同时可完成已配存储单元的初始化
  • DCD DCW DCB:用于分配一片连续的字、半字、字节的存储单元并用指定的数据初始化(初始化的全局数组)
  • SPACE:用于分配一片连续的存储单元,并用 0 初始化(相当于 C 语言中的未初始化全局数组)
  • MAP:用于定义一个结构化的内存表首地址,与 FIELD 配合使用(相当于 C 语言中的结构体)
  • FIELD:用于定义一个结构化的内存表中的数据域
  • LTORG:用于声明一个数据缓冲池(文字池) 的开始,如果没有使用 LTORG 声明文字池,则汇编器会在程序末尾自动声明
 Str DCB "This is Test!" Data DCD ,,
DataSpace SPACE
MAP 0x40000000
A FIELD
B FIELD
符号描述: DCB(=) DCD(&) SPACE(%) MAP(^) FILED(#)

8.1.3 汇编控制伪操作

  • 汇编控制伪操作:用于控制汇编程序的执行流程,如: 条件汇编、 宏定义、 重复汇编控制等
  • IF 、 ELSE 、 ENDIF ([ | ])
  • WHILE 、 WEND
  • MACRO 、 MEND 、 MEXIT
 CONFIG EQU  MACRO
IF {CONFIG}= MAX $data1,$data2
ADD R0,R0,R1 ......
ELSE MEND
SUB R0,R0,R1 MAX ,
ENDIF

8.1.4 其他伪操作

  • AREA--用于定义一个代码段或数据段
  • ALIGN--通过添加填充字节的方式, 定义边界对齐方式, 默认的情况下, 代码段和数据段是 4 字节对齐的
  • CODE16、 CODE32--伪操作通知编译器, 其后的指令序列通过 16 位的还是 32 位来编译
  • ENTRY --用于指定汇编程序的入口
  • END--用于通知编译器已经到了源程序的结尾
  • EQU--用于为程序中的数字常量、 标号等定义一个等效的字符名称, 相当于 C 中的 define
  • EXPORT(或 GLOBAL ) --用于在程序中声明一个全局的标号
  • IMPORT(EXTERN ) --用于通知编译器要使用一个在其他的源文件中定义的标号
  • GET (或 INCLUDE ) --用于将一个源文件包含到当前的源文件中
  • 例子:
  • AREA Buf,DATA,READWRITE ;符号 AREA 和 END 都不能顶格写, 只有标号可以而且必须顶格写
  • 注意:
    • 伪操作不会产生机器指令, 它是辅助编译器工作的, 在不同环境下伪代指令的描述是不一样的(对比 GNU)符号可以代表地址、 数值、 变量
    • 当符号代表地址时又称为标号,符号代表某个特定数值时又称为符号常量,符号代表变量时又称为变量名
    • 标号: 基于 PC, 基于寄存器(MAP R0), 绝对地址
    • 常量: 与 EQU 搭配使用
    • 变量: 变量名是一个符号地址, 系统会给每一个变量名分配一个内存地址
    • 在 MDK 中的伪操作都可以通过 Help - uVision Help(ARM Development Tools) 查找

8.2 程序控制

  • 顺序结构: 程序流程无分支, 无循环, 无转移, 以直线方式一条指令接着一条指令顺序执行
  • 选择结构: 根据不同的条件, 分成若干个分支路, 配合条件码使用
  • 循环结构: 在顺序和选择控制中, 任一语句执行次数最多一次, 循环控制中可以多次。
  • 循环结构一般分成四部分: 1, 初值 2, 循环体 3, 修改初值 4, 判断条件
  • 在 MDK 中的伪操作都可以通过 Help - uVision Help(ARM Development Tools) 查找

  

八、ARM 汇编程序格式和程序控制的更多相关文章

  1. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  2. linux驱动系列之arm汇编

    在arm平台学习linux时,会遇到arm汇编指令,arm汇编指令与8086汇编指令很多地方都不同,在此记下来以免后面忘了,同时在学习了汇编指令之后分析一些汇编指令编写的代码. 一.相对跳转指令b.b ...

  3. 经常使用ARM汇编指令

    一面学习,一面总结,一面记录. 以下是整理在网上找到的一些资料,简单整理记录一下,方便以后查阅. ARM处理器的指令集能够分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.载入/存储指令. ...

  4. ARM汇编指令集_学习笔记(1)

    一.什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编. C程序运行在X86平台,底层就是X86汇编:运行在ARM平台,底层就是ARM汇编.ARM汇编与X86汇编有显著区别. X86属于 ...

  5. GNU ARM 汇编指令

    第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C ...

  6. 生成ARM汇编

    使用ndk即可生成arm汇编 1.首先写好hello.c 2.编写makefile #ndk根目录 NDK_ROOT=E:\Android\android-ndk-r10b #编译器根目录 TOOLC ...

  7. ARM汇编指令调试方法

    学习ARM汇编时,少不了对ARM汇编指令的调试.作为支持多语言的调试器,gdb自然是较好的选择.调试器工作时,一般通过修改代码段的内容构造trap软中断指令,实现程序的暂停和程序执行状态的监控.为了在 ...

  8. ARM汇编

    ARM汇编 ISA ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型.指令.寄存器.地址模式.内存架构.中断和意外 ...

  9. 3.1 ARM汇编编程概述

    1. 汇编编程 为什么要学习汇编 1). Bootloader初始化 2). Linux kernel 3). 高效 2. ARM汇编分类 1. ARM标准汇编:ARM公司得汇编器适合在Windows ...

随机推荐

  1. linux C 加载so文件 指定路径

    在Linux C中动态加载.so文件用dlopen("libdemo.so", RTLD_NOW); 但是默认的so搜索目录不包括当前程序目录,所以必须复制到系统的so目录 才能运 ...

  2. learning webrtc 使用node.js

    第二章 有使用node.js创建静态服务器的步骤 不过不够详细 下面以Windows为例 1.到官方网站下载安装包 然后安装 2.用管理员权限启动命令行 3.命令行窗口执行npm config set ...

  3. 如何选择EDM电子邮件服务提供商

    选择一家好的EDM电子邮件服务商非常重要,因为这可以让我们的EDM营销事半功倍,同时可以达到更好的营销效果.下面博主为大家介绍一下选择标准. 一.服务好不好. 这点很重要,当然这里的服务包括售前和售后 ...

  4. Unity—Compoent类

    官方API->Componment   新引入成员 作用 字段 gameobject 该组件所在的游戏对象 tag 游戏对象的标签 Transform 添加在游戏对象上的transform组件 ...

  5. Jmeter之检查点

    检查点 Jmeter中检查点也叫断言,Jmeter中有很多类型的断言,但是最常用的是响应断言,即根据服务器返回的结果来判断测试是否通过. 响应断言 添加断言结果用于运行完毕后查看结果 测试通过 测试不 ...

  6. ARTS挑战

    最近有点迷茫,感觉自己工作了一年多,技术成长有限,我要做出改变.2019年11月2日,就从今天开始,参加耗子叔的ARTS挑战. ARTS的初衷 Algorithm:主要是为了编程训练和学习.每周至少做 ...

  7. spring(一) IOC 控制反转 、DI 依赖注入

    IOC 控制反转:创建对象的方式  变成了由Spring来主导 IOC底层原理:对象工厂 1.导入jar包:4个核心jar和1个依赖jar spring-beans-4.3.9.RELEASE.jar ...

  8. paramiko远程连接linux服务器进行上传下载文件

    花了不少时间来研究paramiko中sftpclient的文件传输,一顿操作猛如虎,最后就一直卡在了路径报错问题,疯狂查阅资料借鉴大佬们的心得,还是搞不好,睡了个午觉醒来,仔细一看原来是指定路径的文件 ...

  9. 【Linux 环境搭建】ubuntu下nfs安装与配置

    (1)安装 #sudo apt-get install nfs-kernel-server portmap(2)修改配置文件 修改/etc/exports,增加以下内容, /root/wksp/roo ...

  10. ESP32 Ethernet to wifi

    参考网址 https://github.com/espressif/esp-iot-solution/tree/master/examples/eth2wifi RMII PHY Wiring(RMI ...