arm汇编语言程序设计ppt课件

上传人:bin****86 文档编号:54847752 上传时间:2018-09-20 格式:PPT 页数:66 大小:116KB
返回 下载 相关 举报
arm汇编语言程序设计ppt课件_第1页
第1页 / 共66页
arm汇编语言程序设计ppt课件_第2页
第2页 / 共66页
arm汇编语言程序设计ppt课件_第3页
第3页 / 共66页
arm汇编语言程序设计ppt课件_第4页
第4页 / 共66页
arm汇编语言程序设计ppt课件_第5页
第5页 / 共66页
点击查看更多>>
资源描述

《arm汇编语言程序设计ppt课件》由会员分享,可在线阅读,更多相关《arm汇编语言程序设计ppt课件(66页珍藏版)》请在金锄头文库上搜索。

1、1,第4章 汇编语言程序设计,本章主要内容: 1、ARM和Thumb汇编语言程序 2、汇编语言与C语言 3、混合编程技术 4、汇编语言程序的汇编、运行、调试。,2,ARM程序的源文件: 1、汇编语言源文件 .s ; 扩展名 .s 2、C语言源文件 .c ;扩展名 .c 3、C+源文件 .cpp ;扩展名 .cpp 4、头文件 .h ;扩展名 .h 5 、引入文件 .inc ;扩展名 .inc ARM程序的源文件是文本格式的文件,可以使用简单的文本编辑器或者其他的编程开发环境进行编辑。 例 ads1。2 edit word 等编辑程序。,4.1 汇编语言源程序格式 p93,3,Arm源程序汇编连

2、接过程:,例 armasm hello.sarmlink hello.o -o hello.axfarmsd -exec hello.axf ; 执行之,armcc -g hello.s -o hello.axf,4,4.1.1 汇编语言程序的结构 p93,在ARM(Thumb)汇编语言程序中,以程序段为单位组织代码。 段是相对独立的指令或数据序列,具有特定的名称。 段分为代码段和数据段,代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。 一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映象文件。在汇编语言程序中

3、,用AREA伪指令定义一个段,并说明所定义段的相关属性.,5,多个代码段的情况,一个源文件只能含一个代码段并单独编译,多个代码段分别编译最后连接成映象文件。,可执行映象文件的构成:一个或多个代码段,代码段的属性为只读。零个或多个包含初始化数据的数据段,数据段的属性为可读写。零个或多个不包含初始化数据的数据段,数据段的属性为可读写。,6,CODE32 ; 32位的ARM指令段 ;CODE16 16位的 thumb指令段AREA codesec, CODE, READONLY ;定义属性;代码段,名称为codesec,属性为只读 main PROC ;函数mainSTMFD sp!,lr ;返回地

4、址入栈 /调用main函数指令的下一条指令的地址;保存必要的寄存器和返回地址到数据栈ADR r0,strhello ;取标签strhello代表的地址值BL _printf ;下一条指令地址送lr,转_printf;调用C运行时库的_printf函数打印 “Hello world!”字符串BL welcomefun ;调用子函数welcomfunLDMFD sp!,pc ;恢复寄存器值;返回主程序,7,Strhello ;strhello代表本地字符串的地址DCB “Hello world!n0“ ;定义一段字节空间ENDP ;函数main结束 welcomefun ;子函数welcomfun

5、STMFD sp!,lr ;保存必要的寄存器和返回地址到数据栈ADR r0,adrstrarm ;取adrstrarm的地址放到寄存器r0中LDR r0,r0,#0 ;将adrstrarm的值放到r0中BL _printf ;调用C运行时库的_printf函数打印 ; “Welcom to ARM world!”字符串LDMFD sp!,pc ;恢复寄存器值,8,Adrstrarm ;adrstrarm标签DCD strarm ;保存strarm的地址AREA constdatasec, DATA, READONLY,ALIGN=0 ;数据段,名称为constdatasec, 属性为只读 st

6、rarmDCB “Welcome to ARM world!n0“ ;存放“Welcome to ARM world!”字符串EXPORT main ;导出main函数供外部调用;引入三个C运行时库函数和ARM库IMPORT _main IMPORT _mainIMPORT _printfIMPORT |Lib$Request$armlib|, WEAKEND ;程序结束编译连接运行:编译连接运行.rtf,9,4.1.2 汇编语言行的构成 ARM/Thumb汇编语言程序的语句由4部分组成 : 标签 指令/伪操作/伪指令 操作数 ;语句的注释 例:welcomefun STMFD sp!, lr

7、 ;strarm DCB “Welcome to ARM world!n0” ;Labeladd add r0,r0,r1 ; Str1 SETS “This is a string.” BKPT ;断点 标签: welcomefun , strarm , Labeladd, Str1 指令/伪操作/伪指令: STMFD , DCB , add , SETS 操作数:其他部分,10,注意: ARM程序中,指令、伪指令、伪操作、寄存器助记符可以全部为大写或小写,但大小写不能混合使用。,ARM程序中的符号 符号包括变量、标号、局部标号和数字常量,符号是变量、标号时又代表其地址。 符号命名规则:由大

