




已阅读5页,还剩107页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章ARM程序设计基础 主要内容 5 1ARM汇编语言的程序结构5 2ARM汇编语言的伪操作 宏指令与伪指令5 2 1两种常见的ARM编译开发环境5 2 2ADS编译环境下的伪操作和宏指令5 2 3GNU编译环境下的伪操作和宏指令5 2 4ARM汇编语言的伪指令5 2 5汇编语言程序中的表达式和运算符5 3ARM汇编语言程序设计5 3 1ARM文件格式5 3 2ARM汇编语言语句格式5 4ARM汇编与C的混合编程5 5程序优化和性能测试 5 1ARM汇编语言的程序结构 1段定义 在ARM Thumb 汇编语言程序中 以程序段 section 为单位组织代码 段是相对独立的指令或数据序列 具有特定的名称 段可以分为代码段和数据段 代码段的内容为执行代码 数据段存放代码运行时需要用到的数据 一个汇编程序至少应该有一个代码段 当程序较长时 可以分割为多个代码段和数据段 1段定义 ARM汇编程序的多个段在程序编译链接时最终形成一个可执行的映象文件 可执行映象文件通常由以下几部分构成 一个或多个代码段 代码段的属性为只读 零个或多个包含初始化数据的数据段 数据段的属性为可读写 零个或多个不包含初始化数据的数据段 数据段的属性为可读写 1段定义 代码段的例子 AREAHello CODE READONLY 声明代码段HelloENTRY 程序的入口点STARTMOVR7 10MOVR6 5ADDR6 R6 R7 R6 R6 R7END 每一个汇编文件都要 以END结束 1段定义 数据的例子 AREADatearea DATA NOINIT 声明数据段DateareaDATASPACESPACE100 分配连续100字节的存储单 元 并初始化为零 2数据比较指令 汇编程序可以使用CMP指令进行两个数据的比较 实现跳转 如果Z标志清零则跳转到WAIT 3子程序调用 在ARM汇编语言程序中 子程序的调用一般是通过BL指令来实现的 在跳转之前 会将PC的当前内容 对于ARM指令 PC总是指向当前指令的下两条指令的地址 保存在R14中 因此可以将R14的内容重新加载到PC中来 返回跳转指令之后的那个指令执行 4循环 5 2ARM汇编语言的伪操作 宏指令与伪指令 5 2 1两种常见的ARM编译开发环境5 2 2ADS编译环境下的伪操作和宏指令5 2 3GNU编译环境下的伪操作和宏指令5 2 4ARM汇编语言的伪指令5 2 5汇编语言程序中的表达式和运算符 ARM汇编语言的伪操作 宏指令与伪指令 伪操作 为汇编程序所用 在源程序进行汇编时由汇编程序处理 只在汇编过程起作用 不参与程序运行 宏指令 通过伪操作定义的一段独立的代码 在调用它时将宏体插入到源程序中 伪指令 是汇编语言程序里的特殊指令助记符 在汇编时被合适的机器指令替代 5 2 1两种常见的ARM编译开发环境 ADS SDTIDE开发环境 它由ARM公司开发 使用了CodeWarrior公司的编译器 EmbestIDE开发环境 集成了GNU开发工具的IDE开发环境 由GNU的汇编器as 交叉编译器gcc 和链接器ld等组成 这两种开发环境的编译器都完全支持ARM指令集 但伪指令不同 代码风格不同 5 2 2ADS编译环境下的伪操作和宏指令 ADS编译环境下的伪操作可分为以下几类 一 符号定义 SymbolDefinition 伪操作二 数据定义 DataDefinition 伪操作三 汇编控制 AssemblyControl 伪操作四 信息报告 Reporting 伪操作 无翔实内容 五 宏指令和其他 Miscellaneous 伪操作 一 符号定义 SymbolDefinition 伪操作 在汇编语言程序设计中 经常使用各种符号代替地址 变量和常量等 以增加程序的可读性 尽管符号的命名由编程者决定 但并不是任意的 必须遵循以下的约定 符号区分大小写 同名的大 小写符号会被编译器认为是两个不同的符号 符号在其作用范围内必须唯一 自定义的符号名不能与系统的保留字相同 符号名不应与指令或伪指令同名 ARM汇编中的常用符号 1 程序中的变量程序中的变量是指其值在程序的运行过程中可以改变的量 ARM Thumb 汇编程序所支持的变量有数字变量 逻辑变量和字符串变量 数字变量用于在程序的运行中保存数字值 但注意数字值的大小不应超出数字变量所能表示的范围 逻辑变量用于在程序的运行中保存逻辑值 逻辑值只有两种取值情况 真或假 字符串变量用于在程序的运行中保存一个字符串 但注意字符串的长度不应超出字符串变量所能表示的范围 ARM汇编中的常用符号 2 程序中的常量程序中的常量是指其值在程序的运行过程中不能被改变的量 ARM Thumb 汇编程序所支持的常量有数字常量 逻辑常量和字符串常量 数字常量一般为32位的整数 当作为无符号数时 其取值范围为0 232 1 当作为有符号数时 其取值范围为 231 231 1 数字常量 数字常量有3种表示方式 十进制数 如1 2 123十六进制数 如0 x123 0 xabcn进制数 形式为n XXX n的范围是2到9 XXX是具体数字逻辑常量只有两种取值情况 真或假 TRUE FALSE 注意带大括号字符常量 由单引号及中间的字符组成 包括C语言中的转义字符 如 a n 字符串常量为一个固定的字符串 一般用于程序运行时的信息提示 由一对双引号及中间的字符串表示 中间也可以使用C语言中的转义字符 比如 abcdef 0 xa r n ARM汇编中的常用符号 3 程序中的变量代换程序中的变量可通过代换操作取得一个常量 代换操作符为 如果在数字变量前面有一个代换操作符 编译器会将该数字变量的值转换为十六进制的字符串 并将该十六进制的字符串代换 后的数字变量 如果在逻辑变量前面有一个代换操作符 编译器会将该逻辑变量代换为它的取值 真或假 如果在字符串变量前面有一个代换操作符 编译器会将该字符串变量的值代换 后的字符串变量 如果需要将 字符加入到字符串中 可以用 代替 此时编译器将不再进行变量代换 而是把 看作一个 一般的 在两个 之间的 并不进行变量的代换 但如果 在双引号内 则将进行变量代换 使用 来表示字符串中变量名的结束 LCLSS1 定义局部字符串变量S1和S2LCLSS2S1SETS Test S2SETS Thisisa S1 字符串变量S2的值为 ThisisaTest 符号定义伪操作 在ARM Thumb 汇编语言程序设计中 GBLA GBLL GBLS 声明全局变量 LCLA LCLL LCLS 声明局部变量 SETA SETL SETS 给变量赋值 RLIST 为通用寄存器列表定义名称 1 GBLA GBLL GBLS用于声明一个ARM程序中的全局变量 并将其初始化 GBLA 声明一个全局算术变量 并初始化成0 GBLL 声明一个全局逻辑变量 并初始化成 FALSE GBLS 声明一个全局串变量 并初始化成空串 语法格式 variable 全局变量的作用范围为 包含该变量的源程序 全局变量名称在作用范围内必须唯一 2 LCLA LCLL LCLS用于声明一个ARM程序中的局部变量 并将其初始化 LCLA 声明一个局部算术变量 并初始化成0 LCLL 声明一个局部逻辑变量 并初始化成 FALSE LCLS 声明一个局部串变量 并初始化成空串 语法格式 variable 局部变量的作用范围为 包含该局部变量的宏代码的一个实例 3 SETA SETL SETS用于给ARM程序中的变量赋值 SETA 给一个算术变量赋值 SETL 给一个逻辑变量赋值 SETS 给一个串变量赋值 语法格式 variableexpressionexpression 赋给变量的值 在向变量赋值前 必须先声明该变量 例 GBLSs1GBLSs2LCLSs3S1SETS strings1 S2SETS strings2 S3SETSS1 CC S2GBLLlogiclogicSETL TRUE LCLAarithmeticarithmeticSETA0 xff 声明一个全局串变量s1 声明一个全局串变量s2 声明一个局部串变量s3 串变量s1赋值为 strings1 串变量s2赋值为 strings2 串变量s3赋值 声明一个全局逻辑变量logic 声明一个局部算术变量 变量logic赋初值为 TRUE 变量arithmetic赋初值为oxff 4 RLIST为一个通用寄存器列表定义名称 定义的名称可以在LDM STM指令中使用 语法格式 nameRLIST list of registers name 寄存器列表名称 list of registers 通用寄存器列表 例 contextRLIST R0 R6 将寄存器列表名称定义为contextLDMDFSP context 加载寄存器列表 二 数据定义伪操作 LTORG 声明一个数据缓冲池的开始 SPACE 分配一块内存单元 并用0初始化 MAP 定义一个结构化的内存表的首地址 FIELD 定义结构化内存表中的一个数据域 DCB 分配一段字节内存单元 并初始化 DCD DCDU 分配一段字内存单元 并初始化 1 LTORG用于声明一个数据缓冲池 文字池 的开始 语法格式 LTORG例 startBLfunc funcLDRR1 0 x8000 子程序 MOVPC LR 子程序返回LTORG 定义数据缓冲池0 x8000DataSPACE4200 从当前位置开始分配4200字节的内存单元 并初始化为0 END默认数据缓冲池为空 注意 LTORG伪操作通常放在无条件跳转指令之后 或者子程序返回指令之后 这样处理器不会错误地将数据缓冲池中的数据当作指令来执行 通常ARM汇编编译器把数据缓冲池放在代码段的最后面 即下一个代码段开始之前 或者END伪操作之前 2 SPACE 也可以用符号 表示用于分配一块连续的内存单元供程序使用 并且将这个内存单元的内容初始化为0 语法格式 label SPACEexpr或 label expr其中 label 是一个标号 可选项 expr 数值表达式 用来规定内存单元的字节数 例 AREADataSpace Data READWRITEdata1SPACE256 定义大小为256字节的数据区 3 MAP FIELD使用MAP和FIELD伪操作描述数据结构 MAP用于定义数据结构的起始地址 FIELD用于定义结构中的字段 各数据域的字节长度 并可为每一个数据域指定一个标号 其它指令可引用此标号 注 MAP和FIELD伪操作只是定义数据结构并不实际分配内存单元 1 MAP 也可以用符号 表示语法格式 MAPexpr base register 或 expr base register 其中 expr 数据表达式或程序中的标号 使用MAP之前已定义 base register 基址寄存器若指令中没有此项时 expr为结构的首地址 基于绝对地址的数据结构 若指令中包含此项时 expr base register的和为结构首地址 基于相对地址的数据结构 例 MAP0 xC0008 数据结构存放的起始地址是0 xC0008 datalabel 64 数据结构存放的起始地址是datalabel 64 datalabel已定义过 MAP0 x10 R9 数据结构存放的起始地址是R9中存放的数值加上0 x10 2 FIELD 也可以用符号 表示用户定义数据结构中的字段 语法格式 label FIELDexpr或 label expr其中 label 字段的名称 地址标号 expr 此字段在数据结构中所占的字节数 由MAP和FIELD伪操作配合定义的数据结构有3种 基于绝对地址的数据结构基于寄存器相对偏移的数据结构基于程序相对偏移的数据结构 基于PC 例1 基于绝对地址 首地址固定MAP0 x200 内存的首地址为0 x200aFIELD4 字段a长度为4 相对位置为0bFIELD4 字段b长度为4 相对位置为4xFIELD8 字段x长度为8 相对位置为8yFIELD8 字段y长度为8 相对位置为16sFIELD16 字段s长度为16 相对位置为24引用结构中的数据 LDRR0 b 例2 基于寄存器相对偏移 首地址基于基址寄存器MAP0 R9 内存的首地址为R9寄存器的值aFIELD4 字段a长度为4 相对位置为0bFIELD4 字段b长度为4 相对位置为4xFIELD8 字段x长度为8 相对位置为8yFIELD8 字段y长度为8 相对位置为16sFIELD16 字段s长度为16 相对位置为24可通过下面的指令访问数据结构中的信息 ADRR9 datastart datastart是数据起始地址LDRR0 b LDRR0 R9 4 通过在ADR指令中指定不同的基址寄存器的值 定义的数据结构可在程序中有多个实例 例3 基于程序相对偏移 首地址基于PCDatastrucSPACE280 分配280字节的内存单元MAPDatastruc 内存的首地址为Datastruc内存单元aFIELD4 字段a长度为4 相对位置为0bFIELD4 字段b长度为4 相对位置为4xFIELD8 字段x长度为8 相对位置为8yFIELD8 字段y长度为8 相对位置为16sFIELD256 字段s长度为16 相对位置为24可通过下面的指令访问数据结构中的信息 LDRR0 b LDRR0 Datastruc 4 例 判断当前内存的使用情况是否超过程序分配的可用内存的方法 startofmemEQU1000 分配内存首地址endofmemEQU2000 分配内存末地址MAPstartofmem 内部首地址为startofmemaFIELD4 字段a长度为4 相对位置为0bFIELD4 字段b长度为4 相对位置为4xFIELD8 字段x长度为8 相对位置为8yFIELD8 字段y长度为8 相对位置为16sFIELDmax 字段s长度为max 相对位置为24 endofstruFIELD0 endofstru用于检查内存是否越界ASSERTendofstru endofmem 4 DCB 也可以用符号 表示用于定义并且初始化一个或者多个字节的内存区域 语法格式 label DCBexpr expr 或 label expr expr 其中 expr表示 128到255之间的一个数值常量或者表达式 一个字符串 当DCB后面紧跟一个指令时 可能需要使用ALIGN确保指令是字对齐的 例 shortDCB1 为short分配了一个字节 并初始化为1 stringDCB string 0 构造一个以0结尾的字符串 5 DCD DCDU 1 DCD 也可以用符号 表示用于分配一段字内存单元 分配的内存单元都是字对齐的 并初始化 语法格式 label DCDexpr expr 或 label expr expr 其中 expr 数字表达式或程序中的标号 DCD伪操作可能在分配的第一个内存单元前插入填补字节以保证分配的内存是字对齐的 例 data1DCD2 4 6 为data1分配三个字 内容初始化为2 4 6data2DCDlabel 4 初始化data2为label 4对应的地址 2 DCDUDCDU与DCD的不同之处在于DCDU分配的内存单元并不严格字对齐 三 汇编控制伪操作 IF ELSE及ENDIFWHILE及WENDMACRO MEND及MEXIT 1 IF ELSE及ENDIFIF ELSE及ENDIF伪操作能够根据条件把一段源代码包括在汇编语言程序内或者将其排除在程序之外 是IF伪操作的同义词 是ELSE伪操作的同义词 是ENDIF伪操作的同义词语法格式 IFlogicexpression logicexpression控制选择逻辑表达式 指令或伪指令代码段1 ELSE 可选 指令或伪指令代码段2 ENDIF IF ELSE及ENDIF伪操作可以嵌套使用 例 IFVariable 16 如果Variable 16成立 则编译下面代码BNESUB1LDRR0 SUB0BXR0ELSE 否则编译下面代码BNESUB0LDRR0 SUB0BXR1ENDIF 2 WHILE及WENDWHILE及WEND伪操作能够根据条件重复汇编相同的一段源代码 语法格式 WHILElogicexpressioninstructionsorderectivesWEND WHILE和WEND伪操作可以嵌套使用 例 countSETA1 设置循环计数变量count初始值为1WHILEcount 4 由count控制循环执行的次数countSETAcount 1 将循环计数变量加1 代码WEND 结束 3 MACRO MEND及MEXITMACRO 标识宏定义的开始 MEND 标识宏定义的结束 MACRO和MEND之间的代码称为宏定义体 MEXIT 用于从宏中跳转出去 宏体代表了一个预定义的汇编语言指令序列 在汇编程序中通过宏的名称调用宏 编译时 宏语句被展开 语法格式 MACRO label macroname parameter parameter code codeMEND其中 label 在宏被展开时 label可被替换成相应的符号 macroname 多定义的宏的名称 parameter 宏指令的参数 例 示例26 MACRO labeljump a1 a2 label loop1 BGE label loop1 label loop2BL a1BGT label loop2 ADR a2MEND 在程序中调用此宏 examjumpsub det examloop1 BGEexamloop1 examloop2 BLsub BGTexamloop2 ADRdet 例 MACRO abcmacroabc param1 param2 codeIFcondition1 codeMEXIT 从宏中跳出ELSE codeENDIF codeMEND 子程序比较短 而需要传递的参数比较多是可以使用宏汇编技术 五 宏指令和其他伪操作 1 CODE16和CODE32CODE16告诉汇编编译器后面的指令序列为16位的Thumb指令 CODE32告诉汇编编译器后面的指令序列为32位的ARM指令 语法格式 CODE16CODE32 CODE16和CODE32只是告诉编译器后面指令的类型 该伪操作本身不进行程序状态的切换 例 AREAChangeState CODE READONLYENTRYCODE32 下面为32位ARM指令LDRR0 start 1BXR0 CODE16 下面为16位Thumb指令startMOVR1 10 END 切换到Thumb状态 并跳转到start处执行 2 EQU 也可以用符号 表示EQU伪操作为数字常量 基于寄存器的值和程序中的标号定义一个字符名称 语法格式 nameEQUexpr type 其中 expr 基于寄存器的地址值 程序中的标号 32位的地址常量或者32位的常量 name 为expr定义的字符名称 type 当expr为32位常量时 可以使用type指示expr的数据的类型 取值为 CODE32CODE16DATA 例 abcdEQU2 定义abcd符号的值为2abcdEQUlabel 16 定义abcd符号的值为 label 16 abcdEQU0 x1c CODE32 定义abcd符号的值为绝对地址 值0 x1c 而且此处为ARM指令 3 AREA用于定义一个代码段或是数据段 语法格式 AREAsectionname attr attr 其中 sectionname 为所定义的段的名称 attr 该段的属性 具有的属性为 CODE 定义代码段 DATA 定义数据段 READONLY 指定本段为只读 代码段的默认属性 READWRITE 指定本段为可读可写 数据段的默认属性 ALIGN expression 指定段的对齐方式为2expression expression的取值为0 31 ASSOC section 指定与本段相关的ELF段 COMDEF 定义一个通用的段 该段可以包含代码和数据 在某个源文件中 同名的COMDEF段必须相同 COMMON 定一个通用段 该段不包含任何用户代码和数据 NOINIT 指定此数据段仅仅保留了内存单元 而没有将各初始值写入内存单元 或者将各个内存单元值初始化为0 一个大的程序可包含多个代码段和数据段 一个汇编程序至少包含一个代码段 4 ENTRY指定程序的入口点 语法格式 ENTRY注意 一个程序 可包含多个源文件 中至少要有一个ENTRY 可以有多个ENTRY 但一个源文件中最多只能有一个ENTRY 可以没有ENTRY 5 ENDEND伪操作告诉编译器已经到了源程序结尾 语法格式 END注意 每一个汇编源程序都必须包含END伪操作 以表明本源程序的结束 6 ALIGNALIGN伪操作通过填充0将当前的位置以某种形式对齐 语法格式 ALIGN expr offset 其中 expr 一个数字 表示对齐的单位 这个数字是2的整数次幂 范围在20 231之间 如果没有指定expr 则当前位置对齐到下一个字边界处 offset 偏移量 可以为常数或数值表达式 不指定offset表示将当前位置对齐到以expr为单位的起始位置 例1 shortDCB1 本位操作使字对齐被破坏ALIGN 重新使其为字对齐MOVR0 1例2 ALIGN8 当前位置以2个字的方式对齐 7 EXPORT及GLOBAL声明一个源文件中的符号 使得此符号可以被其他源文件引用 语法格式 EXPORT GLOBALsymbol weak 其中 symbol 声明的符号的名称 区分大小写 weak 声明其他同名符号优先于本符号被引用 例 AREAexample CODE READONLYEXPORTDoAddDoAddADDR0 R0 R1 8 IMPORT及EXTERN声明一个符号是在其他源文件中定义的 语法格式 IMPORTsymbol weak EXTERNsymbol weak 其中 symbol 声明的符号的名称 weak 当没有指定此项时 如果symbol在所有的源文件中都没有被定义 则连接器会报告错误 当指定此项时 如果symbol在所有的源文件中都没有被定义 则连接器不会报告错误 而是进行下面的操作 1 如果该符号被B或者BL指令引用 则该符号被设置成下一条指令的地址 该B或BL指令相当于一条NOP指令 2 其他情况下此符号被设置成0 9 GET及INCLUDE将一个源文件包含到当前源文件中 并将被包含的文件在其当前位置进行汇编处理 指令格式 GETfilenameINCLUDEfilename其中 filename 包含的源文件名 可以使用路径信息 可包含空格 例 GETd arm file s 10 INCBIN将一个文件包含到当前源文件中 而被包含的文件不进行汇编处理指令格式 INCBINfilename其中 filename 被包含的文件名称 可使用路径信息 不能有空格 通常使用此伪操作将一个可执行文件或者任意数据包含到当前文件中 例 INCBINd arm file txt 5 2 3GNU编译环境下的伪操作和宏指令 GNU编译环境下的伪操作可分为以下几类 常量编译控制伪操作汇编程序代码控制伪操作宏及条件编译控制伪操作其他伪操作 常量编译控制伪操作 字符编译控制伪操作 汇编程序代码控制伪操作 宏及条件编译控制伪操作 其他伪操作 ltorg在当前段 一般为代码段 的当前地址 字对齐 产生一个文字池 一般放在一段程序的后面 例 movpc lr ltorgsrc long1 2 3 4 5dst long0 0 0 0 reqname expr为一个特定的寄存器定义名称 例 reqcount 7 定义R7为count 5 2 4ARM汇编语言的伪指令 ARM伪指令不属于ARM指令集中的指令 是为了编程方便而定义的 伪指令可以像其它ARM指令一样使用 但在编译时这些指令将被等效的ARM指令代替 ARM伪指令有四条 分别是 ADR 小范围的地址读取伪指令 ADRL 中等范围的地址读取伪指令 LDR 大范围的地址读取伪指令 NOP 空操作伪指令 1 ADR 小范围的地址读取ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 在汇编编译器编译源程序时 ADR伪指令被编译器替换成一条合适的指令 通常 编译器用一条ADD指令或SUB指令来实现此ADR伪指令的功能 若不能用一条指令实现 则产生错误 编译失败 语法格式 ADR cond register expr其中 register 加载的目标寄存器 expr 地址表达式 取值范围是参考P212 例1 0 x20 ADRR1 Delay Delay 0 x64 MOVR0 R14 使用ADR将程序标号Delay所表示的地址存入R1 编译后的反汇编代码 ADDR1 PC 0 x3C MOVR0 R14 PC 0 x3C 0 x20 0 x08 0 x3C 0 x64 例2 查表ADRR0 D TAB 加载转换表地址LDRBR1 R0 R2 使用R2作为参数 进行查表 D TABDCB0 xC0 0 xF9 0 xA4 0 xB0 0 x99 0 x92 2 ADRL 中等范围的地址读取ADRL伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的地址值读取到寄存器中 比ADR伪指令可以读取更大范围的地址 在汇编编译器编译源程序时 ADRL被编译器替换成两条合适的指令 若不能用两条指令实现 则产生错误 编译失败 语法格式 ADRL cond register expr其中 register 加载的目标寄存器 expr 地址表达式 取值范围参考P212 例 0 x20 ADRLR1 Delay Delay 0 x64 MOVR0 R14 使用ADRL将程序标号Delay所表示的地址存入R1 编译后的反汇编代码 ADDR1 PC 0 x3CADDR1 R1 0 MOVR0 R14 ADRL伪指令被汇编成两条指令 尽管第2条指令并没有意义 3 LDR 大范围的地址读取LDR伪指令用于加载32位立即数或一个地址值到指定的寄存器 在汇编编译源程序时 LDR伪指令被编译器替换成一条合适的指令 若加载的常数未超过MOV或MVN的范围 则使用MOV或MVN指令代替该LDR伪指令 否则汇编器将常量放入文字池 并使用一条程序相对偏移的LDR指令从文字池读出常量 语法格式 LDR cond register expr其中 Register 加载的目标寄存器 expr 32位常量或地址表达式 例 0 x060 LDRR1 Delay Delay 0 x102 MOVR0 R14 使用LDR将程序标号Delay所表示的地址存入R1 编译后的反汇编代码 LDRR1 stack DelayMOVR0 R14 LTORGstackDCD0 x102 LDR伪指令被汇编成一条LDR指令 并在文字池中定义一个常量 该常量为标号Delay的地址 注意 从指令位置到文字池的偏移量必须小于4KB 与ARM指令的LDR相比 伪指令LDR的参数有 号 4 NOP 空操作伪指令NOP伪指令在汇编时将被替代成ARM中的空操作 比如可能是 MOVR0 R0 指令等 NOP可用于延时操作 语法格式 NOP例 DelayNOP 空操作NOPNOPSUBSR1 R1 1 循环次数减1BNEDelayMOVPC LR 5 2 5汇编语言程序中的表达式和运算符 表达式一般由变量 常量 运算符和括号构成 常用的表达式有数字表达式 逻辑表达式和字符串表达式 其运算次序遵循如下的优先级 优先级相同的双目运算符的运算顺序为从左到右 相邻的单目运算符的运算顺序为从右到左 且单目运算符的优先级高于其他运算符 括号运算符的优先级最高 5 2 5汇编语言程序中的表达式和运算符 1 数字表达式及运算符数字表达式一般由数字常量 数字变量 数字运算符和括号构成 与数字表达式相关的运算符如下 及 MOD 算术运算符X Y表示X与Y的和 X Y表示X与Y的差 X Y表示X与Y的乘积 X Y表示X除以Y的商 X MOD Y表示X除以Y的余数 5 2 5汇编语言程序中的表达式和运算符 1 数字表达式及运算符 ROL ROR SHL 及 SHR 移位运算符以X和Y表示两个数字表达式 以上的移位运算符代表的运算如下 X ROL Y表示将X循环左移Y位 X ROR Y表示将X循环右移Y位 X SHL Y表示将X左移Y位 X SHR Y表示将X右移Y位 5 2 5汇编语言程序中的表达式和运算符 1 数字表达式及运算符 AND OR NOT 及 EOR 按位逻辑运算符X AND Y表示将X和Y按位作逻辑与的操作 X OR Y表示将X和Y按位作逻辑或的操作 NOT Y表示将Y按位作逻辑非的操作 X EOR Y表示将X和Y按位作逻辑异或的操作 5 2 5汇编语言程序中的表达式和运算符 2 逻辑表达式及运算符逻辑表达式一般由逻辑量 逻辑运算符和括号构成 其表达式的运算结果为真或假 与逻辑表达式相关的运算符如下 运算符 LAND LOR LNOT 及 LEOR 运算符 X LAND Y表示将X和Y作逻辑与的操作 X LOR Y表示将X和Y作逻辑或的操作 LNOT Y表示将Y作逻辑非的操作 X LEOR Y表示将X和Y作逻辑异或的操作 5 2 5汇编语言程序中的表达式和运算符 3 字符串表达式及运算符字符串表达式一般由字符串常量 字符串变量 运算符和括号构成 编译器所支持的字符串最大长度为512字节 常用的与字符串表达式相关的运算符如下 LEN运算符LEN运算符返回字符串的长度 字符数 以X表示字符串表达式语法格式 LEN X CHR运算符CHR运算符将0 255之间的整数转换为一个字符 以M表示某一个整数语法格式 CHR M 5 2 5汇编语言程序中的表达式和运算符 3 字符串表达式及运算符 STR运算符STR运算符将将一个数字表达式或逻辑表达式转换为一个字符串 对于数字表达式 STR运算符将其转换为一个以十六进制组成的字符串 对于逻辑表达式 STR运算符将其转换为字符串T或F语法格式 STR X 其中 X为一个数字表达式或逻辑表达式 LEFT运算符LEFT运算符返回某个字符串左端的一个子串语法格式 X LEFT Y 其中 X为源字符串 Y为一个整数 表示要返回的字符个数 RIGHT运算符与LEFT运算符相对应 5 2 5汇编语言程序中的表达式和运算符 3 字符串表达式及运算符 CC运算符CC运算符用于将两个字符串连接成一个字符串语法格式 X CC Y 其中 X为源字符串1 Y为源字符串2 CC运算符将Y连接到X的后面 5 2 5汇编语言程序中的表达式和运算符 4 与寄存器和程序计数器 PC 相关的表达式及运算符 BASE运算符BASE运算符返回基于寄存器的表达式中寄存器的编号 语法格式 BASE X 其中 X为与寄存器相关的表达式 INDEX运算符INDEX运算符返回基于寄存器的表达式中相对于其基址寄存器的偏移量语法格式 INDEX X 其中 X为与寄存器相关的表达式 5 2 5汇编语言程序中的表达式和运算符 5 其他常用运算符 运算符 运算符返回某代码行所生成的可执行代码的长度 例如 X返回定义符号X的代码行所生成的可执行代码的字节数 DEF运算符DEF运算符判断是否定义某个符号 例如 DEF X如果符号X已经定义 则结果为真 否则为假 5 3ARM汇编语言程序设计5 3 1ARM文件格式5 3 2ARM汇编语句格式 5 3 1ARM文件格式 5 3 1ARM文件格式 ARM源程序文件 即源文件 为文件格式 可以使用任一文本编辑器编写程序代码 在ARM程序设计中 常用的源文件可简单分为以下几种 其后缀名如下 5 3 1ARM文件格式 在一个程序中 至少要有一个汇编源文件和C程序文件 可以有多个源文件和C程序文件 或C文件和源文件两者的组合 ARM Thumb 汇编语言的语句格式为 symbol instruction direction pseudo instruction comment 标号 指令或伪指令或伪操作 注释 其中 symbol 标号instruction 指令directive 伪操作pseudo instruction 伪指令comment 语句的注释 5 3 2ARM汇编语句格式 5 3 2 ARM汇编语句格式 书写规则 在汇编语言程序设计中 每一条指令 伪操作和伪指令的助记符可以全部用大写 或全部用小写 但不用许在一条指令中大 小写混用 同时 如果一条语句太长 可将该长语句分为若干行来书写 在行的末尾用 表示下一行与本行为同一条语句 标号必须在一行的顶格书写 而所有指令均不能顶格书写 标号严格区分大小写 5 3 2 ARM汇编语句格式 标签标签是一个符号 可以代表指令的地址 变量 数据的地址和常量 一般以字母开头 由字母 数字 下划线组成 当符号代表地址时又称标号 可以以数字开头 其作用范围为当前段或者在下一个ROUT伪操作之前 指令 伪操作指令 伪操作是指令的助记符或者定义符 它告诉ARM的处理器应该执行什么样的操作或者告诉汇编程序伪指令语句的伪操作功能 5 3 2ARM汇编语句格式 5 3 2ARM汇编语句格式 5 4ARM汇编与C的混合编程 汇编语言与C语言混合编程技术 ARM体系结构支持ARM的汇编语言与C与C 的混合编程 一般的在一个完整的程序设计的中 除了初始化部分用汇编语言完成外 其大部分的编程任务一般都用C或C 完成 汇编程序中访问C程序变量 在汇编的源程序中调用C语言风格的字符串需要使用IMPORT伪操作 IMPORT相当于C语言中的extern关键字 告诉编译器引用的符号不是在本文件中定义的 而是在其他的源文件中定义的 IMPORTsymbol WEAK symbol是声明的符号的名称 WEAK 指示编译器如果发现symbol在所有的源文件中都没有找到 那么它也不会产生任何的错误信息 示例见下页 汇编程序中访问C程序变量 C语言代码文件str c 里面只有一个简单的字符串的定义char strhello Helloworld n 0 汇编代码文件hello s1AREA text CODE READONLY2mainPROC3STMFDsp lr 4LDRr0 strtemp5LDRr0 r0 6BL printf7LDMFDsp pc 8strtemp9DCDstrhello10ENDP11EXPORTmain12IMPORTstrhello13IMPORT main14IMPORT main15IMPORT printf16IMPORT Lib Request armlib WEAK17END C程序中内嵌汇编指令 在ARM的C语言程序中我们可以使用关键字 asm来加入一段汇编语言的程序 格式如下 asm instruction comment 嵌入式汇编的例子 C程序中内嵌汇编指令 在C语言中嵌入的ARM汇编需要注意一些问题 在汇编指令中 可以使用表达
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 最低价租赁合同的注意事项
- 工业原材料采购供应合同书
- 采购供应商信息及合同管理工具集
- 2025租赁合同(文本3)范本
- 农村新型合作组织建设协议
- 家庭农场农机具租赁使用协议
- 还我地球洁白500字13篇范文
- IT设备采购申请与审批流程表
- 家庭农场农作物种植与销售联合协议
- 助导考试题目及答案
- 盐碱地改造报告精要
- 企业合规管理培训课件讲义
- 幼儿园大班美术:《线条画:花》课件
- 燃气具安装维修工(中级)教学课件完整版
- 适龄儿童免(缓)学申请表
- 小学综合实践一年级上册各单元教材分析及全一册全部教案
- 二年级上册生命.生态.安全 全册教案
- (完整版)英语能力B级考试课件
- (中英)订购单-Purchase-Order
- 框架结构(课件)
- 有机化学第五章 脂环烃
评论
0/150
提交评论