第7章 汇编语言程序设计_第1页
第7章 汇编语言程序设计_第2页
第7章 汇编语言程序设计_第3页
第7章 汇编语言程序设计_第4页
第7章 汇编语言程序设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1TM第第7章章汇编语言程序设计汇编语言程序设计本章主要介绍本章主要介绍ARM汇编语言程序设汇编语言程序设计规范,以及在汇编语言程序设计计规范,以及在汇编语言程序设计中所要注意的问题,最后以大量的中所要注意的问题,最后以大量的实例说明汇编语言程序设计方法。实例说明汇编语言程序设计方法。2TM2内容提要内容提要71 ARM编译环境下汇编语句编译环境下汇编语句72 GNU环境下汇编语句与编译说明环境下汇编语句与编译说明73 ARM汇编语言程序设计规范汇编语言程序设计规范74 ARM汇编语言程序设计实例解析汇编语言程序设计实例解析3TM371ARM编译环境下汇编语句编译环境下汇编语句nARM编译环境

2、下进行汇编语言程序设计的格编译环境下进行汇编语言程序设计的格式式n汇编语句中的符号规则汇编语句中的符号规则 4TM4 ARM编译环境下汇编语句格式编译环境下汇编语句格式ADS环境下环境下ARM汇编语句格式如下:汇编语句格式如下:nsymbol instruction;commentnsymbol directive;commentnsymbol pseudo-instruction;comment5TM5ARM编译环境下汇编语句中符号规则编译环境下汇编语句中符号规则1.符号命名规则符号命名规则(1)符号由大小写字母、数字、下划线组成,且符号是)符号由大小写字母、数字、下划线组成,且符号是区分大

3、小写的。区分大小写的。(2)局部标号可以用数字开头,其他的标号不能。)局部标号可以用数字开头,其他的标号不能。(3)符号在其作用范围内必须是唯一的。)符号在其作用范围内必须是唯一的。(4)程序中的符号不要与指令助记符或者伪操作同名。)程序中的符号不要与指令助记符或者伪操作同名。 6TM62.常量常量(1)十进制数,如)十进制数,如535、246。(2)十六进制数,如)十六进制数,如0 x645、0 xff00。(3)n_XXX, n表示表示n进制数,从进制数,从29,XXX是具体的数字。例是具体的数字。例如:如:8_3777(4)字符常量用一对单引号括起来,包括一个单字符或者标)字符常量用一对

4、单引号括起来,包括一个单字符或者标准准C中的转义字符。例如中的转义字符。例如A、n。(5)字符串常量由一对双引号以及由它括住的一组字符串组)字符串常量由一对双引号以及由它括住的一组字符串组成,包括标准成,包括标准C中的转义字符。中的转义字符。如果需要使用双引号如果需要使用双引号”或字符或字符$,则必须用,则必须用”和和$代替。代替。 7TM73.变量变量(1)数字变量)数字变量 数字变量表示的是一个数字变量表示的是一个32位数的整数,取值范围为位数的整数,取值范围为0232-1,作为有符号,作为有符号数时,取值范围是数时,取值范围是-231231-1(2)字符串变量)字符串变量 字符串变量最大

5、长度字符串变量最大长度512字节,最短为字节,最短为0字节。字节。(3)逻辑变量)逻辑变量 取值范围取值范围FALSE和和TRUE8TM汇编规则说明:汇编规则说明:p对数字变量来说,如果该变量前面有对数字变量来说,如果该变量前面有$字符,在汇编时编译器将该数字变量的数字符,在汇编时编译器将该数字变量的数 字转换成十六进制的串,然后用该十六进制串取代字转换成十六进制的串,然后用该十六进制串取代$字符后的变量。字符后的变量。p对于逻辑变量来说,如果该逻辑变量前面有一个对于逻辑变量来说,如果该逻辑变量前面有一个$字符,在汇编时编译器将该逻字符,在汇编时编译器将该逻 辑变量替换成她的取值辑变量替换成她

