第4节 汇编语言源程序格式

上传人:M****1 文档编号:489631436 上传时间:2023-07-09 格式:DOCX 页数:25 大小:146.72KB
返回 下载 相关 举报
第4节 汇编语言源程序格式_第1页
第1页 / 共25页
第4节 汇编语言源程序格式_第2页
第2页 / 共25页
第4节 汇编语言源程序格式_第3页
第3页 / 共25页
第4节 汇编语言源程序格式_第4页
第4页 / 共25页
第4节 汇编语言源程序格式_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《第4节 汇编语言源程序格式》由会员分享,可在线阅读,更多相关《第4节 汇编语言源程序格式(25页珍藏版)》请在金锄头文库上搜索。

1、第4 节 汇编语言源程序格式第 4 章 汇编语言程序设计 汇编语言源程序格式 汇编语言上机过程 汇编语言与 C 语言混合编程技术常用ARM源程序文件类型C0DE32AREA codesec/ CQDEj READONLY main PRO(j.STMFDspJ, lrADRrOj strhelloBL_printfBLwelcomefunLDMFDspJj pcstrhelloDCBHello world?n0ENDP汇编语言程序的结构1C0DE32AREA codesec/ CQDEj READONLYmain PRO(j.STMFDADRBLspJ, lrrOj strhello_prin

2、tfBLwelcomefunLDMF1)spJpcstrhelloDCBHello worid?nCLENI3P汇编语言程序的结构2泊2位的劎指令段:代码段,名称处皿怦 属性为只渎;函数main;保存必要的寄存器和返叵趟址到馥据栈;取标签strhello代表的地址憶;调用运行时库的-pnntf函数打印;Hello world A 字符串;i懿用子函数welcomfun;恢复寄存器値;strhello代表本地字答卑的地址淀餐一段字节空间;函数main结東位的颐指令段:代码段,茗称齿匚低巒,属性为只读;函数main;保存必要的寄存器和返叵地址到数据栈;取标签strhello代表的地址瘵;调用(:运

3、行时库的-prmtf函数打印;Hello world A 字符串;阈用子函数welcomfun;恢复寄存器値;strhello代表本地字芦i唱的地址 淀餐一段字节空间;函数main结東EXPORT main;弓运行时库函数和 颐 库IMPORT _mainIMPORT _mainIMPORT .jprintfIMPORT | |LibHReques+$aimlib| |, WEAK汇编语言程序的结构3EXPORT main;引入三慕迅运行时库函数和 颐库IMPORT _mainIMPORT _mainIMPORT .jprintfIMPORT |Lib$Request$armlib|, WEA

4、K汇编语言程序的结构4ARM的汇编语言程序一般由几个段组成,每个段均由AREA伪操作定义。段可以分为多种,如代码段、数据段、通用段,每个段又有不同的属性,如代码段的默认属 性为READONLY,数据段的默认属性为READWRITE。本程序定义了两个段,第一个段为代码段codesec,它在存储器中存放用于程序执行的代码 以及main函数的本地字符串;第二个段为数据段constdatasec,存放了全局的字符串,由 于本程序没有对数据进行写操作,该数据段定义属性为READONLY。汇编语言的行构成1格式:标签 指令/伪操作/伪指令 操作数 ;语句的注释所有的标签必须在一行的开头顶格写,前面不能留空

5、格,后面也不能跟C语言中的标签一 样加上“:”;ARM 汇编器对标识符的大小写敏感,书写标号及指令时字母的大小写要一致;注释使用“” 符号,注释的内容从“” 开始到该行的结尾结束汇编语言的行构成2标签 标签是一个符号,可以代表指令的地址、变量、数据的地址和常量。 一般以字母开头,由字母、数字、下划线组成。当符号代表地址时又称标号,可以以数字开头,其作用范围为当前段或者在下一个ROUT 伪操作之前。指令/伪操作指令/伪操作是指令的助记符或者定义符,它告诉ARM的处理器应该执行什么样的操作或者 告诉汇编程序伪指令语句的伪操作功能。汇编语言的标号1标号代表地址。 标号分为段内标号和段外标号。段内标号

6、的地址值在汇编时确定,段外编号的地址值在链接 时确定 。在程序段中,标号代表其所在位置与段首地址的偏移量。根据程序计数器(PC)和偏移量 计算地址即程序相对寻址。在映像中定义的标号代表标号到映像首地址的偏移量。映像的首地址通常被赋予一个寄存 器,根据该寄存器值与偏移量计算地址即寄存器相对寻址。例如:loop SUBS r0,r0,#1 ;每次循环使 r0=r0-1BNE loop ;跳转到 loop 标号去执行汇编语言的标号2在宏中也可以使用局部符号。局部标号是099 的十进位数开始,可以重复定义。局部标号引用格式:F|BA|T Nroutname% :局部标号引用操作。F :编译器只向前搜索

7、。B :编译器只向后搜索。A :编译器搜索宏的所有嵌套层次。T :编译器搜索宏的当前层。例如:01 SUBS r0,r0,#1 ;每次循环使 r0=r0-1BNE %B01 ;跳转到01 标号去执行汇编语言的常量 常量:其值在程序运行过程中不能被改变的量。(1) 数字常量:数字常量有3 种表示方式:十进制数,如 1、2、123十六进制数,如 0x123,0xabcn 进制数,形式为 n_XXX, n 的范围是 2 到 9, XXX 是具体数字(2) 字符常量:由单引号及中间的字符组成,包括C语言中的转义字符,如a/n(3) 字符串常量:由一对双引号及中间的字符串表示,中间也可以使用C语言中的转

8、义字 符,比如: “abcdef0xarn”(4) 逻辑常量:TRUE,FALSE,注意带大括号汇编程序的变量代换1 这里所说的变量,是相对于汇编程序的“变量”,是用于汇编程序进行处理的,但一旦编译到 程序中,则不会改变,成为常量。在字符串变量的前面有一个$字符,在汇编时编译器将用该字符串变量的内容代替该串变 量。在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符 串,并用该十六进制的字符串代换“$”后的数字变量。需要将“$”字符加入到字符串中,可以用“$”代替,此时编译器将不再进行变量代换,而是 把“$”看作一个“$”。在两个“|”之间的“$”并不进行变量的代

9、换,但如果“|”在双引号内,则将进行变量代换。 使用“.”来表示字符串中变量名的结束。;导出mam函数供外部调用汇编程序的变量代换2AEEA | |. test | |, tODE, READONLY 码段,茗称为 |讼 t|,属性齿只读GBLS;GBLSstrlstr211nLLml;声明strl次全局字符串;声明毗说为全局字符串;声明11为全局逻辑变量;声明nwnl为全局数字变壘GBLLGBLA11SETLTRUEnumlSETAstrlSETSEtr2-SETS.yaaastrl: $strl. 11: $llj al: $nunil.; str2 包舍;了多个变壘mamPRO;函数ma

10、mSTIFDspJ. llr;保存必要的寄存器和返回地址到数据栈ADRrOj strhelloBLprintf;调用C运行时库的_prmtf函数打印字符串LDMFDspJ pc;恢复寄存器價strhello3str2nQ;strhello代表車地字符辭的地址in*rzn 宀 1 f vivnDCB.,正文氐J 1J工J bJENDP;函数main金束EXPORT main;引入三亍已运行时库函数和M库IMPORT _mainIMPORT _mainIMPORT _printfIMPORT | |LibURequest$aimlib| |, 框AKEND字符串“aaa str1:$str1. I

11、1:$l1,a1:$numl.ccc中的3个变量将在编译时被替换。程序运行后看到下面结果:aaa str1:bbb l1:T,a1:0000004Fccc伪指令在 ARM 汇编语言源程序中有些特殊助记符,它们没有相对应的操作码或者机器码,通常称 为伪指令,它们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序作各种准备工作的,由汇编程序在源程序的汇编 期间进行处理,仅在汇编过程中起作用。在 ARM 的汇编程序中,有如下几种伪指令:符号定义伪指令数据定义伪指令汇编控制伪指令信息报告伪指令宏指令以及其他伪指令符号定义伪指令作用:用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的

12、别名等。 符号定义有如下几种伪指令: 用于定义局部变量的 LCLA、 LCLL 和 LCLS。用于定义全局变量的GBLA、GBLL和GBLS。用于对变量赋值的SETA、SETL和SETS。 为通用寄存器列表定义名称的 RLIST。符号定义伪指令1-1(1)LCLA、 LCLL 和 LCLS格式:LCLA/LCLL/LCLS 局部变量名说明:LCLA、LCLL和LCLS伪指令用于定义一个汇编程序中的局部变量并初始化。其中:LCLA定义一个局部的数字变量,初始化为0。LCLL定义一个局部的逻辑变量,初始化为F。LCLS 定义一个局部的字符串变量,初始化为空串。这3 条伪指令用于声明局部变量,在其局

13、部作用范围内变量名必须惟一,例如在宏内。符号定义伪指令1-2例如MAC RO TFSTLCLAmuni ;定义一个局部的数字变亘打 变量名为;mnnlLCLLLCLS12;定义一个局部的逻辑变量,变量名为12sti3 ;定义一个局部的字符串变量,变量名;为血3munisti3SETA Oxnbcd;将该变量赋值为ttxabcdSETL FALSE將该变量赋值为真SETS:将该变量赋值为Hello!?JRfENI)符号定义伪指令212)GBLA、GBLL 和 GBLS格式:GBLA/GBLL/GBLS 变量名说明:GBLA、GBLL和GBLS伪操作定义一个汇编程序中的全局变量并初始化。 其中:G

14、BLA定义一个全局数字变量,并初始化为0。GBLL 定义一个全局逻辑变量,并初始化为 F。GBLS 定义一个全局字符串变量,并初始化为空串。这3 条伪指令用于定义全局变量,因此在整个程序范围内变量名必须惟一。符号定义伪指令22例如:GBLA num1 ;定义一个全局的数字变;量,变量名为 num1numl SETA Oxabcd;将该变量赋值为OxabcdGBLL l2 ;定义一个全局的逻辑变;量,变量名为 l2l2 SETL FALSE ;将该变量赋值为假GBLS str3 ;定义一个全局的字符串变;量,变量名为 str3str3 SETS Hello!;将该变量赋值为 “Hello!”符号定义伪指令31(3)SETA、 SETL 和 SETS格式:变量名 SETA/SETL/SETS 表达式说明:SETA:给一个数字变量赋值。SETL:给一个逻辑变量赋值。SETS:给一个字符串变量赋值。 格式中的变量名必须为已经定义过的全局或局部变量,表达式为将要赋给变量的值。符号定义伪指令3-2例如:LCLA num1 ;定义一个局部的

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号