ARM体系结构与编程
文章平均质量分 58
ARM体系结构与编程学习输出
CodeAllen嵌入式
CSDN博客专家,曾中科院无人机软件研发,现TOP通信外企高级软件工程师,专注通信电子及嵌入式软件方向职业规划,全网技术矩阵粉丝10w+,欢迎交流一起成长!
展开
-
Bootload U-Boot分析
在include/cmd_confdefs.h中定义了所有U-Boot命令的标志位。如果有更多的命令,也要在这里添加定义。原创 2023-08-07 22:49:25 · 922 阅读 · 0 评论 -
Bootload启动代码功能模块分解
(1)伪操作GET伪操作类似于C语言里面的include,是将一个源文件包含到当前源文件中,并将被包含的文件在其当前位置进行汇编处理。IMPORT伪操作相当于C语言中的extern声明,它告诉编译器当前的符号不在本源文件中定义,而是在其他源文件中定义,在本源文件中可能引用该符号。AERA伪操作用于定义一个代码或者数据段。ASSERT,在汇编编译器对汇编程序的扫描中,如果ASSERT中条件不成立,ASSERT伪操作将报告错误信息。(2)汇编指令LDR伪指令将一个32位的常数或者一个地址值读取到寄存器中。原创 2023-08-06 22:19:08 · 616 阅读 · 0 评论 -
在汇编语言中调用C语言的函数
在汇编语言中调用C语言的函数,需要在汇编语言中IMPORT对应的C语言函数名,然后将C语言的代码放在一个独立的C语言文件中进行编译,剩下的工作由连接器来处理。原创 2023-08-05 23:51:56 · 1006 阅读 · 1 评论 -
在C语言中调用汇编语言的函数
在这里,C语言和汇编语言之间的参数传递是通过ATPCS(ARM Thumb Procedure Call Standard)的规定来进行的。简单地说,就是如果函数有不多于4个参数,对应的用R0~R3来进行传递,多于4个时借助栈,函数的返回值通过R0来返回。二是在汇编中用EXPORT导出函数名,并用该函数名作为汇编代码段的标识,最后用mov pc, lr返回。然后,就可以在C语言中使用该函数了。一是在C语言中声明函数原型,并加extern关键字;建立strcpy.s代码,并加入工程中。原创 2023-08-03 21:50:16 · 1382 阅读 · 0 评论 -
在C语言中内嵌汇编语言
② 内嵌汇编指令中不要将R12~R14,R0~R3指定为指令中的物理寄存器,因为这些寄存器可能会存放中间结果或用于子程序调用;通常,内嵌汇编指令中不要指定物理寄存器。(3)R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0~R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器;④ C语言程序中的标号可以被内嵌汇编指令使用,但指令BL不能使用C语言的标号(B指令则可以);(2)在使用物理寄存器时,不要使用过于复杂的C语言表达式,避免物理寄存器冲突;原创 2023-08-02 18:46:57 · 1351 阅读 · 0 评论 -
汇编语言子程序调用
(1)将子程序的返回地址存放在连接寄存器LR中,同时将程序计数器PC指向子程序的入口点。(2)当子程序执行完毕需要返回调用处时,只需要将存放在LR中的返回地址重新复制给程序计数器PC即可。在ARM汇编语言程序中,子程序的调用一般是通过BL指令来实现的。在程序中,使用指令:BL+子程序名,即可完成子程序的调用。(3)在调用子程序的同时,也可以完成参数的传递和从子程序返回运算的结果,通常可以使用寄存器R0~R3完成。不同编译器编译的代码间的相互调用,要遵循AAPCS(ARM Architecture)。原创 2023-07-31 15:19:12 · 1357 阅读 · 0 评论 -
汇编语言的程序结构
段可以分为代码段(Code Section)和数据段(Data Section),代码段的内容为执行代码,数据段存放代码运行时需要用到的数据。在汇编语言程序中,用AREA伪操作定义一个段,并说明所定义段的相关属性,本例定义一个名为Init的代码段,属性为只读。ENTRY伪操作标识程序的入口点,接下来为指令序列,程序的末尾为END伪指令,该伪操作告诉编译器源文件的结束,每一个汇编程序段都必须有一条END伪操作,指示代码段的结束。(2)零个或多个数据段,数据段的属性为可读写。原创 2023-07-31 15:13:11 · 665 阅读 · 0 评论 -
汇编语言预定义寄存器和协处理器
下面列出了被ARM汇编器预定义的寄存器名。r0~r15和R0~R15(15个通用寄存器)。a1~a4(参数、结果或临时寄存器,同r0~r3)。v1~v8(变量寄存器,同r4~r11)。sb和SB(静态基址寄存器,同r9)。sl和SL(栈顶指针寄存器,同r10)。fp和FP(帧指针寄存器,同r11)。ip和IP(过程调用中间临时寄存器,同r12)。sp和SP(栈指针寄存器,同r13)。lr和LR(连接寄存器,同r14)。pc和PC(程序计数器,同r15)。原创 2023-07-30 22:22:14 · 405 阅读 · 0 评论 -
汇编语言程序中的表达式和运算符
十六进制数(hexadecimal-digits)可以是数字“0”到“9”和字母“A”到“F”的任意组合;整数表达式一般被计算为32位的整数,当此整数被定义为无符号数时,其取值范围为0~232-1,当被定义为有符号数时,其取值范围为-231~231-1。与逻辑表达式相关的运算符有“=”、“>”、“=”、“原创 2023-07-17 23:08:21 · 1093 阅读 · 0 评论 -
ARM汇编语言中的符号
如果在数字变量前面有一个代换操作符“$”,编译器会将该数字变量的值转换为十六进制的字符串,并将该十六进制的字符串代换“$”后的数字变量。字符串变量用于在程序的运行中保存一个字符串,但注意字符串的长度不应超出字符串变量所能表示的范围。在ARM汇编中,标号代表一个地址,段内标号的地址在汇编时确定,而段外标号地址值在链接时确定。数字变量用于在程序的运行中保存数字值,但注意数字值的大小不应超出数字变量所能表示的范围。如果在字符串变量前面有一个代换操作符“$”,编译器会将该字符串变量的值代换“$”后的字符串变量。原创 2023-07-02 23:09:22 · 493 阅读 · 0 评论 -
ARM汇编语言语句格式
在书写中,符号必须从一行的行头开始,前面不能包含空格或制表符tab。(5)comment:语句注释。)开头,注释的结尾即为一行的结尾。同时,如果一条语句太长,可将该长语句分为若干行来书写,在行的末尾用“\”表示下一行与本行为同一条语句。在汇编语言程序设计中,每一条指令的助记符可以全部用大写或全部用小写,但不允许在一条指令中大小写混用。(4)pseudo-instruction:ARM伪指令。(2)instruction:ARM或Thumb指令。ARM(Thumb)汇编语言语句格式如下所示。原创 2023-07-02 23:06:22 · 508 阅读 · 0 评论 -
ARM汇编器所支持的伪指令
ARM汇编器支持ARM伪指令,这些伪指令在汇编阶段被翻译成ARM或者Thumb(或Thumb-2)指令(或指令序列)。ARM伪指令不是ARM指令集中的指令,只是为了编程方便编译器定义了伪指令,使用时可以像其他ARM指令一样使用,但在编译时这些指令将被等效的ARM指令代替。ARM伪指令包含ADR、ADRL、MOV32和LDR。原创 2023-06-29 00:02:09 · 1024 阅读 · 0 评论 -
ARM汇编器所支持的伪操作 - 指令集选择伪操作
若在汇编源程序中同时包含ARM指令和Thumb指令时,可用CODE16伪指令通知编译器其后的指令序列为16位的Thumb指令,CODE32伪指令通知编译器其后的指令序列为32位的ARM指令。因此,在使用ARM指令和Thumb指令混合编程的代码里,可用这两条伪指令进行切换,但要注意它们只通知编译器其后指令的类型,并不能对处理器进行状态的切换。THUMB伪操作告诉汇编器下面的指令是32位Thumb-2指令或使用新语法的16位Thumb指令。ARM伪操作指示汇编器后面的指令为32位的ARM指令。原创 2023-06-11 10:00:55 · 851 阅读 · 0 评论 -
ARM汇编器所支持的伪操作 - 信息报告伪操作
如果numeric-expression的值为0,则通过第一遍汇编,并在第二遍汇编时报告“string-expression”的内容;如果numeric-expression的值不等于0,则在第一遍汇编过程中报告“string-expression”的内容,并中止汇编。ASSERT伪操作用于确保源程序在汇编时满足一定的条件。汇编诊断信息显示伪操作INFO用于在汇编器处理过程中的第一遍扫描或第二遍扫描时报告诊断信息。其中,logical-expression用于断言的逻辑表达式,其值为“真”或“假”。原创 2023-06-10 22:21:01 · 907 阅读 · 0 评论 -
ARM汇编器所支持的伪操作 - 汇编控制伪操作
在MACRO伪操作之后的第一行声明宏的原型,其中包含该宏定义的名称及需要的参数。包含在MACRO和MEND之间的指令序列称为宏定义体,在宏定义体的第一行应声明宏的原型(包含宏名、所需的参数),然后就可以在汇编程序中通过宏名来调用该指令序列。在源程序被编译时,汇编器将宏调用展开,用宏定义中的指令序列代替程序中的宏调用,并将实际参数的值传递给宏定义中的形式参数。当WHILE后面的逻辑表达式为“真”,则执行指令序列,该指令序列执行完毕后,再判断逻辑表达式的值,若为“真”则继续执行,一直到逻辑表达式的值为“假”。原创 2023-06-03 11:31:12 · 873 阅读 · 0 评论 -
ARM汇编器所支持的伪操作 - 数据定义伪操作
MAP伪操作用于定义一个结构化的内存表的首地址。MAP也可用“^”代替。表达式可以为程序中的标号或数学表达式,基址寄存器为可选项,当基址寄存器选项不存在时,表达式的值即为内存表的首地址,当该选项存在时,内存表的首地址为表达式的值与基址寄存器的和。语法格式如下。其中,expr:如果基地址寄存器(base-register)没有指定,expr表达式存储到结构化内存表首地址。如果表达式expr是“程序相关的(program-relative)”,则程序标号在使用前必须先定义。原创 2023-05-30 21:52:02 · 1796 阅读 · 0 评论 -
ARM汇编器所支持的伪操作 - 符号定义伪操作
符号定义伪操作用于定义ARM汇编程序中的变量、对变量赋值以及定义寄存器的别名等操作。用于定义全局变量的GBLA、GBLL和GBLS。用于定义局部变量的LCLA、LCLL和LCLS。用于对变量赋值的SETA、SETL、SETS。为通用寄存器列表定义名称的RLIST。(1)语法格式GBLA、GBLL和GBLS伪操作用于定义一个ARM程序中的全局变量,并将其初始化。GBLA伪操作用于定义一个全局的数字变量,并初始化为0;GBLL伪操作用于定义一个全局的逻辑变量,并初始化为F(假);原创 2023-05-19 22:16:35 · 1531 阅读 · 0 评论 -
ARM Thumb指令及应用
与ARM指令集相比较,Thumb指令集中的数据处理指令的操作数仍然是32位,指令地址也为32位,但Thumb指令集为实现16位的指令长度,舍弃了ARM指令集的一些特性,如大多数的Thumb指令是无条件执行的,而几乎所有的ARM指令都是有条件执行的;与等价的32位代码相比较,Thumb指令集在保留32代码优势的同时,大大节省了系统的存储空间。由于Thumb指令的长度为16位,即只用ARM指令一半的位数来实现同样的功能,所以,要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多。原创 2023-05-08 21:38:11 · 492 阅读 · 0 评论 -
ARM指令的寻址方式
ARM微处理器所支持的批量数据加载/存储指令可以一次在一片连续的存储器单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。采用多寄存器寻址方式,一条指令可以完成多个寄存器值的传送。在第二条指令中,将寄存器R1的内容加上4形成操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。在第三条指令中,以寄存器R1的内容作为操作数的有效地址,从而取得操作数存入寄存器R0中,然后,R1的内容自增4个字节。原创 2023-05-03 23:21:01 · 1726 阅读 · 0 评论 -
ARM异常产生指令
ARM微处理器所支持的异常指令有如下两条。原创 2023-05-03 22:32:40 · 438 阅读 · 0 评论 -
ARM协处理器指令
ARM微处理器可支持多达16个协处理器,用于各种协处理操作,在程序执行的过程中,每个协处理器只执行针对自身的协处理指令,忽略ARM处理器和其他协处理器的指令。ARM的协处理器指令主要用于ARM处理器初始化ARM协处理器的数据处理操作,以及在ARM处理器的寄存器和协处理器的寄存器之间传送数据,和在ARM协处理器的寄存器和存储器之间传送数据。ARM协处理器指令包括以下5条。原创 2023-05-03 22:21:06 · 1080 阅读 · 0 评论 -
ARM跳转指令
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令。原创 2023-05-02 15:36:29 · 1891 阅读 · 0 评论 -
ARM批量数据加载/存储指令
ARM微处理器所支持批量数据加载/存储指令可以一次在一片连续的存储单元和多个寄存器之间传送数据,批量加载指令用于将一片连续的存储器中的数据传送到多个寄存器,批量数据存储指令则完成相反的操作。LDM(或STM)指令用于从由基址寄存器所指示的一片连续存储器到寄存器列表所指示的多个寄存器之间传送数据,该指令的常见用途是将多个寄存器的内容入栈出栈。{∶}为可选后缀,若迭用该后缀,则当数据传递完毕之后,将最后的地址写入基址寄存器,否则基址寄存器的内容不变。将寄存器列表的寄存器(RO,R4到R12,LR) 存入堆栈。原创 2023-05-02 15:32:18 · 1501 阅读 · 0 评论 -
ARM乘法指令与乘加指令
ARM微处理器支持的乘法指令与乘加指令共有6条,可分为运算结果为32位和运算结果为64位两类,与前面的数据处理指令不同,指令中的所有操作数、目的寄存器必须为通用寄存器,不能对操作数使用立即数或被移位的寄存器,同时,目的寄存器和操作数1必须是不同的寄存器。原创 2023-05-02 15:29:35 · 1239 阅读 · 0 评论 -
ARM移位指令
ARM微处理器内嵌的桶型移位器(Barrel Shifter),支持数据的各种移位操作,移位操作在ARM指令集中不作为单独的指令使用,它只能作为指令格式中是一个字段,在汇编语言中表示为指令中的选项。例如,数据处理指令的第二个操作数为寄存器时,就可以加入移位操作选项对它进行各种移位操作。移位操作包括如下6种类型,ASL和LSL是等价的,可以自由互换。通用寄存器,LSL(或ASL) 操作数。通用寄存器,LSL(或ASL) 操作数。通用寄存器,LSR 操作数。通用寄存器,ROR 操作数。原创 2023-05-02 00:00:35 · 527 阅读 · 0 评论 -
ARM指令集
数据处理指令可分为数据传送指令、算术逻辑运算指令和比较指令等。数据传送指令用于在寄存器和存储器之间进行数据的双向传输。算术逻辑运算指令完成常用的算术与逻辑的运算,该类指令不但将运算结果保存在目的寄存器中,同时更新CPSR中的相应条件标志位。比较指令不保存运算结果,只更新CPSR中相应的条件标志位。原创 2023-05-01 23:56:52 · 3150 阅读 · 0 评论 -
ARM微处理器的指令集概述
ARM处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单。ARM微处理器的指令集是加载(Load)/存储(Store)型的,也即指令集仅能处理寄存器中的数据,而且处理结果都要放回寄存器中,而对系统存储器的访问则需要通过专门的加载/存储指令来完成。在ARM内部,所有ARM指令都是32位操作数,短的数据类型只有在数据传送类型指令中才被支持。当一个字节数据被取出后,被扩展到32位,在内部数据处理时,作为32位的值进行处理,并且ARM指令以字为边界。原创 2023-05-01 17:09:05 · 1433 阅读 · 0 评论 -
异常中断处理
异常或中断是用户程序中最基本的一种执行流程或形态。这部分主要对ARM架构下的异常中断做详细说明。ARM一共有7种类型的异常,按优先级从高到低的排列如下:复位异常(Reset)、数据异常(Data Abort)、快速中断异常(FIQ)、外部中断异常(IRQ)、预取异常(Prefetch Abort)、软件中断(SWI)和未定义指令异常(Undefined Instruction)。原创 2023-04-28 08:19:35 · 1224 阅读 · 0 评论 -
ARM寄存器组织
ARM处理器共有37个寄存器,被分为若干个组(BANK),这些寄存器均为32位的寄存器。6个状态寄存器,用以标识CPU的工作状态及程序的运行状态,虽然均为32位,但目前只使用了其中的一部分。同时,ARM处理器又有7种不同的处理器模式,在每一种处理器模式下均有一组相应的寄存器与之对应。在所有的寄存器中,有些是在7种处理器模式下共用的同一个物理寄存器,而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。相应的SPSR(saved program status register,SPSR)。原创 2023-04-26 23:59:39 · 1762 阅读 · 0 评论 -
ARM开发调试方法
用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可少的,。至于嵌入式实时操作系统、评估板等其他开发工具则可以根据应用软件规模和开发计划选用。使用集成开发环境开发基于ARM的应用软件,包括编辑、编译、汇编、链接等工作全部在计算机上即可完成,调试工作则需要配合其他的模块或产品方可完成,目前常见的调试方法有以下几种。原创 2023-04-26 23:53:49 · 1037 阅读 · 0 评论 -
I/O管理
而对真正存储器的读是幂等的(Idempotent)(可多次重复读,结果一致)。在存储器映射系统中,这些寄存器就像特定地址的存储器一样(在其他的系统组织中,I/O功能可能与存储器件有不同的寻址空间)。(3)控制寄存器(读/写):设置数据速率,管理RTS(请求发送)和其他类似信号。(5)状态寄存器(读/写):指示读数据是否有效,写缓存是否满等。(1)发送数据寄存器(只写):写入这个位置的数据被送往串行线。(2)接收数据寄存器(只读):保存从串行线送来的数据。(4)中断使能寄存器(读/写):控制中断的硬件事件。原创 2023-04-24 23:59:59 · 309 阅读 · 0 评论 -
ARM存储器
ARM处理器内核广泛应用于嵌入式系统和其他行业应用中。为了适应不同系统的需要,ARM采用了灵活多样的存储管理体系。从平板式内存映射到灵活方便的MMU内存管理单元,用户可以根据自己的需要使用不同的存储管理策略。原创 2023-04-24 23:57:34 · 423 阅读 · 0 评论 -
影响流水线性能的因素
跳转指令也会破坏流水线的行为,因为后续指令的取指步骤受到跳转目标计算的影响,因而必须推迟。但是,当跳转指令被译码时,在它被确认是跳转指令之前,后续的取指操作已经发生。但要注意,由于条件跳转与前一条指令的条件码结果有关,在这个流水线中,还会有条件转移的危险。如果处理器的指令非常复杂,每一条指令的行为都与下一条指令不同,那么就很难用流水线实现。流水线级数越多,问题就越严重。在典型的程序处理过程中,经常会遇到这样的情形,即一条指令的结果被用做下一条指令的操作数,下面通过一个简单的例子说明了在流水线上产生互锁。原创 2023-04-24 23:55:37 · 841 阅读 · 0 评论 -
6级流水线ARM组织
在ARM10中,将流水线的级数增加到6级,使系统的平均处理能力达到了1.3Dhrystone MISP/MHz。图2.9显示了6级流水线指令的执行过程。原创 2023-03-30 07:55:24 · 591 阅读 · 0 评论 -
5级流水线ARM组织
5级流水线中提前1级来读取指令操作数,得到的值是不同的,由此产生的代码不兼容是不容许的。在取指级增加的PC值被直接送到译码级的寄存器,穿过两级之间的流水线寄存器。把指令的执行分割为5部分而不是3部分,这就在每个时钟周期内增加了必须完成的工作量,进而可以使用更高的时钟频率,分开的指令和数据存储器使核的CPI明显减少。指定ARM7为止,在ARM核中使用的3级流水线的性价比是很高的。第一,可以提高时钟频率。时钟频率的提高,必然引起指令执行周期的缩短,所以要求简化流水线每一级的逻辑,因而流水线的级数就增加了。原创 2023-03-30 07:31:49 · 771 阅读 · 0 评论 -
3级流水线ARM组织概念
(1)处理器状态的寄存器堆(Register Bank):它有两个读端口和一个写端口,每个端口都可以访问任意寄存器,再加上专门访问程序计数器PC的一个附加读端口和一个附加写端口。(2)桶形移位寄存器(Barrel Shifter):它可以把一个操作数移位或循环移位任意位数。(3)ALU:完成指令集要求的算术或逻辑功能。(4)地址寄存器(Address Register)和增值器(Incrementer):它选择和保存所用的存储器地址,并在需要时产生顺序地址。原创 2023-03-29 08:13:16 · 1880 阅读 · 0 评论 -
ARM流水线的概念与原理
(1)从存储器读取指令(fetch);(2)译码以鉴别它是属于哪一条指令(dec);(3)从指令中提取指令的操作数(这些操作数往往存在于寄存器中)(reg);(4)将操作数进行组合以得到结果或存储器地址(ALU);(5)如果需要,则访问存储器以存储数据(mem);(6)将结果写回到寄存器堆(res)。并不是所有的指令都需要其中的每一个步骤,但是,多数指令需要其中的多个步骤。这些步骤往往使用不同的硬件功能,例如,ALU可能只在第4步中用到。原创 2023-03-29 08:08:42 · 631 阅读 · 0 评论 -
ARM公司发展史
ARM公司最初成立于1981年,Acorn计算机公司于1983年开始的发展计划的团队由Roger Wilson和Steve Furber带领,最初与英国广播公司合作为英国教育界设计小型机,着手开发一种新架构,类似进阶的MOS Technology 6502处理器。公司在英国布莱克本、剑桥和舍菲尔德,法国的Sophia Antipolis,以及美国加州Walnut Creek和德州奥斯丁设有研发中心,并在法国、德国、日本、韩国、中国台湾、以色列、英国和美国建立了销售、行政和技术支持办事处。原创 2023-03-27 08:14:11 · 891 阅读 · 0 评论 -
精简指令集结构(Reduced Instruction Set Computer,RISC)
(1)一些特定指令的周期数可变并非所有的ARM指令都是单周期的,如多寄存器转载/存储的Load/Store指令的周期数就不确定,必须根据被传送的寄存器个数而定。如果是访问连续的存储器地址,就可以改善性能,因为连续的存储器访问通常比随机访问要快。同时,代码密度也得到了提高,因为在函数的起始和结尾,多个寄存器的传输是很常用的操作。(2)内嵌桶形移位器产生更复杂的指令内嵌桶形移位器是一个硬件部件,在一个输入寄存器被一条指令使用之前,内嵌桶形移位器可以处理该寄存器中的数据。原创 2023-03-27 08:26:19 · 1120 阅读 · 0 评论 -
ARM的命名规则中后缀变量及其含义
ARM产品通常以ARM{x}{y}{z}{T}{D}{M}{I}{E}{J}{F}{-S}的形式出现。下图显示了ARM的命名规则中这些后缀的具体含义。原创 2023-03-27 08:17:52 · 600 阅读 · 0 评论