8、小写字母、数字和下划线组成,且字母区分大小写。 除局部标号以数字开头外,其他符号不能以数字开头。符号不能与助记符重名,且在其作用范围内唯一。符号一般以字母开头,由字母、数字、下划线组成。 例:a12 x1 x2 注意如果符号与ARM指令的指令名称或者伪操作名称同名时,可以用双竖线把符号括起来.如:|add|,11,汇编语言程序的语句4个组成部分,1 、标签 标签是一个符号,可以代表:指令的地址(标号)变量、数据的地址(变量名)LCLA、LCLL和LCLS 定义局部量GBLA、GBLL和GBLS定义全局量DCB DCW DCD ect 定义数据地址,标号 标号代表可执行语句地址。标号按其作用域可

9、分为段内标号和和段外标号: 段内标号的地址值在汇编时确定。例 welcomefun 段外标号的地址值在链接时确定。例 EXPORT main 段外调用:BL main,12,注意:p96,(1)基于pc的标号 / 程序相对寻址 /段内标号常用于表示转移目标地址,位于将要跳转到的指令之前,汇编时被处理成pc值加减一个常量。 例: loop SUBS r0,r0,#1 ;每次循环使r0=r0-1BNE loop ;跳转到01标号去执行 (2)基于寄存器的标号 通常用MAP和FIELD伪操作定义之。汇编时被处理成寄存器的值加减一个常量。MAP 0xF10000;定义结构化内存表 count FIEL

10、D 4 x FIELD 4 y FIELD 4,13,局部标号:,用于局部范围的代码,由数字0-99(N)和一个表示该局部标号作用范围的字符组成。 语法格式:Nroutname ; 例:01NAME Routname由ROUT伪操作定义其作用范围。 局部标号引用格式: 例:BNE %B 01NAME F|BA|T Nroutname 其中: % 表示局部标号引用操作 F 指示编译器只向前搜索 forward ;默认 B 指示编译器只向后搜索 backward A 指示编译器搜索宏的所有嵌套层次 ; T 指示编译器搜索宏的当前层 ;A、T缺省,从当前层搜索到最高层,14,使用局部标号的例子:,例

11、2 作用范围字符为NAME ROUT NAME; NAME作用范围 01NAME SUBS r0,r0,#1 ;每次循环使r0=r0-1BNE %B 01NAME ;跳转到01NAME标号去执行。 02NAME LDR R0,R1; NAME作用范围ROUT NEXT。,例1 无作用范围字符 01 SUBS r0,r0,#1 ;每次循环使r0=r0-1BNE %B 01 ;跳转到01标号去执行,15,2 、指令/伪操作/伪指令p96,指令: 表示ARM的处理器执行的操作。 伪操作:由汇编程序处理的操作,为程序的汇编做准备。 伪指令:汇编时被替换成机器指令,在程序执行时被执 行。例:ADR 、A

12、DRL 、LDR、 NOP伪指令。,16,3、操作数 p97,伪操作、伪指令中的操作数可以是一个常量、变量或一个由常量、符号和操作符组成的表达式。,(1)常量程序中的常量是指其值在程序的运行过程中不能被改变的量。 类型:a、数字常量 数字常量有3种表示方式: 十进制数, 如 1、2、123 十六进制数, 如 0x123,0xabc n进制数,形式为#n_XXX,n的范围是2到9,XXX是具体数字。 如 #2_1010,17,B、字符、字符串常量 字符常量:由单引号及中间的字符组成,包括C语言中的转义字符。 如 a , n 字符串常量:由双引号及中间的字符串组成,包括C语言中的转义字符。 如 “

13、abcdef0xarn”,转义字符,18,C、逻辑常量TRUE , FALSE 注意带大括号,(2)变量变量类型:数字变量、逻辑变量和串变量。GBLA GBLL GBLS和LCLA LCLL LCLS分别定义全局、局部的数字变量、逻辑变量和串变量。SETA SETL STES 为其赋值。,19,汇编程序的变量代换 p97, $字符串变量在字符串变量的前面有一个$字符,在汇编时编译器将用该字符串变量的内容代替该串变量。例 $str1 ; 取其内容 例1:LCLS str1 ;定义局部串变量LCLS str2str1 SETS “book” ;赋值str2 SETS “It is a $str1”

14、 ;赋值则在汇编后,str2的值为”It is a book”。,20, $数字变量在数字变量前面加“$”,编译器会将该数字变量的值转换为十六进制的字符串。 例如: No1 SETA 10 ;No1 数字变量 Str1 SETS “The number is $No1”则汇编后Str1的值为”The number is 0000000A”., “$”字符 加入到字符串 遇到“$” ,编译器将不进行变量代换,而是把“$”看作一个“$” 。 例如: Str SETS “The character is $”则编译后Str字符串的值为”The character is $”,21, 变量名 .使用“

15、.”表示字符串中变量名的结束。 str2 SETS “$num1.ccc” ;变量名是num1num1是数字变量。str2的内容为:num1的内容转换成十六进制数后拼接ccc。 |$|一般的,在两个 | 之间的“$”并不进行变量的代换,但如果 | 在双引号内,则将进行变量代换。,22,综合 实例p98,AREA |.text|, CODE, READONLY ;代码段,名称为|.text|,属性为只读 GBLS str1 ;声明str1为全局字符串变量 GBLS str2 ;声明str2为全局字符串变量 GBLL ll ;声明l1为全局逻辑变量 GBLA num1 ;声明num1为全局数字变量 ll SETL TRUE num1 SETA 0x4f str1 SETS “bbb“ Str2 SETS “aaa str1:$str1. l1:$l1,a1:$num1.ccc”;str2包含了多个变量 编译被替换后的Str2 :aaa str1:bbb l1:T,a1:0000004Fccc,

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

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

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