6、的取值,T或者或者F。p使用使用“.”来表示变量名称的结束来表示变量名称的结束例:例:GBLS string1GBLS DGBLA NUM1num SETA 0 x11223344D SETB “ARM9TDMI”String1 SETS “ABC$D$NUM”例:例:GBLS string1GBLS string2String2 SETS “AAA”string1 SETS “$string2.BBBCCC”9TM94.字符串表达式操作字符串表达式操作(1)取符串的长度)取符串的长度LEN语法格式:语法格式::LEN: A功能说明:返回字符串功能说明:返回字符串A的长度。的长度。10TM10

7、(2)CHR语法格式:语法格式::CHR: A 功能说明:将功能说明:将A(A为某一字符的为某一字符的ASCII值)转值)转换为单个字符。换为单个字符。11TM11(3)STR语法格式:语法格式::STR: A 功能说明:将功能说明:将A(A为数字量或逻辑表达式)转为数字量或逻辑表达式)转换成字符串。换成字符串。12TM12(4)LEFT语法格式:语法格式:A :LEFT: B 功能说明:返回字符串功能说明:返回字符串A最左端最左端B(B为返回长为返回长度)长度的字符串。度)长度的字符串。13TM13(5)RIGHT返回一个字符串最右端一定长度的字符串:返回一个字符串最右端一定长度的字符串:A

8、 :RIGHT: B功能说明:返回字符串功能说明:返回字符串A最右端最右端B(B为返回长为返回长度)长度的字符串。度)长度的字符串。14TM14(6)CC用于连接两个字符串,用于连接两个字符串,B串接到串接到A串后面:串后面:A :CC: B 15TM155.地址标号地址标号1)PC相关标号相关标号 表示程序计数器加减一个数值常数后得到的地址值,用来指明一个分支指令表示程序计数器加减一个数值常数后得到的地址值,用来指明一个分支指令的目标地址,或者访问嵌入到代码段中的一个数据项。的目标地址,或者访问嵌入到代码段中的一个数据项。 2)寄存器相关标号)寄存器相关标号 表示指定寄存器的值加减一个数值常

9、数后得到的地址值,常用于访问位于数据表示指定寄存器的值加减一个数值常数后得到的地址值,常用于访问位于数据段中的数据。段中的数据。3)绝对地址)绝对地址 一个一个32位的无符号数字常量,可寻址位的无符号数字常量,可寻址0232-116TM166.局部标号局部标号局部标号的语法格式如下:局部标号的语法格式如下:n routname17TM17被引用的局部标号语法规则是:被引用的局部标号语法规则是:n% F B A T n routnamen其中:其中:nn是局部标号的数字号。是局部标号的数字号。nroutname是当前局部范围的名称。是当前局部范围的名称。n%表示引用操作。表示引用操作。nF指示汇

10、编器只向前搜索。指示汇编器只向前搜索。nB指示汇编器只向后搜索。指示汇编器只向后搜索。nA指示汇编器搜索宏的所有嵌套层次。指示汇编器搜索宏的所有嵌套层次。nT指示汇编器搜索宏的当前层次。指示汇编器搜索宏的当前层次。 18TM1872GNU环境下汇编语句与编译说明nGNU环境下环境下ARM汇编语言程序设计主要是面汇编语言程序设计主要是面对在对在ARM平台上进行嵌入式平台上进行嵌入式LINUX的开发。的开发。 nGNU标准中提供了支持标准中提供了支持ARM汇编语言的汇编汇编语言的汇编器器as(arm-elf-as)、交叉编译器、交叉编译器gcc ld(arm-elf-gcc)和链接器和链接器ld(

11、arm-elf-ld)。 19TM19721 GNU环境下环境下ARM汇编语句格式汇编语句格式GNU环境下环境下ARM汇编语言语句格式如下:汇编语言语句格式如下:nlabel : instructioncommentnlabel :directivecommentnlabel : pseudo-instructioncomment20TM20722 GNU环境下环境下ARM汇编程序编译汇编程序编译(1) 预处理预处理nGNU汇编器汇编器as的内部预处理包括:移除多余的内部预处理包括:移除多余的间隔符代码中的所有注释,并将字符常量的间隔符代码中的所有注释,并将字符常量转换为数字值。它不作宏处理和

