版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章ARM汇编语言程序设计 1整理课件教学目的掌握汇编语言程序的基本结构掌握ARM汇编器的伪操作掌握汇编语言程序的上机过程 2整理课件教学内容4.1汇编语言程序格式4.2 ARM汇编器的伪操作4.3汇编语言程序的上机过程4.4汇编语言程序设计4.5工作模式切换编程4.6常用的使用规则4.7 ARM和Thumb混合编程4.8汇编语言和C语言交互编程3整理课件4.1汇编语言程序格式4.1.1汇编语言的基本概念4.1.2汇编语言源程序的组成4.1.3汇编语言程序中常用的符号4.1.4汇编语言程序中的表达式和运算符4整理课件4.1.1汇编语言的基本概念5整理课件4.1.2汇编语言源程序的组成1汇编语
2、言源程序的结构 AREA Init,CODE,READONLY ENTRY Start LDR R0,=0 x3FF5000 LDR R1,#0 xFF STR R1,R0 LDR R0,=0 x3FF5008 LDR R1,#0 x01 STRR1,R0 END6整理课件程序段段是相对独立的指令或数据序列,具有特定的名称。代码段数据段通用段段具有一定的属性。READONLYREADWRITE7整理课件2汇编语言的语句格式LABEL OPERATION OPERAND ;COMMENT 标号域 操作助记符域 操作数域 注释域 Start MOV R0,0 x3F ;将立即数传送到寄存器R0 8
3、整理课件(1)标号域(Label)标号域用来表示指令的地址、变量、过程名、数据的地址和常量。标号是一个自行设计的标识符或名称,语句标号可以是大小写字母混合,通常以字母开头,由字母、数字、下划线等组成。 语句标号不能与寄存器名、指令助记符、伪指令(操作)助记符、变量名同名。 语句标号必须在一行的开头书写,不能留空格。 9整理课件(2)操作助记符域(OPERATION)操作助记符域可以为指令、伪操作、宏指令或伪指令的助记符。 ARM汇编器对大小写敏感,在汇编语言程序设计中,每一条指令的助记符可以全部用大写、或全部用小写,但不允许在一条指令中大、小写混用。 所有的指令都不能在行的开头书写,必须在指令
4、的前面有空格,然后再书写指令。 指令助记符和后面的操作数或操作寄存器之间必须有空格,不可以在这之间使用逗号。10整理课件(3)操作数域(OPERAND) 操作数域表示操作的对象,操作数可以是常量、变量、标号、寄存器名或表达式,不同对象之间必须用逗号“,”分开。 11整理课件课堂练习 判断指令格式正误AREA EX3,CODE,READONLYGBLA DATA DATA SETA 0 x20 ADD R0,R1,R2 ADD R0,R1,r2 add R0,R1,r2 Add R0,R1,r2 前面必须有空格前面必须有空格DATA变量名前面不能留空格全部大写,正确寄存器小写,正确指令助记符小写
5、,寄存器大写或小写,正确寄存器小写,正确;指令助记符大小写混合,不正确12整理课件4.1.3汇编语言程序中常用的符号在汇编语言程序设计中,经常使用各种符号表示变量、常量和地址符号由大小写字母、数字以及下划线组成。 符号区分大小写,同名的大、小写符号会被编译器认为是两个不同的符号。 符号在其作用范围内必须唯一,即在其作用范围内不可有同名的符号。 自定义的符号名不能与系统的保留字相同。 符号名不应与指令或伪指令同名。13整理课件1程序中的变量变量的类型:数值变量逻辑变量字符串变量作用范围:全局变量局部变量 14整理课件2程序中的常量ARM(Thumb)汇编程序所支持的常量有数值常量、逻辑常量和字符
6、串常量。 数值常量一般为32位的整数,当作为无符号数时,其取值范围为0232-1,当作为有符号数时,其取值范围为-231231-1。在ARM汇编语言中,使用EQU来定义数 值常量。数值常量一经定义,其数值就不能再修改。 15整理课件数值常量有下列表示方式: 十进制数:在表达式中可以直接表达。如1、2、345。 十六进制数:有两种表达方法,使用前缀0 x,如0 x003、0 x001C,或使用前缀&,如&10F、&134。这两种方法都是等效的。n进制数:形如n_XXX,其中n的范围是2到9,XXX是具体数值。如: 8_247表示一个八进制数。 ASCII的表示:有些值可以使用ASCII表达,例如
7、:A表达A的ASCII码。指令: MOV R1,#B 等同于 MOV R1,#0 x42。16整理课件逻辑常量只有两种取值情况:TRUE和FALSE,注意带大括号。字符串常量为一个固定的字符串,一般用于程序运行时的信息提示。字符常量由单引号表示,包括C语言中的转义字符,如n。字符串常量用双引号表示,也包括C语言中的转义字符如“abcd0 xcr” 。17整理课件4.1.4汇编语言程序中的表达式和运算符数值表达式逻辑表达式字符串表达式表达式中各元素运算次序的优先级如下:括号运算符的优先级最高。相邻的单目运算符的运算顺序为从右到左,单目运算符的优先级高于其它运算符。优先级相同的双目运算符的运算顺序
8、为从左到右。18整理课件4.2 ARM汇编器的伪操作区别:指令伪指令伪操作19整理课件4.2 ARM汇编器的伪操作4.2.1符号定义伪操作4.2.2数据定义伪操作4.2.3汇编控制伪操作4.2.4信息报告伪操作4.2.5其它常用的伪操作20整理课件4.2.1符号定义伪操作符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操。常见的符号定义伪操作有如下几种:GBLA、GBLL、GBLSLCLA、LCLL和LCLSSETA、SETL、SETS21整理课件1. 全局变量声明GBLA、GBLL和GBLS格 式:GBLA(GBLL或GBLS)全局变量名功 能:GBLA、GBL
9、L和GBLS伪操作用于定义一个ARM程序中的全局变量,并将其初始化。其中: GBLA: 定义一个全局的数值变量,并初始化为0 GBLL: 定义一个全局的逻辑变量,并初始化为F GBLS:定义一个全局的字符串变量,并初始化为空 由于以上三条伪操作用于定义全局变量,因此在整个程序范围内变量名必须唯一。22整理课件例 4.7 使用示例 GBLA A1 ; 定义一个全局的数值变量,变量名为A1 A1 SETA 0 x0F ;将该变量赋值为0 x0F GBLL A2 ;定义一个全局的逻辑变量,变量名为A2 A2 SETL TRUE ;将该变量赋值为真 GBLS A3 ;定义一个全局的字符串变量,变量名为
10、A3 A3 SETS “Testing” ;将该变量赋值为“Testing”23整理课件2. LCLA、LCLL和LCLS格 式:LCLA(LCLL或LCLS)局部变量名功 能:LCLA、LCLL和LCLS伪操作用于定义一个ARM程序中的局部变量,并将其初始化。其中: LCLA:定义一个局部的数值变量,并初始化为0 LCLL:定义一个局部的逻辑变量,并初始化为F LCLS:定义一个局部的字符串变量,并初始化为空以上三条伪操作用于声明局部变量,在其作用范围内变量名必须唯一。24整理课件例 4.8 使用示例: LCLA Test4 ;声明一个局部的数值变量,变量名为Test4 Test4 SETA
11、 0 xaa ;将该变量赋值为0 xaa LCLL Test5 ;声明一个局部的逻辑变量,变量名为Test5 Test5 SETL TRUE ;将该变量赋值为真 LCLS Test6 ;定义一个局部的字符串变量,变量名为Test6 Test6 SETS “Testing” ;将该变量赋值为“Testing”25整理课件3. SETA、SETL和SETS 格 式:变量名SETA(SETL或SETS)表达式 功 能:伪操作SETA、SETL、SETS用于给一个已经定义的全局变量或局部变量赋值。SETA:给一个数值变量赋值;SETL:给一个逻辑变量赋值;SETS:给一个字符串变量赋值; 其中,变量名
12、为已经定义过的全局变量或局部变量,表达式为将要赋给变量的值。26整理课件例 4.9 使用示例: LCLA Test3 ;声明一个局部的数值变量,变量名为Test3 Test3 SETA 0 xaa ;将该变量赋值为0 xaa LCLL Test4 ;声明一个局部的逻辑变量,变量名为Test4 Test4 SETL TRUE ;将该变量赋值为真27整理课件4.2.2数据定义伪操作 DCB DCW(DCWU) DCD(DCDU) DCDO DCI DCQ(DCQU) DCFS(DCFSU) DCFD(DCFDU) SPACE FIELD MAP LTORG28整理课件1. DCB格 式:标号DCB
13、 表达式功 能:DCB伪操作用于分配一片连续的字节存储单元并用伪操作中指定的表达式初始化。其中,表达式可以为0255的数值或字符串。DCB也可用“=”代替 29整理课件2. DCW(DCWU)格 式:标号DCW(或DCWU)表达式 功 能:DCW(或DCWU)伪操作用于分配一片连续的半字存储单元并用伪操作中指定的表达式初始化。其中,表达式可以为程序标号或数值表达式。用DCW分配的字存储单元是半字对齐的,而用DCWU分配的字存储单元并不严格按照半字对齐。30整理课件3. DCD(或DCDU)格 式:标号DCD(或DCDU)表达式功 能:DCD(或DCDU)伪操作用于分配一片连续的字存储单元并用伪
14、操作中指定的表达式初始化。其,表达式可以为程序标号或数值表达式。DCD也可用“&”代替。用DCD分配的字存储单元是字对齐的,而用DCDU分配的字存储单元并不严格按照字对齐。 31整理课件使用示例: Str DCB “This is a test!” ;分配一片连续的字节存储单元并初始化。DataTest DCW 1,2,3 ;分配一片连续的半字存储单元并初始化。DataTest DCD 4,5,6 ;分配一片连续的字存储单元并初始化。32整理课件4.2.3汇编控制伪操作IF、ELSE、ENDIFWHILE、WENDMACRO、MEND、MEXIT33整理课件4.2.4信息报告伪操作 ASSER
15、T INFO OPT TTL、SUBT34整理课件4.2.5其它常用的伪操作AREAALIGNCODE16、CODE32ENTRYENDEQUEXPORT(或GLOBAL)IMPORTEXTERNGET(或INCLUDE)INCBINRNROUT35整理课件1.AREA格 式:AREA 段名 属性1,属性2,功 能:AREA伪操作用于定义一个代码段、数据段或特定属性的段。其中,段名若以数值开头,则该段名需用“|”括起来,如|1_test|,用C的编译器产生的代码一般也用“|”括起来。属性字段表示该代码段(或数据段)的相关属性,多个属性用逗号分隔。36整理课件 例 4.28 使用示例: AREA
16、 Init,CODE,READONLY ;定义段Init,代码段,只读 ENTRY ;程序入口 ;指令序列 B START1 AREA STOCK,DATA,READWRITE ;定义段STOCK,数据段,读/写 SAVE SPACE 20 ;分配数据空间 AREA Init,CODE,READONLY ;定义段Init,代码段,只读 START1 ADD R1,R2,R3 ;指令序列 B START1 37整理课件 CODE16、CODE32格 式:CODE16(或CODE32)功 能:CODE16伪操作通知编译器,其后的指令序列为16位的Thumb指令。 CODE32伪操作通知编译器,其后
17、的指令序列为32位的ARM指令。38整理课件 例 4.31 使用示例: AREA Init,CODE,READONLY CODE32 ;通知编译器其后的指令为32位的ARM指令 LDR R0,=NEXT1 ;将跳转地址放入寄存器R0 BX R0 ;程序跳转到新的位置执行, ;并将处理器切换到Thumb工作状态 CODE16 ;通知编译器其后的指令为16位的Thumb指令NEXT LDR R3,=0 x3FF END ;程序结束39整理课件 ENTRY格 式:ENTRY功 能:ENTRY伪操作用于指定汇编程序的入口点。一个程序可由一个或多个源文件组成,一个源文件由一个或多个程序段组成。一个程序至
18、少有一个入口,在只有一个入口时,编译程 序会把这个入口的地址定义为系统复位后的程序的起始点。 例 4.32 使用示例: AREA Init,CODE,READONLY ENTRY ;指定应用程序的入口点 40整理课件 END格 式:END功 能:END伪操作用于通知编译器已经到了源程序的结尾。 例 4.33 使用示例: AREA Init,CODE,READONLY END ;指定应用程序的结尾41整理课件 EQU格 式:名称 EQU表达式,类型 功 能:EQU伪操作用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的define。例 4.34 使用示例: Test EQU 50
19、 ;定义标号Test的值为50 Addr EQU 0 x55,CODE32 ;定义Addr的值为0 x55,且该处为32位的ARM指令。42整理课件 EXPORT(或GLOBAL)格 式:EXPORT 标号 ,WEAK功 能:EXPORT伪操作用于在程序中声明一个全局的标号,该标号可在其它的文件中引用。 例 4.35 使用示例: AREA Init,CODE,READONLY EXPORT Stest ;声明一个可全局引用的标号Stest END43整理课件IMPORT格 式:IMPORT 标号 ,WEAK 功 能:IMPORT伪操作用于通知编译器要使用的标号在其它的源文件中定义,但要在当前源
20、文件中引用,而且无论当前源文件是否引用该标号,该标号均会被加入到当前源文件的符号表中。标号在程序中区分大小写。44整理课件例 4.36 使用示例: AREA Init,CODE,READONLY IMPORT Main END通知编译器当前文件要引用标号Main,但Main在其它源文件中定义45整理课件 GET(或INCLUDE)格 式:GET 文件名功 能:GET伪操作用于将一个源文件包含到当前的源文件中,并将被包含的源文件在当前位置进行汇编处理。可以使用INCLUDE代替GET。例 4.38 使用示例: AREA Init,CODE,READONLY GET a1.s ;通知编译器当前源文
21、件包含源文件a1.s GET C:a2.s ;通知编译器当前源文件包含源文件C:a2.s END46整理课件 INCBIN格 式:INCBIN 文件名功 能:INCBIN伪操作用于将一个目标文件或数据文件包含到当前的源文 件中,被包含的文件不作任何变动地存放在当前文件中,编译器从其后开始继续处理。47整理课件 例 4.39 使用示例: AREA Init,CODE,READONLY GET a1.s INCBIN C:a2.txt END 分析:使用GET包含文件时,由于必须对包含文件进行编译,所以被包含的文件只能是源文件。而使用INCBIN包含文件时,可以是其它类型的文件。;通知编译器当前源
22、文件包含文件a1.s,并编译;通知编译器当前源文件包含文件c:a2.txt,不编译48整理课件RN格 式:名称 RN 表达式功 能:RN伪操作用于给一个寄存器定义一个别名。采用这种方式可以方便程序员记忆该寄存器的功能。其中,名称为给寄存器定义的别名,表达式为寄存器的编码。 例 4.40 使用示例: Temp RN R0 ;将R0定义一个别名Temp 49整理课件4.3.1汇编语言上机环境50整理课件4.3.2编辑汇编语言源程序 1建立工程文件 51整理课件 2编辑源文件 52整理课件 3添加源文件 53整理课件4.3.3编译连接源程序在编译连接之前还需要通过Debug Settings 对话框
23、对项目的运行环境进行一些设置。这里采用默认设置。编译时可以通过Project compile对源文件进行编译,然后再连接。但 是比较简便的做法是直接单击工程窗口的Make图标按钮。54整理课件55整理课件4.3.4调试汇编程序56整理课件57整理课件课堂练习假设Str的地址为:8008,有如下伪操作,试画出内存中数据的分布示意图。58整理课件59整理课件内存中的数据分布图60整理课件思考题一1.在具有多个ENTRY的源代码中,ADS中如何设置程序的入口?2.P202 第11题61整理课件教学内容4.4程序设计4.4.1程序设计步骤4.4.2简单程序设计4.4.3分支程序设计4.4.4循环程序设
24、计4.4.5子程序设计62整理课件4.4.1 程序设计步骤分析题目确定算法。合理分配存储空间和寄存器根据算法画出程序框图根据框图编写程序上机调试程序63整理课件1.分析题目与确定算法算法:解决实际问题的数学模型相同的问题有不同的算法实现不同的算法在运行速度,占据的空间不同64整理课件2.合理分配存储空间和寄存器合理地为原始数据,中间结果以及最终结果安排存储空间原则: 够用就好,不浪费空间,不定义多余变量,变量名合乎常规,增强可读性。65整理课件3.画出程序的流程图矩形框:功能模块菱形框:分支判断椭圆框:程序的开始或结束圆框:流程图之间的连接箭头:处理流程圆圈:连接流程图某个处理66整理课件67
25、整理课件4.根据流程图编制语句条条大路通罗马!简洁明了,必要的注释不要出现绝对地址注意中英文字符,全角半角,各种数制对齐问题68整理课件5.汇编调试程序ADS进行汇编、连接AXD进行调试69整理课件6.判断程序质量的标准程序执行的时间程序所占用的内存字节数程序的语句行数70整理课件4.4.2 简单程序设计 71整理课件 例 4.41 已知32位变量X、Y存放在存储器的地址 0 x90010、0 x90014中,要求实现ZX+Y,其中Z的值存放在0 x90018中。 72整理课件分析过程示意图?存储器、寄存器的分配?地址索引?关键指令?代码编写?73整理课件AREA EX4_41,CODE,RE
26、ADONLY ENTRY CODE32 START LDR R0,=0 x90010 ;变量X的地址送入R0 LDR R1,R0,#4 ;变量X的值读入R1 LDR R2,R0,#4 ;变量Y的值读入R2 ADD R1,R1,R2 ;X+Y结果存入R1 STR R1,R0 ;结果存入Z中 B START END代码编写74整理课件4.4.3 分支程序设计75整理课件1 简单分支的实现结构相当于C语言中的如下结构:IF( )76整理课件例4.42 已知32位有符号数X存放在存储器的地址0 x90010中。 要求实现:其中Y的值存放在0 x90010中。 77整理课件流程图78整理课件汇编程序实现
27、START LDR R1,=0 x90010 MOV R0,#0 LDR R2,R1 CMP R2,#0 SUBLT R2,R0,R2 STR R2,R1 79整理课件2 二分支结构相当于C语言中的如下结构: IF( ) ELSE 80整理课件3 多分支结构相当于C语 言程序的switch结构 main( int x) switch(x) case 0: return method_0(); case 1: return method_1(); case 2: return method_2(); case 3: return method_3(); default: return metho
28、d_d(); 81整理课件4.4.4 循环程序设计1.循环程序的组成(1)置循环初值部分(2)循环体(3)循环修改部分(4)循环控制部分82整理课件2. 循环的控制方法计数控制减数循环增数循环条件控制 83整理课件(1) 计数控制减数循环: 先将循环次数n送入循环计数器中,然后,每循环一次,计数器减1,直至循环计数器中的内容为0时结束循环84整理课件 MOV Rn,#N ;循环初值部分 LOOPA: ;循环体 SUBS Rn,Rn,#1 ;修改部分 BGT LOOPA ;控制部分 85整理课件 增数循环: 先将0送入循环计数器中,然后每循环一次,计数器加1,直到循环计数器的内容与循环次数n相等
29、时退出循环。 MOV Rn,#0 ;置循环初值部分 LOOPA: ;循环体 ADD Rn,Rn,#1 ;修改部分 CMP Rn,#N BNELOOPA ;控制部分 86整理课件 (2)条件控制循环次数事先无法确定,但它与问题的某些条件有关。这些条件可以通过指令来测试。若测试比较的结果表明满足循环条件,则继续循环,否则结束循环。87整理课件3 . 单重循环程序设计 (1)循环次数已知的循环程序设计通常采用计数控制方法来实现循环。(2)最大循环次数未知的循环程序设计常用条件来控制循环。88整理课件例 4.45 编制程序使S1233445N(N+1),直到N等于10为止。 AREA EX4_45,C
30、ODE,READONLY ENTRY CODE32 . END (1)循环次数已知的循环程序设计89整理课件流程图90整理课件分析过程算法功能:相邻数相乘 MUL累加 ADD循环次数:10 CMP B指令初始值 S=1 N N+1 部分和N(N+1)91整理课件寄存器分配R0: S 1 R0+R3得S值R1:N的初始值 2 循环变量R2:N+1 由R1=1求得R3:N(N+1) 92整理课件93整理课件4. 多重循环程序设计 多重循环即循环体内嵌套有循环。 设计多重循环程序时,可以从外层循环到内层循环一层一层地进行。通常在设计外层循环时,仅把内层循环看成一个处理粗框,然后 再将该粗框细化,分成
31、置初值、工作、修改和控制四个组成部分。当内层循环设计完之后,用其替换外层循环体中被视为一个处理粗框的对应部分,这样就构成了一个多重循环。94整理课件95整理课件汇编程序分析方法逆向工程流程图法图示法数据流法程序调试法96整理课件流程图法97整理课件作用从整体上把握程序结构将程序的功能模块化98整理课件图示法简单明了,直观反映了问题寄存器中的数据变化存储器中的数据变化99整理课件数据流法将数据代入程序,模拟程序运行,“走程序”,如果是假设的数据,一定要合理。结合图示法,将内存分配图,相关的寄存器画出,特别注意地址指针的变化,计数器的变化。100整理课件程序调试法利用调试程序如:AXD必须熟读程序
32、先根据指令估计一下结果,再用执行指令验证,如吻合则继续调试,否则分析原因切忌盲目地将所有指令执行一遍101整理课件综合举例:流程图分析法例 4.47 在以BUF为首址的字存储区中存放有10个无符号数 0 x0FF,0 x00, 0 x40, 0 x10, 0 x90,0 x20,0 x80,0 x30,0 x50,0 x70,0 x60 , 现需将它们按从小到大的顺序排列在BUF存储区中,试编写其程序。102整理课件步骤:1.分析程序的结构找出程序的变量,初步分析变量(寄存器)的含义、关键指令。2.由源程序导出程序的流程图3.根据流程图分析各个模块4.抽象出程序的功能103整理课件1.分析结构
33、,列出寄存器寄存器作用:存放要处理的数据存放结果计数循环变量的初值关键指令104整理课件源程序如下: N EQU 10 AREA EX4_47,CODE,READONLY ENTRY CODE32 START LDR R0,=BUF MOV R1,#0 MOV R2,#0105整理课件 LOOPI ADD R3,R0,R1,LSL #2 MOV R4,R3 ADD R2,R1,#1 MOV R5,R4 LDR R6,R4 LOOPJ ADD R5,R5,#4 LDR R7,R5 CMP R6,R7 BLT NEXT SWP R7,R6,R5 MOV R6,R7 106整理课件 NEXT ADD
34、 R2,R2,#1 CMP R2,#N BLT LOOPJ SWP R7,R6,R3 ADD R1,R1,#1 CMP R1,#N-1 BLT LOOPI B START 107整理课件 AREA BlockData, DATA, READWRITE BUF DCD 0 x0FF,0 x00,0 x40,0 x10,0 x90, 0 x20, 0 x80,0 x30,0 x50,0 x70 END108整理课件第一遍浏览程序寄存器分配: R0: R1: R2: R3: R4: R5: R6: R7:关键指令: LDR MOV ADD CMP BLT SWP常量、符号、标号:N START LO
35、OPI LOOPJ NEXT BUF109整理课件2. 导出程序的流程图1).找出标号2).找出比较、转移语句3).模块化110整理课件模块化STARTLOOPILOOPJ BLT NEXTNEXT BLT LOOPJ BLT LOOPI B START111整理课件112整理课件流程图R1R2113整理课件3.结合图示法、数据流法分析各个模块需要进一步细化的问题:各子模块的功能转移指令在什么条件下转移,这些条件又是受什么影响而变化的?关键指令的含义? 勤于查书!各个寄存器的作用,变量的作用114整理课件各寄存器的作用R0:用来指示缓冲区初始地址R1:外循环计数器R2:内循环计数器R3:外循环
36、地址指针R4:内循环地指针R5:内循环下一个数地址指针R6:存放内循环一轮比较的最小值R7:存放内循环取出的下一个比较值115整理课件4.抽象出程序的功能实现冒泡排序的功能程序运行的结果如下: 00H,10H,20H,30H,40H,50H,70H,80H,90H,0FFH116整理课件思考题多分支结构的实现方法多重循环结构的实现方法117整理课件4.4.5 子程序设计1.子程序概念2.子程序的调用入口参数出口参数参数传递方法: 利用寄存器 利用存储单元 利用堆栈118整理课件子程序调用指令: BL 子程序名Start LDR R0,=0 x3FF5000 ;设置参数 LDR R1,=0 x3
37、FF5008 BL PRINT_TEXT ;此处调用子程序 PRINT_TEXT ;子程序 MOV PC,LR ;子程序返回 END119整理课件4.5工作模式切换编程4.5.1处理器模式4.5.2处理器工作模式切换编程120整理课件4.5.1处理器模式121整理课件4.5.2处理器工作模式切换编程MRS指令将CPSR的值读出至通用寄存器MSR指令将修改的值送入CPSR _c,从而实现各种模式之间的切换。122整理课件切换至管理模式CPSR4:010011MRS R0,CPSRBIC R0,R0,#0 x1FORR R0,R0,#0 x13MSR CPSR_c,R0123整理课件4.6 常用的
38、使用规则4.6.1寄存器的使用规则4.6.2数据栈使用规则4.6.3参数传递规则124整理课件4.6.1寄存器的使用规则125整理课件4.6.2数据栈使用规则 126整理课件4.6.3参数传递规则1. 参数个数固定的子程序参数传递规则: 第一个整数参数,通过寄存器R0R3来传递。其它参数通过数据栈传递。2. 参数个数可变的子程序参数传递规则: 对于参数个数可变的子程序,当参数不超过4个时,使用寄存 器R0R3来传递参数;当参数超过4个时,使用数据栈来传递 参数3子程序结果返回规则 结果为一个32位的整数时,通过寄存器R0返回127整理课件4.7 ARM和Thumb混合编程4.7.1工作状态4.
39、7.2工作状态切换编程128整理课件4.7.1工作状态 ARM状态:当ARM微处理器执行32位的ARM指令集时,工作在ARM状态;Thumb状态: 当ARM微处理器执行16位的Thumb指令集时,工作在Thumb状态129整理课件4.7.2工作状态切换编程BX实现状态切换BLX实现状态切换LDR、LDM 及POP状态切换 130整理课件BX实现状态切换131整理课件 例 4.53 BX指令实现状态切换的例子 ENTRY MAIN ADR R0,THUMBCODE+1 BX R0 ADD R3,R2,R1 CODE16THUMBCODE MOV R2,#2 ADR R0,ARMCODE BX R
40、0 132整理课件 CODE32ARMCODE MOV R4,#4 MOV R5,#5 ADD R4,R4,R5 B MAIN END133整理课件调试结果134整理课件135整理课件2. BLX实现状态切换BLX指令的格式为:BLX label|Rm(1)目标地址是一个符号地址(label)(2)目标地址由寄存器Rm表示136整理课件(1)目标地址是一个符号地址(label)此时BLX指令相当于执行操作PC=label,T=1,LR=BLX后面的第一条指令地址。即指令跳转到指令中label所指定的目标地址,将程序状态切换为Thumb状态,并设置了LR的值。例 4.54 BLX指令示例 ARE
41、A EX4_54,CODE ,READONLY CODE32137整理课件 arm1 BLX thumb1 ADD R1,R2,#2 CODE16 thumb1 ADD R1,R3,#1 BX LR138整理课件(2)目标地址由寄存器Rm表示此时BLX指令相当于执行操作PC=Rm0 & 0 xfffffffe, T=Rm 0& 1, 同时将PC(R15)的值保存到LR寄存器(R14)中。 139整理课件3LDR、LDM及POP指令实现程序状态的切换 当使用LDR、LDM及POP指令向PC寄存器中赋值时,寄存器 CPSR中的Thumb位将被设置成PC寄存器bit0,这时就实现了程序状态的切换14
42、0整理课件例4.56141整理课件调试结果142整理课件切换到THUMB143整理课件切换到ARM144整理课件4.8汇编语言和C语言交互编程4.8.1 汇编程序访问C程序变量4.8.2汇编程序调用C程序4.8.3 C程序内嵌汇编指令4.8.4 C程序调用汇编程序145整理课件4.8.1 汇编程序访问C程序变量汇编语言程序可通过地址间接访问在C语言程序中声明的全局变量。通过使用IMPORT关键词引入全局变量,并利用LDR和STR指令根据全局变量的地址来访问它们。146整理课件例 4.57 汇编程序中访问C程序全局变量C语言源程序str.c如下: #include int globvar=3;
43、/定义一个整型全局变量 int main() return(0); 147整理课件汇编文件如下AREA EX4_57,CODE,READONLY EXPORT ARMCODE IMPORT globvar ENTRYARMCODE LDR R1,=globvar LDR R0,R1 ADD R0,R0,#2 STR R0,R1 MOV PC,LR END用IMPORT声明该变量是其它文件中定义的,在本文件中引用148整理课件149整理课件150整理课件4.8.2汇编程序调用C程序为了保证程序调用时参数的正确传递,汇编语言程序的设计要遵守ATPCS。在C语言程序中,不需要任何关键字来声明将被汇编
44、语言调用的C语言程序,但是在汇编语言程序调用该C语言程序之前,需要在汇编语言程序中使用IMPORT伪操作来声明该C语言程序。在汇编语言程序中通过BL指令来调用子程序151整理课件如果未指定任何列表,则: r0-r3 用作输入参数; r0 用于输出值; r12 和 r14 被破坏152整理课件例 4.58 汇编程序调用C程序 C语言源程序C_add.c #include int g(int a,int b,int c,int d,int e) return a+b+c+d+e; 153整理课件汇编语言源程序ARM_add.s AREA ARM_add,CODE,READONLY EXPORT ARM_add IMPORT g ENTRY STR LR,SP,#-4! ;保存返回地址 MOV R0,#1 ;设置参数1 MOV R1,#2 ;设置参数2 MOV R2,#3 ;设置参数3使用IMPORT伪操作声明C程序g( )154整理课件 MOV R3,#4 ;设置参数4 MOV R4,#5 ;参数5通过数据栈传递 STR R4,SP,#-4! BL g ;调用C程序g(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度年福建省高校教师资格证之高等教育法规模拟试题(含答案)
- 2024年村情简介详细版
- 单层工业厂房结构吊装施工设计方案
- 2024年图书交易详细购买协议
- 2024年城市渣土清运专项承包协议
- 导购岗位专属劳动协议范本2024年
- 2024年规范化采购协议文档模板
- 2024工程用片石买卖协议
- 2024年专业吊车租赁与服务协议
- 2024年医疗器械海外采购协议
- 江苏省泰兴市2024-2025学年高三上学期期中考试语文试题(含答案)
- 家长会教学课件
- 律师事务所律师事务所风险管理手册
- 期中综合检测(1-4单元)(试题)- 2024-2025学年二年级上册数学人教版
- 2024年消防宣传月知识竞赛考试题库500题(含答案)
- 国开2024年秋《机电控制工程基础》形考任务1答案
- 2024年典型事故案例警示教育手册15例
- 二十四节气课件:《立冬》
- IUPAC命名法(系统命名法)
- 统计学中的一些基本概念和重要公式
- 幼儿成语故事《刻舟求剑》
评论
0/150
提交评论