第六章、ARM和Thumb程序混编及其与C语言的接口 6
ARM嵌入式系统结构与编程(第2版)_第6-8章_习题答案
BNE
loop_2
Stop:
B
Stop
.end (2).在 ARM 集成开发环境下编程:
AREA Fctrl, CODE, READONLY
ENTRY
CODE32
START
MOV
R0,#0xB000
MOV
R1,#0x10000001
MOV
R2,#100
loop_1
STR
R1,[R0],#4
ADD
R1,R1,#1
解答: 伪指令是 ARM 处理器支持的汇编语言程序里的特殊助记符,它不在处理器运
行期间由机器执行,只是在汇编时将被合适的机器指令代替成 ARM 或 Thumb 指令, 从而实现真正的指令操作。
伪操作(Directive)是 ARM 汇编语言程序里的一些特殊的指令助记符,其作用主要 是为完成汇编程序做各种准备工作,对源程序运行汇编程序处理,而不是在计算机运 行期间由处理器执行.也就是说,这些伪操作只是汇编过程中起作用,一旦汇编结束,伪 操作也就随之消失。
(1)分配一段字节内存单元,并用57, 0x11, 031, ‘Z’,0x76进行初始化;
《ARM 嵌入式系统结构与编程》第 2 版,邱铁 编著. 清华大学出版社. 2013 年 8 月第 2 版,2015 年 8 月第 4 次印刷
(2)分配一段半字内存单元,并用0xFFE0,0xAABB,0x12,进行初始化;
《ARM 嵌入式系统结构与编程》第 2 版,邱铁 编著. 清华大学出版社. 2013 年 8 月第 2 版,2015 年 8 月第 4 次印刷
《ARM 嵌入式系统结构与编程》第 2 版,第 6~8 章
思考与练习题答案(此答案仅供教师教学用)
ARM Thumb指令集详解-9页word资料
ARM Thumb指令集详解ARM Thumb指令集详解2019-04-27 12:30来源:MCU嵌入式领域ARM Thumb指令集Thumb指令可以看作是ARM指令压缩形式的子集,是针对代码密度的问题而提出的,它具有16位的代码密度。
Thumb不是一个完整的体系结构,不能指望处理只执行Thumb指令而不支持ARM指令集。
因此,Thumb指令只需要支持通用功能,必要时可以借助于完善的ARM指令集,比如,所有异常自动进入ARM状态。
在编写Thumb指令时,先要使用伪指令CODE16声明,而且在ARM指令中要使用BX指令跳转到Thumb指令,以切换处理器状态。
编写ARM指令时,则可使用伪指令CODE32声明。
1 Thumb指令集与ARM指令集的区别Thumb指令集没有协处理器指令,信号量指令以及访问CPSR或SPSR的指令,没有乘加指令及64位乘法指令等,且指令的第二操作数受到限制;除了跳转指令B有条件执行功能外,其它指令均为无条件执行;大多数Thumb数据处理指令采用2地址格式。
Thumb指令集与ARM指令的区别一般有如下几点:跳转指令程序相对转移,特别是条件跳转与ARM代码下的跳转相比,在范围上有更多的限制,转向子程序是无条件的转移。
数据处理指令数据处理指令是对通用寄存器进行操作,在大多数情况下,操作的结果须放入其中一个操作数寄存器中,而不是第3个寄存器中。
数据处理操作比ARM状态的更少,访问寄存器R8~R15受到一定限制。
除MOV和ADD指令访问器R8~R15外,其它数据处理指令总是更新CPSR中的ALU状态标志。
访问寄存器R8~R15的Thumb数据处理指令不能更新CPSR中的ALU状态标志。
单寄存器加载和存储指令在Thumb状态下,单寄存器加载和存储指令只能访问寄存器R0~R7。
批量寄存器加载和存储指令LDM和STM指令可以将任何范围为R0~R7的寄存器子集加载或存储。
PUSH和POP指令使用堆栈指令R13作为基址实现满递减堆栈。
C语言与ARM汇编的混合编程
ATPCS概述 9.1 ATPCS概述
3. 参数传递规则
根据参数个数是否固定,可以将子程序分为参数个数固定的 (nonvariadic)子程序和参数个数可变的(variadic)子程序。ATPCS为 这两种子程序规定了不同的参数传递规则。 参数个数可变的子程序参数传递规则 对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器 R0~R3来传递参数;当参数超过4个时,还可以使用数据栈来传递参数。 在传递参数时,将所有参数看做是存放在连续的内存单元中的字数据。 然后依次将各名字数据传送到寄存器R0、R1、R2、R3中,如果参数多于 4个,将剩余的字数据传送到数据栈中,入栈时低地址优先,即入栈的顺 序与参数顺序相反,最后一个字数据先入栈。 参数个数固定的子程序参数传递规则 参数个数固定的子程序的参数传递规则为:第一个整数参数按序分配给 R0~R3寄存器,剩余的参数按序分配给堆栈。
从汇编代码中访问C 9.3 从汇编代码中访问C程序全局变量
在ARM汇编代码中只能通过地址间接地访问C程序的全局变量。具体访问方法 是先用IMPORT伪操作声明该全局变量,然后用LDR伪指令将该全局变量的地址 读到一个寄存器中,最后根据变量类型用相应的LDR指令读取该变量的值,用相 应的STR指令修改该变量的值。 对无符号变量用以下对应指令: char类型用LDRB/STRB指令; short类型用LDRH/STRH指令; int类型用LDR/STR指令; 注意,这里是指ARM C(armcc编译器),short类型为16位,int类型为32位, 与标准C有所不同。 对于带符号的变量,则用等价的带符号数操作指令,如LDRSB/LDRSH等。 对于小于8个字的结构性变量,可以通过一条LDM/STM指令来读/写整个变量; 对于结构变量的数据成员,可以使用相应的LDR/STR指令来访问,但必须知道该 结构成员相对于结构变量开始地址的偏移量。
ARM汇编语言和C_C_语言混合编程的方法
ret urn a + b + c + d + e + f ;
嵌入式技术
电 子 测 量 技 术 EL EC TRON IC M EASU R EM EN T TEC HNOLO GY
第 29 卷 第 6 期 2006 年 12 月
ARM 汇编语言和 C/ C + + 语言混合编程的方法
史斌
(天津大学电子信息工程学院 天津 300072)
摘 要 : 文中首先对在嵌入式系统设计中广泛应用的 ARM 系列微处理器做了简要介绍 ;接着详细阐述了基于 ARM 核的嵌入式微处理器的汇编语言和 C/ C + + 语言混合编程的方法 :包括代码简洁而功能有限的在线汇编技术和功能 强大 、基于模块化设计的 A TPCS 规则 ;最后给出了详细的示例代码和分析 。 关键词 : 嵌入式系统 ; A RM ; 汇编语言 ; 在线汇编 ; A TPCS 规则
} 因为 CPSR 是一个物理寄存器 ,没有存储器的 I/ O 映 射 ,而 A RM 的 C/ C + + 语言使用的是 ANSI 标准 ,不像 KeilC51 那样有诸如 sbit 和 sf r 的扩展 ,所以访问 CPSR 的 唯一方法就是用汇编语言 ;通过在 C/ C + + 代码中插入一 段简短的汇编代码 ,来实现对 CPSR 的访问 。再比如一些 波形发生的场合 , 需要每隔一段精确的时间向端口送数 据 ,那么 C/ C + + 代码经编译后产生的指令数是无法预知 的 ,所以无法实现精确定时 ,因此就要使用在线汇编 。 在线汇编通过__asm 关键字实现 ,一般格式为 : ……/ / C/ C + + 代码
ARM中C和汇编混合编程及示例.
ARM中C和汇编混合编程及示例参数的传递规则.根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.1.参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数.在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。
然后,依次将各名字数据传送到寄存器R0,R1,R2,R3;如果参数多参数的传递规则.根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.1.参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。
然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.2.参数个数固定的子程序参数传递规则对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: 各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.子程序结果返回规则1.结果为一个32位的整数时,可以通过寄存器R0返回.2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.5.对于位数更多的结果,需要通过调用内存来传递.本文通过几个简单的例子演示了嵌入式开发中常用的C和汇编混合编程的一些方法和基本的思路,其实最核心的问题就是如何在C和汇编之间传值,剩下的问题就是各自用自己的方式来进行处理。
ARM汇编语言与C语言混合编程的实现方法
※吉 首 大 学 校 级 课 题— ——编 号 08JDY028,名 称 :体 育 信 息 的 组 织及民族传统体育信息共享共建平台的构建。
[责任编辑:汤静]
●
(上接第 418 页)族地区的特殊性出发,以琼州大学为大学与中学合作 的龙头,进行实证研究。 以期为具有民族特色的海南省师范院校学生 职前实习模式的建构提供新思路;其次,为琼州大学外语系英语教育 方向毕业生职前实习的开展提供新的契机;第三,为海南省全面推进 新课程改革提供新的切入点。 科
{
int ch;
__asm
{
loop:
LDRB ch, [src], #1
STRB ch, [dst], #1
CMP
ch, #0
BNE
loop
}
}
调用 my_strcpy()的 C 语言代码如下:
int main()
{
char *a = "Happy New Year! ";
char b[64];
my_strcpy(a, b);
作 者 简 介 :王 应 军 (1979— ), 男 ,河 南 禹 州 人 ,硕 士 ,讲 师 ,主 要 从 事 模 式 识 别 及图像处理技术的研究。
※基 金 项 目 :河 南 科 技 学 院 校 选 项 目 基 金 资 助 (06060 ,06055 )。
[责任编辑:王静]
● ●
●
(上接第 410 页)
printf("original string: ‘%ed string: ‘%s’\n", b);
return (0);
}
在这里 C 和汇编之间的值传递是用 C 的指针来实现的, 因为指
ARM汇编语言和C语言混合编程
ARM汇编语言和C语言混合编程一. 在线汇编( in-line assembly)在C代码中插入一段汇编代码,比如while(1){...port=0x00aa55ff;__asm{mov r4,portstr r5,[r4]}...}具体格式为__asm{指令1;指令2;指令3;...指令n;指令n+1;......}其中指令的操作数可以是物理寄存器,也可以是C语言的变量、行号和表达式,这点是比纯汇编最大的的好处(窃以为如斯,比如上面的例子)说到这其实写在线汇编代码的思路就和纯汇编差不多了,但要注意几个问题:1.不能直接向PC赋值实现程序跳转,只能使用B和BL这两条指令2.在线汇编器会使用R0-R3,R12-R13计算表达式,因此复杂的表达式不能和以上寄存器出现在同一条指令中:mov r0,一个复杂的表达式 ----汇编器可能报错mov r5,一个复杂的表达式 ----汇编可以通过3.在线汇编中使用物理寄存器时,如果上下文的C代码也使用了同一个,则不必自己保存和恢复该物理寄存器,C代码会自己负责处理4.尽量不使用物理寄存器,因为a.影响代码效率,很有可能编译器为此把一个本应放在寄存器中的变量放在存储器中.就如同在C中定义局部变量哪个是register的,哪个是volatile的,编译器自己的优化才是最佳的。
b.发生错误:比如...mov r0,#0xaamov r1,x%ymov r2,r0...很可能r2的值不是0xaa,因为在计算表达式x%y时会用到r0,将r0的内容冲掉5.可以使用b指令b 标号; 实现跳转,标号可以时C的也可以是汇编的6.因为要计算表达式的值,所以一条虚拟指令要被展开为若干条真实指令(如上面的mov r1,x%y)因此实际上对标志为C.N.V.Z的影响是展开后最后一条作用的结果,但如果总指令(就是你程序中写的那条虚拟指令)是算术指令,那么能正确设置cv nz, 如果是逻辑指令,那么N.z是正确的,V不影响,C不可靠7.不支持除nop之外的其它伪指令(ADR,ADRL,LDR)8.不支持BX和BLX指令9.LDM和STM指令的寄存器列表只允许物理寄存器,不能用变量和表达式10.逗号表达式要用一个括号扩起来,使其为一个整体add x,y,(f(),z)11.不要干预堆栈当然还有更复杂的规则,比如子程序调用(BL指令),但我觉得过于繁琐,失去了在线汇编这种简便快捷的风格,如果以上介绍的不能满足你的要求,我建议使用A TPCS规则。
嵌入式体系结构及接口技术:第6章 ARM汇编伪指令与伪操作1
TM
17
17
2. GNU ARM开发工具
GNU是“GNU‘s Not Unix”的递归缩写。在1983年 9月27日由Richard Stallman公开发起GNU计划, 它的目标是创建一套完全自由的操作系统。
GNU格式ARM汇编语言程序主要是面对在ARM平 台上移植嵌入式Linux操作系统,GNU组织开发的 基于ARM平台的编译工具有主要由GNU的汇编器 as,交叉汇编器gcc和连接器ld组成。
(2)分析下面LDR指令实现的功能。 MAP 4,R12 FIELD 4
Fdata FIELD 4 LDR R0,Fdata
TM
33
33
6.3.3 汇编代码控制伪操作
汇编器在对程序代码进行编译时,会根据汇 编控制伪操作的定义情况对程序进行编译, 常用的有条件编译、重复汇编和宏定义
TM
34
34
6.3.3 汇编代码控制伪操作
1. 取值范围不同
①ADR:-255~+255/-1020~+1020 ②ADRL:-64KB~+64KB/-256KB~+256KB ③LDR:LDR伪指令处的PC值到数据缓冲区的目标数据所
在的地址之间的偏移量必须小于4KB。
2. 使用方法不同
①ADR、ADRL只能取同一段中标号的地址;LDR还可以取 不同段中的标号地址或一个指定的立即数
值读取到寄存器中,可以看作是加载寄存器 的内容。
LDR{cond} register , = expression
TM
4
4
6.1.1 ARM汇编语言伪指令
如果加载的常数符合MOV或MVN指令立即数 的要求,则用MOV或MVN指令替代LDR伪指 令。
精品课件-ARM原理与C程序设计-第六章
Bank7的配置与Bank6的相同。
最后,修改S3C2410A.s文件的第0978~1043行,即从“IF
PIO_SETUP<>0”开始的行,修改为如下所示代码:
IF
PIO_SETUP <> 0
LDR
R14, =PIO_BASE
IF
PIOA_SETUP <> 0
ADR
R0, PIOA_CFG
LDR
R2, [R0]
29
arr[i]=arr[i]*arr[i];
30
31
32
nLED = 0;
33
while(1)
34
{
第六章 C 语言程序设计
35 36 37 light 38 39 40 41 42 43 44 45
//Rand3(); nLED = 0; nLED ^=(LED2_MASK | LED3_MASK); // LED1
; ; Changed by
ENDIF
第六章 C 语言程序设计
现在,编译连接并下载工程ex6_1,可以看到UP-NETARM2410 实验箱上的LED1~3循环依次闪烁,实现了跑马灯的功能。
工程ex6_1只有两个文件,即S3C2410A.s和ledflash.c,其 中,S3C2410A.s文件在前几章已经讲述了,这里把该文件的完整 代码附于附录四,供读者对照参考;ledflash.c文件将在下一小 节中介绍。
第六章 C 语言程序设计
图6-1 工程ex6_1的主界面
第六章 C 语言程序设计
工程ex6_1中的ledflash.c文件代码罗列于6.1.2小节中。 打开工程选项,设置其“Target”页签如图6-2所示。
ARM及Thumb指令集
T Bit
Q 位:
仅ARM 5TE/J架构支持 指示饱和状态
仅ARM xT架构支持 T = 0: 处理器处于 ARM 状态 T = 1: 处理器处于 Thumb 状态
Mode位:
J位
处理器模式位
仅ARM 5TE/J架构支持 J = 1: 处理器处于Jazelle状态
34v11 ARM及Thumb指令集
ARM及Thumb指令集
T
H
E
A
R
C
H
I
T
E
C
T
U
R
E
F
O
R
T TM
H
E
D
I
G
I
T
A
L
W
O
R1 L
D
ARM指令小节目录
1.指令格式 2.条件码 3.存储器访问指令 4.数据处理指令 5.乘法指令 6.ARM分支指令 7.杂项指令 8.伪指令
34v11 ARM及Thumb指令集
TM
2
2
ARM指令长度概述
中断禁止位:
N = Negative result from ALU Z = Zero result from ALU C = ALU operation Carried out V = ALU operation oVerflowed
I = 1: 禁止 IRQ. F = 1: 禁止 FIQ.
TM
6
6
4.2 指令集介绍
ARM指令集——基本指令格式
ARM是三地址指令格式,指令的基本格式如下:
第6章(Thumb指令集及其伪指令)
• 说明:
a.参数限制:Rd和Rm均为R0~R15 b.对条件标志位的影响:Rd和Rm均为R0~R7时更新N、Z、 C和V,其他情况不影响 • 举例:ADD R3,R8
第6章 Thumb指令集及其伪指令
c.PC或SP相对偏移的ADD指令
第6章 Thumb指令集及其伪指令
2.4.3.3 LSR • 格式: LSR Rd,Rs LSR Rd,Rm,#expr • 说明: a.参数限制:Rd、Rs和Rm均为R0~R7,#expr为1~32 b.对条件标志位的影响:更新N、Z和C(若位移量为零则不影 响C) c.若位移量为32,则Rd清零,最后移出的位保留在C中;若位 移量大于32,则Rd和C均被清零 • 举例: LSR R3,R0 LSR R5,R2,#2
1.1 Thumb的特点
为了兼容数据总线宽度为16位的应用系统,ARM体系结构支 持Thumb指令集。 它是ARM指令集的一个子集,自身不是一个完整的体系结构, 不能指望处理器只执行Thumb指令而不支持ARM指令集。
一般而言,Thumb指令用来实现通用功能,必要时借助完善的
ARM指令集。
第6章 Thumb指令集及其伪指令
第6章 Thumb指令集及其伪指令
• 举例(实现64位加法):
ADD R0,R2
ADC R1,R3 2.4.2.3 SUB a.低寄存器的SUB指令 • 格式:
SUB Rd,Rn,Rm
SUB Rd,Rn,#expre3
SUB Rd,#expre8
第6章 Thumb指令集及其伪指令
• 说明:
a.参数限制:
b.Thumb状态下数据处理指令访问R8-R15会受到一定限制
微型计算机原理与接口技术(第5版)课后答案及问题墙
微型计算机原理与接口技术(第5版)课后答案及问题墙第一章绪论{崔文韬问}:课后习题第一题,二进制数与十进制数转换。
{崔文韬答}:11001010B=202D,00111101B=61D,01001101B=77D,10100100B=164D。
{崔文韬问}:课后习题第二题,16进制数与十进制数转换。
{崔文韬答}:12CH=300D,0FFH=255,3A8DH=14989D,5BEH=1470D{崔文韬问}:课后习题第三题,十进制数转化为二进制数和16进制数。
{杨艺答}:25D=19H=00011001B,76D=4CH=01001100B,128D=100H=0000000100000000B,134D=106H=0000000100000110B{杨艺答}:128D=80H=10000000B,134D=86H=10000110B{崔文韬问}:课后习题第四题,写出10进制数的BCD码{杨艺答}:327D=(001100100111)BCD,1256D=(0001001101010110)BCD{杨艺答}:1256D=(0001001001010110)BCD{崔文韬问}:英文单词About的ASCII码{沙猛答}:3935H{王金鑫改}:41H,62H,6FH,75H,74H{崔文韬问}:数字95的ASCII码{王金鑫答}:39H,35H{崔文韬问}:课后习题第六题:10进制数的原码、补码、反码{杨艺答}:【+42】原=00101010B=【+42】反=【+42】补【-42】原=10101010B,【-42】反=11010101B,【-42】补=11010110B【+85】原=01010101B=【+85】反=【+85】补【-85】原=11010101B,【-85】反=10101010B,【-85】补=10101011B{崔文韬问}:机器语言或者机器码(Machine Code),汇编语言(Assemble Language),高级语言的定义{沙猛答}:机器码:计算机只认得二进制数码,计算机中的所有指令都必须用二进制表示,这种用二进制表示的指令称为机器码。
ARM状态和THUMB状态
ARM状态和THUMB状态ARM处理器的⼯作状态在ARM的体系结构中,可以⼯作在三种不同的状态,⼀是ARM状态,⼆是Thumb状态及Thumb-2状态,三是调试状态。
《嵌⼊式系统开发与应⽤教程(第2版)》上介绍说:有两种状态ARM状态和Thumb状态,当时初学甚为不解,现在⼀知半解时再看忽然想到了显⽰中的例⼦:ARM核就好⽐⼀个⾼中学校,那种包含普通⾼中和职业⾼中的。
普通⾼中就相当于ARM状态,职业⾼中就相当于Thumb状态,这样还不能理解的话:可以认为泡泡卡丁车中普通模式和加速模式,,卡丁车加速要等到集⽓管加满,然后“ctrl”⼀下,就切换到了加速模式,⽓放完了就⼜回来了,不管加速模式还是普通模式都是在跑,只是速度不⼀样⽽已。
⽽ARM状态和Thumb状态可以直接通过某些指令直接切换,都是在运⾏程序,只不过指令长度不⼀样⽽已。
这个概念对初学者相当重要,因为当ARM Thumb是什么还没弄清楚,怎么能理解两种状态呢?他们之间的关系清楚了,这样就可以深⼊了解ARM状态是什么,Thumb状态是什么了。
另外:ARM的M系列主要⽤Thumb指令,ARM9和A系列主要⽤ARM指令S3C2440.S启动代码中根本就没⽤Thumb指令。
状态此时处理器执⾏32位的字对齐的指令,Thumb状态此时处理器执⾏16位的,半字对齐的THUMB指令。
切换程序:从到Thumb: LDR R0,=lable+1 BX R0 从ARM到Thumb: LDR R0,=lable BX R01,ARM状态arm处理器⼯作于32位指令的状态,所有指令均为32位2,thumb状态arm执⾏16位指令的状态,即16位状态3,thumb-2状态这个状态是ARM7版本的ARM处理器所具有的新的状态,新的thumb-2内核技术兼有16位及32位指令,实现了更⾼的性能,更有效的功耗及更少地占⽤内存。
总的来说,感觉这个状态除了兼有arm和thumb的优点外,还在这两种状态上有所提升,优化。
arm c语言程序设计
arm c语言程序设计
实际上,ARM C语言程序设计是指使用C语言编写程序,运
行在ARM架构的处理器上。
ARM是一种广泛使用的嵌入式
处理器架构,主要应用于移动设备、嵌入式系统和物联网设备等领域。
编写ARM C语言程序与编写普通的C语言程序并没有太大的
区别,主要是在编译和调试方面需要特别注意。
以下是编写ARM C语言程序的一般步骤:
1. 安装ARM交叉编译工具链:ARM的处理器与常见的PC处
理器架构不同,需要使用交叉编译工具链来编译程序。
安装ARM交叉编译工具链后,可以在PC上编译ARM架构的程序。
2. 编写C语言程序:使用C语言编写程序,你可以使用大部
分C语言的特性和库函数。
但需要注意的是,一些特定的硬
件相关的功能可能需要使用特殊的函数和库。
3. 编译程序:使用ARM交叉编译工具链中的编译器将C语言
源代码编译成ARM架构可执行文件。
可以使用命令行工具或
者集成开发环境(IDE)进行编译。
4. 调试程序:ARM架构的处理器有自己的调试接口,可以通
过调试器进行调试。
调试器可以连接ARM处理器上的调试接口,追踪程序的执行,查看变量的值和内存的情况。
需要注意的是,ARM架构有多个版本和系列,每个系列的
ARM处理器可能有自己的特性和指令集。
在编写ARM C语言程序时,需要根据目标ARM处理器的具体型号和特性进行适配。
此外,对于一些特定的硬件相关功能,可能还需要参考处理器的文档和相关资料。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
成映像文件。 4. 用armsd addreg加载该映像文件。 5. 通过step单步跟踪该程序。
二、C/C++以及汇编语言的混合编 程
• 内嵌汇编器的使用 • 从汇编程序中访问C程序变量 • 汇编程序、C程序以及C++程序的相互调用
使用或者禁止异常中断。
• 当处理器进入异常中断处理程序时,程序自 动切换到ARM状态。
• ARM处理器总是从ARM状态开始执行。
2. 在编译或汇编时使用选项-apcs/interwork
如果目标代码包含以下内容,应该在编译和汇编时 使用选项-apcs/interwork。
• 需要返回到ARM状态的Thumb子程序。 • 需要返回到Thumb状态的ARM子程序。 • 间接地调用ARM子程序的Thumb子程序。 • 间接地调用Thumb子程序的ARM子程序。
内嵌汇编器的使用
• 内嵌汇编器指的是包含在C/C++编译器中的 汇编器。使用内嵌汇编器后,可以在C/C++ 源程序中直接使用大部分的ARM指令和 Thumb指令。
• 使用内嵌汇编器可以在C/C++程序中实现 C/C++语言不能完成的一些操作;同时程序 的代码效率也比较高。
• 内嵌的汇编指令包括大部分的ARM和 Thumb指令,但由于它嵌在C/C++中使 用,在用法上有一些新的特点。
得程序返回到和调用者相同的状态。
汇编语言程序状态切换的指 令是BX
• 从ARM版本5开始,下面的指令也可以实现 程序状态的切换:
– BLX – LDR、LDM及POP
• 与程序状态切换相关的伪操作
– CODE16 – CODE32
当在编译或汇编时选用了选项-apcs/interwork。
• 编译器或汇编器将interwork的属性写入目标文件中。
• 连接器在子程序入口处提供用于状态切换的小程序。 • 在汇编语言的子程序中,用户必须编写相应的返回代
码,使得程序返回到河调用者相同的状态。 • 在C/C++子程序中,编译器生成合适的返回代码,使
内嵌的汇编指令用法
1. 操作数
• 内嵌的汇编指令中作为操作数的寄存器和常 量可以是C/C++表达式。这些表达式可以是 char、short或int类型,而且这些表达式都是 作为无符号数进行操作。编译器将会计算这 些表达式的值,并为其分配寄存器。
• 当汇编指令中同时用到物理寄存器和C/C++ 表达式时,要注意使用的表达式不要过于复 杂。因为复杂的表达式将会需要较多的物理 寄存器,这些寄存器可能与指令中的物理寄 存器的使用冲突。
ADD R0,R0,#1023
可能会被展开成下面的指令序列:
ADD R0,R0,#1024 SUB R0,R0,#01
乘法指令MUL可能会被展开成一系列加法和移位操 作。事实上,大部分的ARM和Thumb指令中包 含常量操作数都可能被展开成多条指令。
1. ARM程序和Thumb程序混合使用的场合
通常,Thumb程序比ARM程序更加紧凑,而且 对于内存为8位或16位的系统,使用Thumb程 序效率更高。但是,在下面一些场合下,程 序必须运行在ARM状态,这时就需要混合使 用ARM程序和Thumb程序。
• 强调速度的场合。 • 有一些功能只有ARM程序能够完成。例如,
2. 物理寄存器
在内嵌的汇编指令中使用物理寄存器有以下限制:
• 不能直接向PC寄存器中赋值,程序的跳转只能 通过B指令或BL指令。
• 在使用物理寄存器的内嵌汇编指令中,不要使用 过于复杂的C/C++表达式。
• 编译器可能会使用R12或R13寄存器存放编译的 中间结果,在计算表达式时可能会将寄存器R0R3、R12以及R14用于子程序的调用。因此,不 要将这些寄存器同时指定为物理寄存器。
第六章、ARM和Thumb程序混编 及其与C语言的接口
• ARM程序和Thumb程序的混合使用 • C/C++以及汇编语言的混合编程
一、ARM程序和Thumb程序的混合
使用
• 对于C/C++而言,只要在编译时指定-apcs/interwork选 项,编译器生成的代码会自动遵守支持ARM程序和 Thumb程序的混合使用的ATPCS。
• 通常推荐在内嵌的汇编指令中不要使用物理寄存 器,因为这可能会影响编译器分配寄存器,进而 可能影响代码的效率。
3. 常量
在内嵌的汇编指令中,常量前的符号#可以省略。 如果在表达式前使用符号#,该表达式必须是常 量。
4. 指令展开
内嵌的指令中如果包含常量操作数,该指令可能会 被汇编器展开成几条指令。例如指令:
• 对于汇编语言而言,必须保证编写的代码遵守支持ARM程 序和Thumb程序混合使用的ATPCS
• 连接器当发现有ARM子程序调用Thumb子程序,或者 Thumb子程序调用ARM子程序,连接器修改相应的调用 和返回代码,或者添加一段代码,从而实现程序状态的切 换。
• ARM的Ver 5以上版本提供BX指令在调用子程序的同时, 实现程序的状态切换,从而使程序的切换状态不需要的额 外的开销。
• 进行状态切换的汇编程序实例
AREA AddReg,CODE,READONLY ENTRY Main ADR R0,ThumbProg+1 BX R0;跳转到ThumbProg,并且程序切换到Thumb状态
CODE16;指示编译器后面的为Thumb指令 ThumbProg MOV R2, #2 MOV R3, #3 ADD R2, R2, R3 ADR R0, ARMProg BX R0; 跳转到ARMProg,并且程序切换到ARM状态
CODE32;指示编译器后面的为Thumb指令 ARMProg MOV R4,#4 MOV R5, #5 ADD R4,R4,R5
Stop MOV R0,#0x18 LDR R1,=0x20026 SWI 0x123456 END
编译和运行
• 可以通过下面的步骤来编译和运行前面的 混编例子。
1. 用文本编辑器将上述代码输入,并保存为文 件addreg.s