12、文件包含处转换为数字值。它不作宏处理和文件包含处理,但这些事情可以交由理,但这些事情可以交由gcc编译器去做,编译器去做,文件包含可以用文件包含可以用.include伪指令来实现。伪指令来实现。21TM21(2) 注释注释nGNU ARM Assembly可识别的注释方式有可识别的注释方式有:C风格多行注释符风格多行注释符/* . */或或GNU单行注释单行注释符符“”或或“#”。(3) 符号符号n与与C语言基本一致,符号名由字母、数字以语言基本一致,符号名由字母、数字以及及_、和、和.组成,大小写敏感。组成,大小写敏感。22TM222段与重定位段与重定位n链接器链接器ld用于把多个目标文件合

13、并为一个可用于把多个目标文件合并为一个可执行文件。汇编器执行文件。汇编器as生成的目标文件都假定生成的目标文件都假定从地址从地址0开始,开始,ld为其指定最终的地址。链接为其指定最终的地址。链接器器ld把目标文件中的每个把目标文件中的每个section都作为一个都作为一个整体,为其分配运行的地址整体,为其分配运行的地址 23TM2324TM243符号说明符号说明(1)labellable后面要带冒号后面要带冒号:,例如:,例如:_start: b reset_handler。25TM25(2)给符号赋值)给符号赋值 symbol_name=symbol_value 或或 .set symbol

14、_name,symbol_value 或或.equ symbol_name=symbol_value(3)符号名)符号名 可由数字、字母或可由数字、字母或“.”或或“_”组成,不可以数字组成,不可以数字开头,大小写敏感。开头,大小写敏感。26TM2673ARM汇编语言程序设计规范汇编语言程序设计规范n汇编器预定义的寄存器名称汇编器预定义的寄存器名称 nARM汇编语言程序设计规范汇编语言程序设计规范27TM27汇编器预定义的寄存器名称汇编器预定义的寄存器名称 28TM28ARM汇编语言程序设计规范汇编语言程序设计规范 n要提高软件质量必须降低编码阶段的错误率要提高软件质量必须降低编码阶段的错误率

15、,这需要制定详细的,这需要制定详细的软件编程规范软件编程规范,并培训,并培训每一位程序员,最终的结果可以把编码阶段每一位程序员,最终的结果可以把编码阶段的错误降至的错误降至10%左右,同时会大大的缩短测左右,同时会大大的缩短测试时间。试时间。 29TM29n1.符号命名规则符号命名规则n2注释注释n3程序设计的其它要求程序设计的其它要求30TM3074ARM汇编语言程序设计实例解汇编语言程序设计实例解n在嵌入式系统编程中,与硬件直接相关的最在嵌入式系统编程中,与硬件直接相关的最底层代码要用汇编语言来编写底层代码要用汇编语言来编写;n本节中所设计的实例,意在帮助读者对嵌入本节中所设计的实例,意在

16、帮助读者对嵌入式汇编语言程序设计打下坚实的基础,同时式汇编语言程序设计打下坚实的基础,同时也为嵌入式硬件底层编程做准备。也为嵌入式硬件底层编程做准备。 31TM例例1:32TM例例2:求一个数的阶乘(:求一个数的阶乘(64位结果)位结果)开始初始化R9:R8=20递减计数器R0=20备份R9至R1计算R0与R8相乘结果保存在R9:R8计算R0乘R1并加上进位保存在R9计数器R0减1R0=0?结束NOYES33TM33程序清单:程序清单:MOVR8 , #20低低32位初始化为位初始化为20MOVR9 , #0高位初始化为高位初始化为0SUBR0,R8,#1初始化计数器初始化计数器Loop:MO

17、VR1 , R9暂存高位值暂存高位值UMULLR8 , R9 , R0 , R8R9:R8=R0*R8MLAR9 , R1 , R0 , R9R9=R1*R0+R9SUBSR0 , R0 , #1计数器递减计数器递减BNELoop计数器不为计数器不为0继续循环继续循环Stop: B Stop.global _start.text_start:34TM例例3:先对内存地址:先对内存地址0 x3000开始的开始的100个字内存个字内存 单元填入单元填入0 x100000010 x10000064字数据,然后将每个字单元进行字数据,然后将每个字单元进行64位累加结果保存于位累加结果保存于R9:R8。

