ATPCS中寄存器使用
如何正确使用寄存器
如何正确使用寄存器寄存器是计算机中的重要组成部分,它主要用于暂存数据、地址等信息。
在计算机程序中,正确使用寄存器可以有效提高程序的执行效率,使程序更加高效。
因此,在编写计算机程序时,我们需要正确地使用寄存器并合理地分配寄存器,以便获得更好的计算机程序性能。
一、了解寄存器的种类与用途不同的计算机都可能会有不同种类的寄存器,但在大多数情况下,它们都可以分为三类:通用寄存器、特定目的寄存器和浮点寄存器。
通用寄存器是最基本的寄存器,通常用于存储整数数据,常见的通用寄存器有 EAX、EBX、ECX 和 EDX 等。
特定目的寄存器主要用于存储特定类型的数据,例如存储地址的指针寄存器、标志寄存器和程序计数器等。
浮点寄存器主要用于存储浮点数数据,例如 FPU 中的 XMM0 ~ XMM7 寄存器。
二、合理分配寄存器在程序中,寄存器的使用应该尽可能地少,并且应该尽可能地长时间保存寄存器中存储的值,以减少寄存器的频繁读写对程序性能的影响。
为了实现这一目标,我们可以采用一些比较常用的方法,如寄存器分配和寄存器映射技术。
寄存器分配是根据程序中的需求来分配寄存器,以达到最优的指令序列。
在程序编写过程中,应尽可能地将变量保存在寄存器中,以便节省内存和寄存器的使用。
另外,可以通过将寄存器视为固定位置的存储单元来实现寄存器分配,这样可以避免寄存器的读写频繁切换。
寄存器映射是使用其他硬件资源来代替某个寄存器,以确保已分配给其他变量的寄存器可以被复用。
这种技术需要深入了解硬件资源的性能和寄存器的分配情况,以便对程序进行优化。
三、使用特殊指令在某些情况下,可以使用一些特殊的指令来优化程序的性能。
例如,使用“MOV”指令将数据从内存加载到寄存器中会比使用“LEA”指令更加高效;对于一些超过一个字长的变量,可以使用“EMP”指令来避免使用间接内存模式。
另外,可以优先使用通用寄存器来存储变量,因为在现代计算机中,通用寄存器有多个并被处理器频繁使用,这样有助于提高程序效率。
寄存器的使用与寻址方式
3.
指令MOV AL,[2000]含义是什么? 含义是什么? 指令 , 含义是什么 与指令MOV AX,[2000]有什么不同? 有什么不同? 与指令 , 有什么不同 寄存器中哪几个寄存器可以拆开使用? 寄存器中哪几个寄存器可以拆开使用? 段寄存器的功能与其它寄存器有什么不同? 段寄存器的功能与其它寄存器有什么不同? 如果DS=3000, (AX) =FFEE,内存中数据如图所示, 内存中数据如图所示, 如果 内存中数据如图所示 则执行下列指令后, , 内数据是什么? 则执行下列指令后,AX, AL内数据是什么? 内数据是什么 ① MOV AX, 2000; ② MOV AX, [2000]; ③ MOV AL,[2000]; ④ MOV [2000], AX ⑤ MOV [2000], AL 32004
31FFE
02H F2H FFH EEH EFH 8EH 7FH
2.
指令MOV AX,2000含义是什么? 含义是什么? 指令 , 含义是什么
① ② ③ 数字2000表示什么? 表示什么? 数字 表示什么 指令含义是什么? 指令含义是什么? 与指令MOV AX,[2000] 有什么不同? 有什么不同? 与指令 ,
问题五: 问题五: 物理地址为: 物理地址为:22345H,请写 ,请写CPU访问该单元 访问该单元 时可能使用的段地址和偏移地址? 段地址和偏移地址 时可能使用的段地址和偏移地址?
物理地址 段地址 偏移地址 2234 5 ① 22345 2230 45 ② 22345 2231 35 ③ 22345 2232 25 ④ 22345 2200 345 ⑤ 22345 2000 2345 ⑥ 22345 ⑦ 22345 1F00 3345 …… …… ⑧ ……
atpcs
ARM和THUMB混合调用
ARM程序和Thumb程序混合使用
• 如果程序遵守支持ARM程序和Thumb程序 混合使用的ATPCS,则程序中ARM子程序 和Thumb子程序可以相互调用。对于C/ C++源程序而言,只要在编译时指定apcs /interwork选项,编译器生成的代码会自 动遵守支持ARM程序和Thumb程序混合使 用的ATPCS。而对于汇编源程序而言,必 须保证编写的代码遵守支持ARM程序和 Thumb程序混合使用的ATPCS。
ATPCS介绍
• ATPCS规定数据栈为FD类型,并且对数据 栈的操作是8字节对齐的。 • 异常中断的处理程序可以使用被中断程序 的数据钱,这时用户要保证中断的程序的 数
12
ATPCS介绍
参数传递规则
• 根据参数个数是否固定可以将子程序分为 参数个数固定的(nonvariadic)子程序和参数 个数可变的(variadic)子程序。这两种子程 序的参数传递规则是不同的 • 参数个数可变的子程序参数传递规则: • 对于参数个数可变的子程序,当参数不超 过4个时,可以使用寄存器R0~R3来传递参 数;当参数超过4个时,还可以使用数据栈 来传递参数。 • 在参数传递时,将所有参数看作是存放在 13 连续的内存字单元中的宇数据。然后,依
R4
9
v1
局部变量寄存器2
ATPCS介绍
寄存 器
别 名
特殊名 称
使用规则
R3
A4
参数/结果/scratch寄存器4
R2
A3
参数/结果/scratch寄存器3
R1
A2
参数/结果/scratch寄存器2
R0
A1
参数/结果/scratch寄存器1
ARM知识复习题(带参考答案)
69.[单选题]假设r0=0x01,r1=0x03,正确执行ADD r0,r0,r1后,r0的值为? D A:0x01 B:0x02 C:0x03 D:0x04
2.[单选题]ARM芯片采用什么样的体系结构?A A:RISC B:CISC C:x86 D:MIPS
3.[单选题]ARM的指令执行靠什么驱动? A A:流水线 B:微代码 C:电容放电 D:电磁感应
4.[单选题]ARM使用什么样的总线协议? A A:AMBA B:CAN C:1553b总线 D:TCP/IP
55.[单选题]Thumb指令集的长度是多少? B A:32位 B:16位 C:除MOV指令32位外,其他指令均为16位 D:可以通过编译器的选项设定其是16位还是32位
56.[单选题]ARM处理器中的哪个部分可以实现物理地址到虚拟地址的映射?D A:ALU B:桶型移位寄存器 C:Cache D:MMU
8.[单选题]Intel生产的ARM芯片叫什么? D A:PowerPC B:MIPS C:Firecold D:xscale
9.[单选题]ARM体系结构中共有多少个物理寄存器? A A:37个 B:10个 C:12个 D:72个
10.[单选题]ARM使用那个寄存器存放程序的返回地址? A A:R14 B:r12
32.[单选题]处理器上电默认进入哪种状态? A A:ARM B:Thumb C:Jazelle D:由芯片的硬件连线决定
33.[单选题]使用单一平板地址的ARM地址空间,最大寻址空间为多少? B A:2G B:4G C:1G D:8G
嵌入式系统与结构 吉大考试题库答案
嵌入式系统与结构1:假设r0=0x01,r1=0x03,正确执行MOV r0,r1后,r0的值为?3.0x03 2:ARM上实现内存管理的单元叫什么?1.MMU3:ARM采用多少位的体系结构?2.32位4:Thumb指令集的长度是多少?2.16位5:下列描述中,哪些是正确的?1.ARM包含除法硬件6:程序状态寄存器CPSR的C位表示什么?3.运算结果产生进位7:指令MOV r0,r1,LSL,#3中,LSL的作用是?2.逻辑左移8:下列哪条指令,可以实现将地址单元(r1+r2×4)的数据读到r0?1.LDR r0,[r1,r2,LSL ×2]9:ARM使用什么样的总线协议?1.AMBA10:用户模式下的可见通用寄存器个数为多少个?2.16个11:处理器上电默认进入哪种状态?1.ARM12:提供了安全解决方案的ARM系列产品是以下系列中的哪一种?2.SecurCore13:当前程序状态字寄存器的名称是什么?1.CPSR14:CPSR寄存器的作用是什么?1.存储当前的处理器状态15:下面所列指令,哪一条指令语法格式正确?2.ADD r1,r2,r316:ARM汇编指令中,用于实现减法运算的是哪条指令?2.SUB17:ARM上实现内存管理的单元叫什么?1.MMU18:ARM的全称是什么?1.Advanced RISR Machines19:下列哪些指令可以协处理器的访问?1.MRC20:ARM用于响应快速外部中断的处理器模式叫什么?1.FIQ21:下面哪条指令使用了ARM中的桶型移位寄存器?3.STR r0,[r1,r2,LSL #2] 22:ARM共有几种处理器模式?1.723:假设r0=0x05,r1=0x03,正确执行SUB r0,r0,r1后,r0的值为?2.0x02 24:ATPCS中规定,使用哪个寄存器存放堆栈基地址?2.r1325:如何禁止IRQ中断?1.将CPSR寄存器的I位置126:ATPCS中规定,用哪些寄存器传递参数?1.r0~r327:ARM上电后进入哪种模式?2.管理模式28:什么样的ARM指令可以条件执行?1.所有的29:ATPCS中规定,使用哪个寄存器存放程序的返回地址?1.r1430:Thumb指令集的长度是多少?1.1631:当程序直接改写cpsr来切换模式时,cpsr会被复制到spsr?2.不会32:下列哪些指令可以访问程序状态寄存器?1.MRS33:ARM中位于主存储器和内核之间的快速存储器叫什么?1.Cache34:ARM使用那个寄存器存放程序的返回地址?1.R1435:ARM指令中对立即数的操作有一定限制,下面所列立即数中,属于合法立即数的是哪一个?4.0xff4:下列那个寄存器被当作程序计数器pc?4.r155:对MMU和MPU的区别描述正确的是?4.MMU除有内存单元保护功能外,还具有虚拟地址到物理地址的映射功能7:ARM中哪个异常优先级最高?1.Reset9:ARM上电执行下列哪种异常?1.Reset。
ATPCS规则详细
/s/blog_48aa915f0100b69p.htmlATPCS寄存器的使用规则:寄存器R0 R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 R11 R12 R13 R14 R15ATPCS名称 a1 a2 a3 a4 v1 v2 v3 v4WRv5 v6SBv7SLv8FPIP SP LR PC1.子程序间通过寄存器R0~R3来传递参数。
被调用的子程序在返回前无须恢复寄存器R0~R3的内容。
2.在子程序中,使用寄存器R4~R11来保存局部变量。
这时,寄存器R4~R11可以记为v1~v8。
如果在子程序中使用了寄存器v1~v8中的某些寄存器,则子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值。
在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
另外R9,R10和R11还有一个特殊作用,分别记为:静态基址寄存器SB,数据栈限制指针SL和桢指针FP。
3.寄存器R12用做过程调用中间临时寄存器IP。
寄存器R13用做堆栈指针SP。
在子程序中寄存器R13不能用做其它用途。
寄存器SP在进入子程序时的值和退出子程序的值必须相等。
寄存器R14称为链接寄存器LR,它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用做其他用途。
寄存器R15为程序计数器PC,不能用做其他用途。
4.只有寄存器R0~R7,SP,LR和PC可以在Thumb状态下使用,其中R7常常作为Thumb 状态的工作寄存器,记为WR。
数据栈使用规则:1.满降序栈(FD),且8字节对齐。
关于PCS与ATPCS的一点介绍2008-09-01 22:21:50本文来自网络,我稍作了一点编辑。
如果读者使用的是ADS1.2编译器,那么ATPCS.pdf文档就在X:\ProgramFiles\ARM\ADSv1_2\PDF\specs目录里面。
(X:\指的是ADS1.2编译器所在的安装盘)什么是PCS,什么是ATPCS?PCS即Procedure Call Standard(过程调用规范),ATPCS即ARM-THUMB procedure call standard。
S内置寄存器说明
SM0.0
始终接通为ON
First_Scan_On
SM0.1
仅第一个扫描周期中接通为ON
Retentive_Lost
SM0.2
如果保持的数据丢失,接通为ON一个扫描周期
RUN_Power_Up
SM0.3
以上电方式进入RUN(运行)模式时,接通为ON一个扫描周期
Clock_60s
SM0.4
SM87.7
0=信息接收功能被禁止,1=信息接收功能被使能
P1_Config_0
SM130.0
端口1选择自由口协议或系统协议
HSC3_Status_5
SM136.5
HSC3当前计数方向状态:1=增计数
HSC3_Status_6
SM136.6
HSC3当前值等于预置值状态:1=相等
HSC3_Status_7
SM47.0
HSC1复位有效电平控制:0=高电平有效;1=低电平有效
HSC1_Start_Level
SM47.1
HSC1启动有效电平控制:0=高电平有效;1=低电平有效
HSC1_Rate
SM47.2
HSC1计数速率选择:0=4x(四倍速);1=1x
HSC1_Dir
SM47.3
HSC1计数方向控制:0=减计数;1=增计数
HSC4_Status_7
SM146.7
HSC4当前值大于预置值状态:1=大于
HSC4_Reset_Level
SM147.0
HSC4复位有效电平控制:0=高电平有效;1=低电平有效
HSC4_Rate
SM147.2
HSC4计数速率选择:0=4x(四倍速);1=1x
HSC4_Dir
第3章ARM汇编语言程序设计GNU汇编ppt课件
时将程序计数器PC指向子程序的入口点,当子程序执行完毕需要返回调用处时, 只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在调用子程序的 同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器 R0~R3完成。 以下是使用BL指令调用子程序的汇编语言源程序的基本结构:
.string/.asciz/.ascii
语法格式 .string/.asciz/.ascii 表达式{,表达式}...
作用
.string/.asciz/.ascii定义多个字符串。 注意:ascii伪操作定义的字符串需要自动添加结尾字符'\0'
举例
.string "abcd","hello"
bne 1f @跳转到1标号去执行 局部标号代表它所在的地址,因此也可以当作变量或
者函数来使用。
Linux汇编程序中的分段
(1).section伪操作
用户可以通过.section伪操作来自定义一个段,格式如下 :
.section section_name [, "flags"[, %type[,flag_specif
地址表达式expr的取值范围如下:
当地址值是字节对齐时,其取指范围为−255B~255B;
当地址值是字对齐时,其取指范围为−1020B~1020B。
ARM伪指令——小范围的地址读取
ADR伪指令将基于PC相对偏移的地址值或基于寄存器相对偏移的 地址值读取到寄存器中。在汇编编译器编译源程序时,ADR伪指令被 编译器替换成一条合适的指令。通常,编译器用一条ADD指令或SUB 指令来实现该ADR伪指令的功能,若不能用一条指令实现,则产生错 误,编译失败。
寄存器操作方法_对寄存器操作的通用方法总结
寄存器操作方法_对寄存器操作的通用方法总结寄存器操作方法_对寄存器操作的通用方法总结寄存器,是集成电路中非常重要的一种存储单元,通常由触发器组成。
在集成电路设计中,寄存器可分为电路内部使用的寄存器和充当内外部接口的寄存器这两类。
内部寄存器不能被外部电路或软件访问,只是为内部电路的实现存储功能或满足电路的时序要求。
而接口寄存器可以同时被内部电路和外部电路或软件访问,CPU中的寄存器就是其中一种,作为软硬件的接口,为广泛的通用编程用户所熟知。
本文主要详解寄存器操作方法以及对寄存器操作的通用方法总结,具体的跟随小编来了解一下。
一、寄存器操作1、#define方法1)寄存器地址的定义:#define UART_BASE_ADRS (0x10000000)/* 串口的基地址*/ #define UART_RHR *(volatile unsigned char *)(UART_BASE_ADRS + 0)/* 数据接受寄存器*/#define UART_THR *(volatile unsigned char *)(UART_BASE_ADRS + 0)/* 数据发送寄存器*/2)寄存器读写操作:UART_THR = ch; /* 发送数据*/ch = UART_RHR; /* 接收数据*/也可采用定义带参数宏实现#define WRITE_REG(addr,ch)*(volatile unsigned char *)(addr)= ch#define READ_REG(addr,ch)ch = *(volatile unsigned char *)(addr)3)对寄存器相应位的操作方法:定义寄存器#define UART_LCR *(volatile unsigned char *)(UART_BASE_ADRS + 3)/* 线控制寄存器*/。
寄存器的使用
一般说来,处理器拥有对整个系统的所有总线的控制权。
对于Intel平台而言,处理器拥有对数据、内存和控制总线的控制权,根据指令控制整个计算机的运行。
在以后的章节中,我们还将讨论系统中同时存在多个处理器的情况。
处理器中有一些寄存器,可以保存特定长度的数据。
第二章认识处理器中央处理器(CPU)在微机系统处于“领导核心”的地位。
汇编语言被编译成机器语言之后,将由处理器来执行。
那么,首先让我们来了解一下处理器的主要作用,这将帮助你更好地驾驭它。
典型的处理器的主要任务包括∙从内存中获取机器语言指令,译码,执行∙根据指令代码管理它自己的寄存器∙根据指令或自己的的需要修改内存的内容∙响应其他硬件的中断请求一般说来,处理器拥有对整个系统的所有总线的控制权。
对于Intel平台而言,处理器拥有对数据、内存和控制总线的控制权,根据指令控制整个计算机的运行。
在以后的章节中,我们还将讨论系统中同时存在多个处理器的情况。
处理器中有一些寄存器,这些寄存器可以保存特定长度的数据。
某些寄存器中保存的数据对于系统的运行有特殊的意义。
新的处理器往往拥有更多、具有更大字长的寄存器,提供更灵活的取指、寻址方式。
寄存器如前所述,处理器中有一些可以保存数据的地方被称作寄存器。
寄存器可以被装入数据,你也可以在不同的寄存器之间移动这些数据,或者做类似的事情。
基本上,像四则运算、位运算等这些计算操作,都主要是针对寄存器进行的。
首先让我来介绍一下80386上最常用的4个通用寄存器。
先瞧瞧下面的图形,试着理解一下:上图中,数字表示的是位。
我们可以看出,EAX是一个32-bit寄存器。
同时,它的低16-bit又可以通过AX这个名字来访问;AX又被分为高、低8bit两部分,分别由AH和AL来表示。
对于EAX、AX、AH、AL的改变同时也会影响与被修改的那些寄存器的值。
从而事实上只存在一个32-bit的寄存器EAX,而它可以通过4种不同的途径访问。
也许通过名字能够更容易地理解这些寄存器之间的关系。
嵌入式设计复习题答案
嵌入式设计复习题答案一、填空题1、哈佛体系结构数据空间和地址空间(分开),ARM920T采用(哈佛)的内核架构。
2、 ARM7TDMI采用( 3 )级流水线结构,ARM920TDMI采用( 5 )级流水线。
3、ARM7TDMI中,T表示支持16位Thumb指令集,D表示(在片可调式),M表示内嵌乘法器Multiplier,I表示(嵌入式ICE ),支持在线断点和调试。
4、“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本要素。
5、ARM处理器共有37个寄存器,31个通用寄存器,6个状态寄存器。
寄存器R13通常用作堆栈指针,称作SP。
寄存器R14用作子程序链接寄存器,也称为链接寄存器LK (Link Register)。
6、程序状态寄存器CPSR的N、Z、C、V分别指--,I=1指-禁止IRQ中断-、F=1指-禁止FIQ中断-,M[4:0]用做-处理器模式选择-。
7、ARM微处理器支持四种类型的堆栈,即:满递增堆栈、满递减堆栈、空递增堆栈、空递减堆栈。
8、ARM微处理器有7 种工作模式,它们分为两类特权模式、非特权模式。
其中用户模式属于非特权模式9、ARM支持两个指令集,ARM核因运行的指令集不同,分别有两个状态 ARM状态、thumb状态,状态寄存器CPSR的 T (或者填 D5 )位反映了处理器运行不同指令的当前状态10、ARM处理器有两种总线架构,数据和指令使用同一接口的是冯诺依曼结构,数据和指令分开使用不同接口的是哈佛结构11、ARM核有多个寄存器,其中大部分用于通用寄存器,有小部分作为专用寄存器, R15 寄存器用于存储PC,R13通常用来存储 SP (或者填堆栈指针)12、编译链接代码时,有两种存储代码和数据的字节顺序,一种是小端对齐,另一种是大端对齐13、不同的中断处理不同的处理模式,具有不同的优先级,而且每个中断都有固定的中断入口地址。
当一个中断发生时,相应的R14存储中断返回地址,SPSR存储状态寄存器CPSR的值。
ATPCS标准详解
ATPCS即ARM-THUMB procedure call standard的简称。
PCS规定了应用程序的函数可以如何分开地写,分开地编译,最后将它们连接在一起,所以它实际上定义了一套有关过程(函数)调用者与被调用者之间的协议。
PCS规范强制实现如下约定:1、调用函数如何传参(即压栈方法,以何种方式存放参数),2、被调用函数如何获取参数,以何种方式传递函数返回值。
PCS规范的制订是一系列指标的“tradeoff”(因为很大程度上涉及系统的一些性能),如会涉及生成代码的大小,调试功能的支持,函数调用上下文处理速度以及内存消耗。
当然,通过编译器的支持可以让生成的代码有不同的特性,如gcc编译选项可以支持或不支持framepointer来支持深入调试功能或提高程序运行性能。
PCS是体系结构密切相关的,直接涉及编译器如何使用处理器提供的应用寄存器,如编译器使用什么寄存器作为栈指针,利用哪些寄存器作直接传参等。
值得注意的是,没有谁规定说ATPCS是必须这样而不是那样的,它是应用相关的,任何一个操作系统和应用可以处于它自身的考虑定义自己的PCS,当然,如果那样,也必须有自己的编译器,而实际上,在一个处理器设计时,都会有某种假设,所以PCS某种程度上应该是一样的。
ATPCS是基于arm指令集和thumb指令集过程调用的规范。
寄存器的使用规则:1.子程序通过寄存器R0~R3来传递参数.这时寄存器可以记作:A1~A4,被调用的子程序在返回前无需恢复寄存器R0~R3的内容.2.在子程序中,使用R4~R11来保存局部变量.这时寄存器R4~R11可以记作:V1~V8.如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.3.寄存器R12用作子程序间scratch寄存器,记作IP;在子程序的连接代码段中经常会有这种使用规则.4.寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途.寄存器SP在进入子程序时的值和退出子程序时的值必须相等.5.寄存器R14用作连接寄存器,记作LR;它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途.6.寄存器R15是程序计数器,记作PC;它不能用作其他用途.7.ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.参数的传递规则.根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.1、参数个数可变的子程序参数传递规则对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数.在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。
第6章 ATPCS
R4
R3 R2 R1 R0
V1
A4 A3 A2 A1
局部变量寄存器1
参数/结果/scratch寄存器4 参数/结果/scratch寄存器3 参数/结果/scratch寄存器2 参数/结果/scratch寄存器1
Assemble Language of ARM
6
6.2.2 数据栈使用规则
栈指针可以指向不同的位置,数据栈的增长 方向也可以不同,有4种数据栈:
{
return a+b+c+d+e+f; }
int caller2(void)
{ return func2(1,2,3,4,5,6); } This code is compiled with “-O2 -Ono_autoinline”
: : : : : : : : : :
STMFD MOV MOV STMIA MOV MOV MOV MOV BL LDMFD
Байду номын сангаас
3
6.2 基本 ATPCS
基本ATPCS规定了在子程序调用时的一些基本规 则,支持:
各寄存器的使用规则及其相应的名称 数据栈的使用规则 参数传递的规则
不支持
ARM程序和Thumb程序相互调用 数据以及代码的位置无关的支持 子程序的可重入性 数据栈检查的支持
Assemble Language of ARM 4
Assemble Language of ARM
10
对于浮点参数遵守:
第一个整数参数通过寄存器r0-r3来传递,其 它参数通过数据栈传递。
Assemble Language of ARM
11
参数传递
嵌入式试题集(含答案)
嵌⼊式试题集(含答案)1、ARM微处理器有 7种⼯作模式,它们分为两类⾮特权模式、特权模式。
其中⽤户模式属于⾮特权模式2、ARM⽀持两个指令集, ARM核因运⾏的指令集不同,分别有两个状态ARM 、Thumb,状态寄存器CPSR的 T 位反映了处理器运⾏不同指令的当前状态3、ARM核有多个寄存器,其中⼤部分⽤于通⽤寄存器,有⼩部分作为专⽤寄存器,R15 寄存器⽤于存储PC,R13通常⽤来存储SP 。
ARM处理器有两种总线架构,数据和指令使⽤同⼀接⼝的是冯诺依曼,数据和指令分开使⽤不同接⼝的是哈佛结构4、ARM微处理器复位后,PC的地址通常是 0x0 ,初始的⼯作模式是Supervisor 。
5、ARM微处理器⽀持虚拟内存,它是通过系统控制协处理器CP15 和MMU(存储管理部件)来进⾏虚拟内存的存储和管理。
当系统发⽣数据异常和指令领取异常时,异常处理程序透过嵌⼊式操作系统的内存管理机制,通过MMU交换物理内存和虚拟内存的页⾯,以保证程序正常执⾏。
6、编译链接代码时,有两种存储代码和数据的字节顺序,⼀种是⼩端对齐,另⼀种是⼤端对齐。
7、构建嵌⼊式系统开发环境的⼯具链有多种,其中开放源码的⼯具链是GNU⼯具链,ARM公司提供的⼯具链是ADS⼯具链计算机有CISC和RISC两种类型,以ARM微处理器为核⼼的计算机属于 RISC类型,其指令长度是定长的8、⽬前使⽤的嵌⼊式操作系统主要有哪些?请举出六种较常⽤的。
Windows CE/Windows Mobile、VxWork、Linux、uCos、Symbian、QNX任选六9、Boot Loader在嵌⼊式系统中主要起什么作⽤?完成哪些主要的⼯作?答:Boot Loader是在嵌⼊式系统复位启动时,操作系统内核运⾏前,执⾏的⼀段程序。
通过Boot Loader,初始化硬件设备,建⽴内存和I/O空间映射图,为最终加载操作系统内核调整好适当的系统软硬件环境。
ATPCS中寄存器使用
ATPCS中各寄存器的使用规则及其名称参数传递规则1. 参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。
2. 结果为一个32位整数时,可以通过寄存器R0返回3. 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。
汇编程序、C程序及C++程序相互调用C 程序调用汇编程序:☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递。
☐在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。
☐在C 语言程序中使用extern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。
☐调用汇编的C 函数:☐示例#includeextern void strcopy(char *d,const char *s) //声明外部函数,即要调用的汇编//子程序int main(void){const cha r *srcstr=“First string-source”;//定义字符串常量char dstsrt[] =“Second string-destination”;//定义字符串变量printf(“Before copying:\n”);printf(“‟%s‟\n …%s\n,”srcstr,dststr); //显示源字符串和目标字符串的内容strcopy(dststr,srcstr); //调用汇编子程序,R0=dststr,R1=srcstrprintf(“Aft er copying:\n”)printf(“‟%s‟\n …%s\n,”srcstr,dststr); //显示strcopy 复制字符串结果return(0);}☐被调用汇编子程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;声明汇编程序strcopy,以便外部程序引用strcopy ;R0 为目标字符串的地址;R1 为源字符串的地址;LDRB R2,[R1],#1 ;读取字节数据,源地址加1STRB R2,[R0],#1 ;保存读取的1 字节数据,目标地址加1CMP r2,#0 ;判断字符串是否复制完毕BNE strcopy ;没有复制完毕,继续循环MOV pc,lr ;返回END汇编程序调用C程序☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递.☐在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数.☐在调用C 程序时,要正确设置入口参数,然后使用BL 调用.☐汇编调用C 程序的C 函数:/*函数sum5()返回5 个整数的和*/int sum5(int a,lit b, int c,int d,int e){return(a+b+c+d+e); //返回5 个变量的和}☐汇编调用C 程序的汇编程序AREA sample, CODE,READONLYIMPORT sum5 ;声明外部标号sum5,即C 函数sum5() CALLSUMSTMFD SP! {LR} ;LR 寄存器放栈ADD R1,R0,R0 ;设置sum5 函数入口参数,R0 为参数aADD R2,R1,R0 ;R1 为参数b,R2 为参数cADD R3,R1,R2,STR R3,[SP,# -4]! ;参数e 要通过堆栈传递ADD R3,R1,R1 ;R3 为参数dBL sum5 ;调用sum5(),结果保存在R0ADD SP,SP#4 ;修正SP 指针LDMFD SP,PC ;子程序返回END嵌入式C编程概述:C语言的优点是运行速度快、编译效率高、移植性好和可读性强。
嵌入式试题
嵌入式试题1. 嵌入式微控制器相比嵌入式微处理器的的最大特点()。
[单选题] *A、体积大大减小B、单片化(正确答案)C、功耗低D、成本高2. 和 PC机系统相比下列哪个不是嵌入式系统独具的特点() [单选题] *A、系统内核小B、专用性强C、可执行多任务(正确答案)D、系统精简3. 下列不属于RISC 计算机特点的是()。
[单选题] *A、流水线每周期前进一步。
B、更多通用寄存器。
C、指令长度不固定,执行需要多个周期。
(正确答案)D、独立的Load 和 Store指令完成数据在寄存器和外部存储器之间的传输。
4. 在嵌入式处理器与外部设备接口中,使用 2根线实现多对多双向收发的是()[单选题] *A、UARTB、I2C(正确答案)C、 SPID、USB5. EMPU是()。
[单选题] *A、嵌入式微控制器B、嵌入式微处理器(正确答案)C、片上系统D、嵌入式数字信号处理器6. ARM 属于()。
[单选题] *A、RISC 架构(正确答案)B、CISC架构7. 嵌入式系统有硬件和软件部分构成,以下不属于嵌入式系统软件的是()。
[单选题] *A、系统软件B、驱动C、FPGA 编程软件(正确答案)D、嵌入式中间件8. 下列哪个是计算机系统中存储速度最慢的存储设备()。
[单选题] *A、CPU 内部寄存器B、高速缓存 (Cache)C、内存D、硬盘(正确答案)9. 下列哪项不是 ARM 处理器的特点()。
[单选题] *A、小体积、低功耗B、可以使用除加载/存储指令外的多种指令访问存储器(正确答案)C、大多数数据操作在寄存器中完成,执行速度快D、支持 Thumb/ARM 双指令集10. 对 ARM 处理器说法不正确的是() [单选题] *A、小体积、低功耗、低成本、高性能B、支持Thumb(16 位)/ARM(32 位)双指令集C、只有 Load/Store 指令可以访问存储器D、寻址方式多而复杂(正确答案)11. ARM 的全称是什么? () [单选题] *A、Advanced RISR Machines(正确答案)B、A Run MachineC、Advanced Research ManD、Addressed Red Middle12. 下面不符合嵌入式操作系统特点的特性是() [单选题] *A、实时性B、不可定制(正确答案)C、微型化D、易移植13. 和PC系统机相比嵌入式系统不具备以下哪个特点() [单选题] *A、系统内核小B、专用性强C、可执行多任务(正确答案)D、系统精简14. 以下哪个不是嵌入式设备?() [单选题] *A、运动手表B、路由器C、web 服务器(正确答案)D、智能电视15. 以下哪个表述不正确() [单选题] *A、ARM 是一个公司的名称B、ARM 是对一类微处理器的通称C、ARM 是一种技术的名字D、ARM是一款芯片的名称(正确答案)16. 以下哪个不是嵌入式系统设计的主要目标?() [单选题] *A、低成本B、低功耗C、实时要求高D、超高性能(正确答案)17. 下面哪个系统不属于嵌入式系统()。
atpcs规则
atpcs规则
ATPCS规则是一种用于测试软件的方法论。
ATPCS是由四个单词的缩写组成,分别是:输入(Input)、处理(Processing)、输出(Output)和存储(Storage)。
在ATPCS规则中,测试者会对每个应用程序的输入、处理、输出和存储进行测试,以确保软件的质量和稳定性。
输入测试主要是对软件的输入数据进行测试,以确保输入的数据格式和内容正确。
处理测试主要是对软件的处理过程进行测试,以确保软件的算法和逻辑正确。
输出测试主要是对软件的输出结果进行测试,以确保输出结果与预期结果相同。
存储测试主要是对软件的数据存储和读取进行测试,以确保数据的可靠性和完整性。
ATPCS规则是一种很好的测试方法,可以帮助测试者更全面地了解软件的功能和性能。
它可以帮助测试者发现软件中的错误和缺陷,并提供有效的解决方案。
因此,ATPCS规则在软件测试领域中得到广泛应用。
- 1 -。
atpcs过程调用标准
ATPCS是ARM-THUMB Procedure Call Standard的简称,定义了应用程序的函数如何被独立地编写和编译,并最终链接在一起的规则。
它实际上创建了一套协议,规定了过程(函数)调用者和被调用者之间的交互方式。
具体来说,ATPCS规定了一些调用和被调用程序之间的基本规则,涉及子程序调用过程中寄存器的使用、数据栈的使用以及参数的传递等。
为满足特定需求,这些基本规则可以进行修改,得到几种不同的子程序调用规则。
如果有调用关系的所有子程序必须遵守同一种ATPCS,编译器或汇编器会在ELF格式的目标文件中设置相应的属性,标识用户选定的ATPCS类型。
对于汇编语言程序来说,用户需要确保各子程序满足选定的ATPCS类型。
使用ADS的C语言编译器编译的C语言子程序也需要满足用户指定的ATPCS类型。
以上内容仅供参考,如需更多信息,建议查阅计算机科学领域的书籍文献或咨询相关专业人士。
ARM中ACTCS规则
ARM中ACTCS规则ARM中应该是ATPCS规则。
为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定-定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则。
基本ATPCS规定了在子程序调用时的一些基本规则,包括下面3方面的内容:1、各寄存器的使用规则及其相应的名称。
2、数据栈的使用规则。
3、参数传递的规则。
一、寄存器的使用必须满足下面的规则:1)子程序间通过寄存器RO-R3来传递参数,这时,寄存器RO~R3可以记作A1-A4。
被调用的子程序在返回前无需恢复寄存器RO~R3的内容。
2)在子程序中,使用寄存器R4~R11来保存局部变量.这时,寄存器R4~R11可以记作V1~V8。
如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。
在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
3)寄存器R12用作过程调用时的临时寄存器(用于保存SP,在函数返回时使用该寄存器出栈),记作ip。
在子程序间的连接代码段中常有这种使用规则。
4)寄存器R13用作数据栈指针,记作sp。
在子程序中寄存器R13不能用作其他用途。
寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
5)寄存器R14称为连接寄存器,记作Ir。
它用于保存子程序的返回地址。
如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
6)寄存器R15是程序计数器,记作pC。
它不能用作其他用途。
2、堆栈使用规则:ATPCS规定堆栈为FD类型,即满递减堆栈。
并且堆栈的操作是8字节对齐。
而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件:1、外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字;2、在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的;3、参数的传递规则:根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序这两种子程序的参数传递规则是不同的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATPCS中各寄存器的使用规则及其名称参数传递规则1. 参数不超过4个时,可以使用寄存器R0~R3来传递参数,当参数超过4个时,还可以使用数据栈来传递参数。
2. 结果为一个32位整数时,可以通过寄存器R0返回3. 结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。
汇编程序、C程序及C++程序相互调用C 程序调用汇编程序:☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递。
☐在汇编程序中使用EXPORT 伪指令声明本子程序,使其它程序可以调用此子程序。
☐在C 语言程序中使用extern 关键字声明外部函数(声明要调用的汇编子程序),即可调用此汇编子程序。
☐调用汇编的C 函数:☐示例#includeextern void strcopy(char *d,const char *s) //声明外部函数,即要调用的汇编//子程序int main(void){const cha r *srcstr=“First string-source”;//定义字符串常量char dstsrt[] =“Second string-destination”;//定义字符串变量printf(“Before copying:\n”);printf(“‟%s‟\n …%s\n,”srcstr,dststr); //显示源字符串和目标字符串的内容strcopy(dststr,srcstr); //调用汇编子程序,R0=dststr,R1=srcstrprintf(“Aft er copying:\n”)printf(“‟%s‟\n …%s\n,”srcstr,dststr); //显示strcopy 复制字符串结果return(0);}☐被调用汇编子程序:AREA SCopy,CODE,READONLYEXPORT strcopy ;声明汇编程序strcopy,以便外部程序引用strcopy ;R0 为目标字符串的地址;R1 为源字符串的地址;LDRB R2,[R1],#1 ;读取字节数据,源地址加1STRB R2,[R0],#1 ;保存读取的1 字节数据,目标地址加1CMP r2,#0 ;判断字符串是否复制完毕BNE strcopy ;没有复制完毕,继续循环MOV pc,lr ;返回END汇编程序调用C程序☐汇编程序的设置要遵循ATPCS 规则,保证程序调用时参数的正确传递.☐在汇编程序中使用IMPORT 伪指令声明将要调用的C 程序函数.☐在调用C 程序时,要正确设置入口参数,然后使用BL 调用.☐汇编调用C 程序的C 函数:/*函数sum5()返回5 个整数的和*/int sum5(int a,lit b, int c,int d,int e){return(a+b+c+d+e); //返回5 个变量的和}☐汇编调用C 程序的汇编程序AREA sample, CODE,READONLYIMPORT sum5 ;声明外部标号sum5,即C 函数sum5() CALLSUMSTMFD SP! {LR} ;LR 寄存器放栈ADD R1,R0,R0 ;设置sum5 函数入口参数,R0 为参数aADD R2,R1,R0 ;R1 为参数b,R2 为参数cADD R3,R1,R2,STR R3,[SP,# -4]! ;参数e 要通过堆栈传递ADD R3,R1,R1 ;R3 为参数dBL sum5 ;调用sum5(),结果保存在R0ADD SP,SP#4 ;修正SP 指针LDMFD SP,PC ;子程序返回END嵌入式C编程概述:C语言的优点是运行速度快、编译效率高、移植性好和可读性强。
C语言支持模块化程序设计,支持自顶向下的结构化程序设计方法。
因此在嵌入式程序设计中经常会用到C语言程序设计。
嵌入式C语言程序设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。
也就是说它首先是C语言程序设计,因此必须符合C语言基本语法,只是它是面向嵌入式的应用而设计的程序。
☐C语言的“预处理伪指令”在嵌入式程序设计中的应用。
1、文件包含伪指令格式:#include<头文件名.h> ;标准头文件#include“头文件名.h” ;自定义头文件2、宏定义伪指令格式:# define 宏标识符宏体例:⏹#define U32 unsigned int⏹#define U16 unsigned short⏹#define S32 int⏹#define S16 short int⏹#define U8 unsigned char⏹#define S8 char3、条件宏:先测试是否定义过某宏标识符,然后决定如何处理。
这样做是为了避免重复定义。
格式:#ifdef 宏标识符#undef 宏标识符#define 宏标识符宏体#else#define 宏标识符宏体#endif例:#ifdef INCLUDE_SERIAL#undef NUM_TTY#define NUM_TTYN_UART_CHANNELS#undef CONSOLE_TTY#define CONSOLE_TTY 0#undef CONSOLE_BAUD_RATE#define CONSOLE_BAUD_RATE 115200#endif4、条件编译伪指令格式#if(条件表达式1)…#elif(条件表达式2)…#elif(条件表达式n)…#else…#endif这样,编译时,编译器仅对#if()…#endif之间满足某一条件表达式的源文件部分进行编译。
使用寄存器变量当对一个变量频繁被读写时,需要反复访问内存,从而花费大量的存取时间。
为此,C语言提供了一种变量,即寄存器变量。
这种变量存放在CPU的寄存器中,使用时,不需要访问内存,而直接从寄存器中读写,从而提高效率。
寄存器变量的说明符是register。
对于循环次数较多的循环控制变量及循环体内反复使用的变量均可定义为寄存器变量,而循环计数是应用寄存器变量的最好候选者。
例:/* 求1+2+3+….+n的值*/WORD Addition(BYTE n){register i,s=0;for(i=1;i<=n;i++){s=s+i;}return s;}活用位操作(熟练掌握)使用C语言的位操作可以减少除法和取模的运算。
在计算机程序中数据的位是可以操作的最小数据单位,理论上可以用“位运算”来完成所有的运算和操作,因而,灵活的位操作可以有效地提高程序运行的效率。
例:/* 方法1 */int i,j;i = 879 / 16;j = 562 % 32;/* 方法2 */int i,j;i = 879 >> 4;j = 562 - (562 >> 5 << 5);例int Ra ;//Ra[15:16]=11Ra &= ~(3<<15);C语言位运算除了可以提高运算效率外,在嵌入式系统的编程中,它的另一个最典型的应用,而且十分广泛地正在被使用着的是位间的(&)、(|)、非(~)操作,这跟嵌入式系统的编程特点有很大关系。
例:rGPCDAT=(rGPCDAT&0xFFFFFFF0)|0x0ErINTMSK&=~(BIT_TIMER1)数据指针在嵌入式系统的编程中,常常要求在特定的内存单元读写内容,汇编有对应的MOV指令,而除C/C++以外的其它编程语言基本没有直接访问绝对地址的能力。
在嵌入式系统的实际调试中,多借助C语言指针所具有的对绝对地址单元内容的读写能力。
以指针直接操作内存多发生在如下几种情况:⏹某I/O芯片被定位在CPU的存储空间而非I/O空间,而且寄存器对应于某特定地址;⏹两个CPU之间以双端口RAM通信,CPU需要在双端口RAM的特定单元(称为mail box)书写内容以在对方CPU产生中断;⏹读取在ROM或FLASH的特定单元所烧录的汉字和英文字模。
例:int *p = (int *)0xF000FF00 ;*p=0xABCD;#define rGPACON (*(volatile unsigned *)0x56000000);rGPACON=0x1234;关键字volatile一般这个修饰符用来告知编译器,被修饰的变量是个“易变的”变量(volatile的本意是“易变的”),防止编译器进行优化。
将变量加上volatile修饰,则编译器保证对此变量的读写操作都不会被优化。
用法1、中断服务程序中修改的供其它程序检测的变量需要加volatile。
2、多任务环境下各任务间共享的标志应该加volatile。
3、存储器映射的硬件寄存器通常也要加volatile说明,因为每次对它的读写都可能由不同意义。
投票。