18、(。(R9中存放高中存放高32位)位)开始初始化起始地址R0初始化R1计数器R2R1写入R0R0递增计数器R2递减R2=0?初始化起始地址R0结果寄存器R9:R8计数器R2读取当前地址数据到R1R1与R8相加并影响标志位R9与0 x0带进位相加计数器R2递减R2=0?结束NYNY35TM35程序清单:程序清单:AREA Fctrl, CODE, READONLY ; 声明代码声明代码FctrlENTRY ; 标识程序入口标识程序入口CODE32 ; 声明声明32 位位ARM 指令指令STARTMOVR0 , #0X3000;初始化寄存器初始化寄存器MOVR1 , #0X10000001MOVR

19、2 , #100loop_1;第一次循环赋值第一次循环赋值STRR1 , R0,#4ADDR1 , R1,#1SUBSR2 , R2,#1BNEloop_136TM36MOVR0 , #0X3000MOVR2 , #100MOVR9 , #0MOVR8 , #0loop_2;第二次循环累加第二次循环累加LDRR1 , R0,#4ADDSR8 , R1,R8;R8=R8+R1,进位影响标志位进位影响标志位ADCR9 , R9 , #0;R9=R9+C,C为进位为进位SUBSR2 , R2 , #1BNEloop_2StopBStopEND;文件结束文件结束37TM例例4:初始化各:初始化各ARM

20、处理器各模式下的堆栈指针处理器各模式下的堆栈指针SP(R13). 38TM AREA Stack_Init ,CODE ,READONLY ENTRY CODE32START MRS R0,CPSR ;读取当前;读取当前CPSR BIC R0,R0,#MODEMASK ;清除模式位清除模式位 ;设置系统模式下的设置系统模式下的SP ORR R1,R0,#SYSMODE MSR CPSR_c,R1 LDR SP,=UserStack ;设置未定义模式下的设置未定义模式下的SP ORR R1,R0,#UNDEFMODE MSR CPSR_c,R1 LDR SP,=UndefStack ;设置中止模

21、式下的设置中止模式下的SP ORR R1,R0,#ABORTMODE MSR CPSR_c,R1 LDR SP,=AbortStack;设置管理模式下的;设置管理模式下的SP ORR R1,R0,#SVCMODE MSR CPSR_c,R1 LDR SP,=SvcStack;设置;设置IRQ模式下的模式下的SP ORR R1,R0,#IRQMODE MSR CPSR_c,R1 LDR SP,=IRQStack;设置;设置FIQ模式下的模式下的SP ORR R1,R0,#FIQMODE MSR CPSR_c,R1 LDR SP,=FIQStackStop B Stop END39TM例例5:用:

22、用ARM指令实现内存数据区块拷贝操作,内存数据区定义如下:指令实现内存数据区块拷贝操作,内存数据区定义如下:Src: .long 1,2,3,4,5,6,7,8,9,0 xA,0 xB,0 xC,0 xD,0 xE,0 xF,0 x10,0 x11,0 x12Dst: .long 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0, 0,0请用请用ARM汇编语言编写程序,实现将数据从源数据区汇编语言编写程序,实现将数据从源数据区Src(18个字单元)拷个字单元)拷贝到目标数据区贝到目标数据区Dst,要求以,要求以4个字为单位进行块拷贝,如果不足个字为单位进行块拷贝,如果不足4个字时则个字时则以字为单位进行拷贝。以字为单位进行拷贝。40TMNUM EQU 18 AREA Copy_Data ,CODE ,READONLY ENTRY CODE32 START LDR R0,=Src LDR R1,=Dst MOV R2,#NUM MOV SP,#0 x9000 MOVS R3,R2,LSR #2 BEQ Copy_Words STMFD SP!,R5-R8Copy_4Words LDMIA R0!,R5-R8 STMIA R1!R5-R8 SUBS R3,R3,#1 BNE Copy_4Words

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论