一文看懂LR寄存器及BXLR指令的两种用途
- 格式:docx
- 大小:36.87 KB
- 文档页数:2
1、简述诺依曼体系结构计算机的要点和工作过程。
答:诺依曼体系结构计算机的要点:计算机中的信息(程序和数据)以二进制方式表示。
程序预存储,机器自动执行。
计算机由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
计算机通过执行预存储在存储器中的程序来完成预定的运算。
程序由计算机的指令序列构成,计算机在处理器的控制下,首先从存储器读取一条待执行的指令到处理器中,接下来分析这条指令,而后发出该指令对应的电平脉码序列,即执行该指令。
并以此递归运行程序。
2、何谓总线?计算机中有哪几类总线?简述其用途。
答:计算机的总线(Bus)就是连接计算机硬件各部件,用于计算机硬件各部件之间信息传输的公共通道。
按照其传送信号的用途属性,总线可细分为:地址总线(Address Bus)、数据总线(Data Bus)和控制总线(Control Bus)三类。
♦地址总线(A_Bus):专用于在CPU、存储器和I/O端口间传送地址信息的信号线。
此类信号线传送的信息总是从CPU到存储器或I/O端口,它是单向信号线。
♦数据总线(D_Bus):专用于在CPU、存储器和I/O端口间传送数据信息的信号线。
此类信号线传送的信息可以是从CPU到存储器或I/O端口(“写”操作),也可能是从存储器或I/O端口到CPU(“读”操作),它是双向信号线。
♦控制总线(C_Bus):专用于CPU与其它部件之间传送控制信息和状态信息的信号线。
此类信号线的构成比较复杂,传送的控制、状态信息可以是从CPU到其它部件,也可能是从其它部件到CPU。
此类总线中的某些具体的线是单向的(或从CPU到其它部件,或反之),但作为总线来说,它是双向信号线。
3、中央处理器CPU是计算机的核心部件,主要功能是解释并执行计算机指令,完成数据处理和对计算机其他各部分进行控制。
存储器是计算机系统中用来存储程序和数据的信息记忆部件。
4、嵌入式系统:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
ARM的37个寄存器详解ARM寄存器ARM共有37个32位物理寄存器,7种⼯作模式下可访问的寄存器见下表,User和System使⽤完全相同的物理寄存器。
2.1 R0~R7所有⼯作模式下,R0-R7都分别指向同⼀个物理寄存器(共8个物理寄存器),它们未被系统⽤作特殊的⽤途。
在中断或异常处理进⾏⼯作模式转换时,由于不同⼯作模式均使⽤相同的物理寄存器,可能造成寄存器中数据的破坏。
2.2 R8~R12在User&System、IRQ、Svc、Abt和Und模式下访问的R8~R12都是同⼀个物理寄存器(共5个物理寄存器);在FIQ模式下,访问的R8_fiq~R12_fiq是另外独⽴的物理寄存器(共5个物理寄存器)。
2.3 R13和R14在User&System、IRQ、FIQ、Svc、Abt和Und访问的R13_~R14都是各⾃模式下独⽴的物理寄存器(共12个物理寄存器)。
R13在ARM指令中常⽤作堆栈指针(SP),但这只是⼀种习惯⽤法,⽤户也可使⽤其他的寄存器作为堆栈指针。
⽽在Thumb指令集中,某些指令强制性的要求使⽤R13作为堆栈指针。
由于处理器的每种⼯作模式均有⾃⼰独⽴的物理寄存器R13,在⽤户应⽤程序的初始化部分,⼀般都要初始化每种模式下的R13,使其指向该⼯作模式的栈空间。
这样,当程序进⼊异常模式时,可以将需要保护的寄存器放⼊R13所指向的堆栈,⽽当程序从异常模式返回时,则从对应的堆栈中恢复,采⽤这种⽅式可以保证异常发⽣后程序的正常执⾏。
R14称为链接寄存器(Link Register),当执⾏⼦程序调⽤指令(BL)时,R14可得到R15(程序计数器PC)的备份。
在每⼀种⼯作模式下,都可⽤R14保存⼦程序的返回地址,当⽤BL或BLX指令调⽤⼦程序时,将PC的当前值复制给R14,执⾏完⼦程序后,⼜将R14的值复制回PC,即可完成⼦程序的调⽤返回。
以上的描述可⽤指令完成。
执⾏以下任意⼀条指令:MOV PC, LRBX LR在⼦程序⼊⼝处使⽤以下指令将R14存⼊堆栈:STMFD SP!,{,LR}对应的,使⽤以下指令可以完成⼦程序返回:LDMFD SP!,{,PC}R14也可作为通⽤寄存器。
arm汇编程序退出方式1.引言概述部分的内容如下所示:1.1 概述ARM汇编语言是一种低级的程序设计语言,专门用于编写ARM架构下的机器指令。
与高级语言相比,ARM汇编语言更加底层且与硬件关联密切,可以直接操作寄存器、内存和设备等。
在编写ARM汇编程序时,了解如何正确退出程序是非常重要的。
程序的退出方式通常有两种:正常退出和异常退出。
正常退出是指程序在完成所需的任务后,通过一系列指令主动结束程序的执行。
异常退出是指在程序执行过程中发生了错误或异常情况,导致程序意外终止。
无论是正常退出还是异常退出,程序的结束都需要进行一系列的清理工作,如关闭文件、释放内存等,以确保程序能够正确退出并回收资源。
在ARM汇编程序中,正常退出通常通过以下几种方式实现:1. 返回指令:使用指令`BX LR`或`MOV PC, LR`将程序的执行流程返回到调用该函数的位置。
这通常用于函数的正常返回。
2. 终止指令:使用指令`MOV PC, 0`或`MOV PC, R0`将程序的执行流程直接跳转到地址0处,从而结束程序的执行。
这通常用于主程序的结束。
异常退出则需要通过异常处理机制来实现,例如使用相关的中断处理程序或异常处理程序。
当程序发生异常情况时,处理程序会根据异常类型进行相应的处理和清理工作,最终将程序的执行流程返回到预定的位置。
本文将重点讨论ARM汇编程序的退出方式,以及如何正确地进行清理工作,确保程序的正常退出和资源的释放。
在接下来的章节中,我们将详细介绍不同的退出方式,并提供示例代码以说明其用法和注意事项。
1.2文章结构1.2 文章结构本文将围绕ARM汇编程序的退出方式展开讨论。
首先在引言部分进行了概述,介绍了本文的背景和意义。
接着通过文章结构的说明,将向读者展示本文的组织架构和思路。
在正文部分,将重点讨论两个要点,分别是“第一个要点”和“第二个要点”。
通过详细的解释和实例分析,将阐明ARM汇编程序退出的不同方式及其相关的特点和优缺点。
寄存器的工作原理寄存器是计算机中一种重要的数据存储器件,用于暂时存储和处理数据。
它是由一组触发器构成的,每个触发器可以存储一个二进制位。
寄存器在计算机的运算和控制过程中发挥着重要的作用。
一、寄存器的分类寄存器可以根据其功能和用途进行分类。
常见的寄存器包括通用寄存器、专用寄存器和状态寄存器。
1. 通用寄存器:用于存储操作数和中间结果,供算术逻辑单元(ALU)进行运算。
通用寄存器的个数和位数根据计算机的设计而定,常见的有8位、16位、32位和64位寄存器。
2. 专用寄存器:用于特定的功能或任务,如程序计数器(PC)、指令寄存器(IR)、地址寄存器(AR)等。
这些寄存器在计算机的控制过程中起到关键的作用。
3. 状态寄存器:用于存储特定的状态信息,如零标志位(ZF)、进位标志位(CF)等。
这些标志位用于判断运算结果的特性,以便进行后续的操作。
二、寄存器的工作原理寄存器的工作原理可以分为存储和读取两个过程。
1. 存储过程:a. 输入数据:当需要将数据存储到寄存器中时,首先将数据输入到寄存器的输入端。
b. 写入触发:通过控制信号,触发寄存器的写入操作,将输入的数据写入到触发器中。
c. 存储数据:写入触发后,数据被存储在寄存器中,并保持稳定,直到下一次写入操作。
2. 读取过程:a. 选择寄存器:根据需要读取的数据,选择相应的寄存器。
b. 读取触发:通过控制信号,触发寄存器的读取操作。
c. 输出数据:读取触发后,寄存器中的数据被输出到输出端,供其他部件使用。
三、寄存器的应用寄存器在计算机系统中有广泛的应用,主要体现在以下几个方面:1. 数据存储:寄存器用于存储数据,包括操作数、中间结果和地址等。
通过寄存器的高速读写能力,提高了计算机的数据处理效率。
2. 控制信号:寄存器中的状态信息被用于控制计算机的运行。
例如,程序计数器(PC)存储下一条指令的地址,指令寄存器(IR)存储当前执行的指令,通过这些寄存器的状态变化,控制计算机的指令执行流程。
常⽤的ARM汇编指令转⾃:https:///zb861359/article/details/81027021?utm_source=app1、 IMPORT和EXPORTIMPORT ,定义表⽰这是⼀个外部变量的标号,不是在本程序定义的EXPORT ,表⽰本程序⾥⾯⽤到的变量提供给其他模块调⽤的。
以上两个在汇编和C语⾔混合编程的时候⽤到。
2、AREA语法格式:AREA 段名属性1 ,属性2 ,……AREA伪指令⽤于定义⼀个代码段或数据段。
其中,段名若以数字开头,则该段名需⽤“|”括起来,如:|1_test|。
属性字段表⽰该代码段(或数据段)的相关属性,多个属性⽤逗号分隔。
常⽤的属性如下:— CODE 属性:⽤于定义代码段,默认为READONLY 。
— DATA 属性:⽤于定义数据段,默认为READWRITE 。
— READONLY 属性:指定本段为只读,代码段默认为READONLY 。
— READWRITE 属性:指定本段为可读可写,数据段的默认属性为READWRITE 。
— ALIGN 属性:使⽤⽅式为ALIGN表达式。
在默认时,ELF(可执⾏连接⽂件)的代码段和数据段是按字对齐的,表达式的取值范围为0~31,相应的对齐⽅式为2表达式次⽅。
— COMMON 属性:该属性定义⼀个通⽤的段,不包含任何的⽤户代码和数据。
各源⽂件中同名的COMMON段共享同⼀段存储单元。
⼀个汇编语⾔程序⾄少要包含⼀个段,当程序太长时,也可以将程序分为多个代码段和数据段。
使⽤⽰例:AREA Init ,CODE ,READONLY ; 该伪指令定义了⼀个代码段,段名为Init ,属性为只读。
3、LDR、LDRB、LDRHARM微处理器⽀持加载/存储指令⽤于在寄存器和存储器之间传送数据,加载指令⽤于将存储器中的数据传送到寄存器,存储指令则完成相反的操作。
常⽤的加载存储指令如下:— LDR 字数据加载指令— LDRB 字节数据加载指令— LDRH 半字数据加载指令1) LDR指令有两种⽤法:a、ldr加载指令LDR指令的格式为:LDR{条件} ⽬的寄存器,<存储器地址>LDR指令⽤亍从存储器中将⼀个32位的字数据传送到⽬的寄存器中。
一文看懂LR寄存器的知识
不知你在DEBUG程序,又或者阅读操作系统源码时候有没细心观察,从一个普通子函数返回与异常(中断)返回的汇编指令都是BX LR,但是这两者的意义是一样的吗?这篇文章就来揭开LR寄存器的神秘面纱。
当单片机涉及函数跳转或者任务调度的时候,理解MCU如何处理堆栈与改变各个通用寄存器的状态尤为重要,下面就来比较一下在不同情况下LR寄存器的意义。
上图是一个简单的例子,当仿真点击“下一步”的时候,MCU就会执行BX LR指令,并且从aa子函数返回到main函数中,可以看到在普通子函数里执行BX LR的意义是“跳转到LR寄存器里的地址执行”。
寄存器的工作原理寄存器是计算机中用来存储和处理数据的一种重要组件。
它是一种高速的、临时的存储单元,用于暂时保存计算机运算过程中的数据和指令。
寄存器在计算机的运算过程中发挥着至关重要的作用,对于计算机的性能和功能起着决定性的影响。
一、寄存器的定义和分类寄存器是计算机中一种用来暂时存储数据的高速存储器件。
根据其功能和用途的不同,寄存器可以分为通用寄存器、专用寄存器和状态寄存器等几种类型。
1. 通用寄存器:通用寄存器是计算机中最常用的一种寄存器,用于存储临时数据和运算结果。
通用寄存器的数量和位数根据计算机的体系结构和指令集的设计而有所不同。
2. 专用寄存器:专用寄存器是用于特定目的的寄存器,例如程序计数器(PC)用于存储下一条指令的地址,指令寄存器(IR)用于存储当前正在执行的指令等。
3. 状态寄存器:状态寄存器用于存储计算机的状态信息,例如标志位寄存器(Flag Register)用于存储运算结果的状态信息,包括零标志位、进位标志位等。
二、寄存器的工作原理寄存器的工作原理可以分为存储和读取两个过程。
1. 存储过程:当计算机需要将数据存储到寄存器中时,首先需要将数据从主存储器(RAM)中读取出来,然后通过数据总线将数据传输到寄存器中。
在传输过程中,控制信号会使得寄存器的写使能端(WE)为高电平,使得寄存器接收并存储数据。
2. 读取过程:当计算机需要从寄存器中读取数据时,需要通过地址总线将寄存器的地址发送给控制器,控制器根据地址选择对应的寄存器,并通过数据总线将数据传输给计算机的其他部件。
在传输过程中,控制信号会使得寄存器的读使能端(RE)为高电平,使得寄存器输出数据。
三、寄存器的应用寄存器在计算机中有广泛的应用,主要包括以下几个方面:1. 数据存储:寄存器用于存储临时数据和运算结果,可以提供高速的数据存取速度,加快计算机的运行效率。
2. 指令存储:寄存器用于存储计算机指令,包括指令寄存器(IR)和程序计数器(PC)等。
[整理]寄存器详细讲解-------------寄存器32位CPU的寄存器结构寄存器是中央处理器内的组成部分。
寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。
在中央处理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序计数器(PC)。
在中央处理器的算术及逻辑部件中,包含的寄存器有累加器(ACC)。
目录编辑本段寄存器英文名称:Register寄存器寄存器是内存阶层中的最顶端,也是系统获得操作资料的最快速途径。
寄存器通常都是以他们可以保存的位元数量来估量,举例来说,一个“8 位元寄存器”或“32 位元寄存器”。
寄存器现在都以寄存器档案的方式来实作,但是他们也可能使用单独的正反器、高速的核心内存、薄膜内存以及在数种机器上的其他方式来实作出来。
寄存器通常都用来意指由一个指令之输出或输入可以直接索引到的暂存器群组。
更适当的是称他们为“架构寄存器”。
例如,x86 指令集定义八个32 位元寄存器的集合,但一个实作x86 指令集的CPU 可以包含比八个更多的寄存器。
寄存器是CPU内部的元件,寄存器拥有非常高的读写速度,所以在寄存器之间的数据传送非常快。
编辑本段分类数据寄存器- 用来储存整数数字(参考以下的浮点寄存器)。
在某些简单/旧的CPU,特别的数据寄存寄存器器是累加器,作为数学计算之用。
地址寄存器- 持有存储器地址,以及用来访问存储器。
在某些简单/旧的CPU里,特别的地址寄存器是索引寄存器(可能出现一个或多个)。
通用目的寄存器(GPRs)- 可以保存数据或地址两者,也就是说他们是结合数据/地址寄存器的功用。
浮点寄存器(FPRs) - 用来储存浮点数字。
常数寄存器- 用来持有只读的数值(例如0、1、圆周率等等)。
向量寄存器- 用来储存由向量处理器运行SIMD(Single Instruction, Multiple Data)指令所得到的数据。
特殊目的寄存器- 储存CPU内部的数据,像是程序计数器(或称为指令指针),堆栈寄存器,以及状态寄存器(或称微处理器状态字组)。
ARM汇编指令集一、跳转指令跳转指令用于实现程序流程的跳转,在ARM程序中有两种方法可以实现程序流程的跳转:Ⅰ.使用专门的跳转指令。
Ⅱ.直接向程序计数器PC写入跳转地址值。
通过向程序计数器PC写入跳转地址值,可以实现在4GB的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC等类似指令,可以保存将来的返回地址值,从而实现在4GB连续的线性地址空间的子程序调用。
ARM指令集中的跳转指令可以完成从当前指令向前或向后的32MB的地址空间的跳转,包括以下4条指令:1、B指令B指令的格式为:B{条件} 目标地址B指令是最简单的跳转指令。
一旦遇到一个B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继续执行。
注意存储在跳转指令中的实际值是相对当前PC值的一个偏移量,而不是一个绝对地址,它的值由汇编器来计算(参考寻址方式中的相对寻址)。
它是24 位有符号数,左移两位后有符号扩展为32 位,表示的有效偏移为26 位(前后32MB的地址空间)。
以下指令:B Label ;程序无条件跳转到标号Label处执行CMP R1,#0 ;当CPSR寄存器中的Z条件码置位时,程序跳转到标号Label 处执行BEQ Label2、BL指令BL指令的格式为:BL{条件} 目标地址BL 是另一个跳转指令,但跳转之前,会在寄存器R14中保存PC的当前内容,因此,可以通过将R14 的内容重新加载到PC中,来返回到跳转指令之后的那个指令处执行。
该指令是实现子程序调用的一个基本但常用的手段。
以下指令:BL Label ;当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14中3、BLX指令BLX指令的格式为:BLX 目标地址BLX指令从ARM指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb状态,该指令同时将PC的当前内容保存到寄存器R14中。
因此,当子程序使用Thumb指令集,而调用者使用ARM指令集时,可以通过BLX指令实现子程序的调用和处理器工作状态的切换。
单击,返回主页,查看更多内容ARM的汇编编程,本质上就是针对CPU寄存器的编程,所以我们首先要弄清楚ARM有哪些寄存器?这些寄存器都是如何使用的?ARM寄存器分为2类,普通寄存器和状态寄存器寄存器类别寄存器在汇编中的名称各模式下实际访问的寄存器用户系统管理中止未定义中断快中断通用寄存器和程序计数器R0(a1) R0R1(a2) R1R2(a3) R2R3(a4) R3R4(v1) R4R5(v2) R5R6(v3) R6R7(v4) R7R8(v5) R8 R8_fiq请看上表的第2列,普通寄存器总共16个,分别为R0-R15;状态寄存器共2个,分别为CPSR和SPSR普通寄存器中特别要提出来的是R13、R14、R15。
R15别名PC(program counter),中文称为程序计数器,它的值是当前正在执行的指令在内存中的位置(不考虑流水线的影响,参见流水线对PC值的影响一文),而当指令执行结束后,CPU硬件会自动将PC的值加上一个单位,从而使得PC的值为下一条即将执行的指令在内存中的位置,这样CPU硬件就可以根据PC的值自动完成取指的操作。
正是由于有PC的存在,以及CPU硬件会自动增加PC的值,并根据PC的值完成取指操作,才使得CPU一旦上电就永不停歇地运转,由此可见PC寄存器对于计算机的重要性。
对于我们进行汇编程序编写而言,PC寄存器亦是十分重要,因为当程序员通过汇编指令完成了对PC寄存器的赋值操作的时候,其实就是完成了一次无条件跳转,这一点非常重要,请务必要牢记。
R14别名LR(linked register),中文称为链接寄存器,它与子程序调用密切相关,用于存放子程序的返回地址,它是ARM程序实现子程序调用的关键所在。
下面我们用C语言中对子程序调用的实现细节来说明LR是如何被使用的。
1 intmain(void)2 {3 int k, i = 1, j = 2;4 addsub(i, j);5 k = 3;6 }7 intaddsub(int a, int b)8 {9 int c;10 c = a + b;11 return c;12 }对于上面的程序,编译器会将第4行编译为指令:BL addsub,将第11行编译为指令:MOV pc, lr。
ARM中的lr寄存器/***********摘⾃《ARM LR寄存器https:///fivedoumi/article/details/50446444》********************/异常的发⽣会导致程序正常运⾏的被打断,并将控制流转移到相应的异常处理(异常响应),有些异常(fiq、irq)事件处理后,系统还希望能回到当初异常发⽣时被打断的源程序断点处继续完成源程序的执⾏(异常返回),这就需要⼀种解决⽅案,⽤于记录源程序的断点位置,以便正确的异常返回。
类似的还有⼦程序的调⽤和返回。
在主程序中(通过⼦程序调⽤指令)调⽤⼦程序时,也需要记录下主程序中的调⽤点位置,以便将来的⼦程序的返回。
在ARM处理器中使⽤ R14实现对断点和调⽤点的记录,即使⽤R14⽤作返回连接寄存器(LR)。
在硬件上和指令执⾏上,CPU ⾃动完成相应返回点的记录。
在ARM 汇编语⾔程序设计时,R14和LR通⽤。
ARM处理器相应异常时,会⾃动完成将当前的PC保存到LR寄存器。
//注意:发⽣异常时进⼊异常程序时,LR中保存的不是断点下⼀条指令,⽽是直接将PC保存到 LR中,不是将PC-4保存到LR中。
ARM处理器执⾏⼦程序调⽤指令(BL )时,会⾃动完成将当前的PC的值减去4的结果数据保存到LR寄存器。
即将调⽤指令的下紧邻指令的地址保存到LR。
ARM处理器针对不同的模式,共有6个链接寄存器资源(LR ),其中⽤户模式和系统模式共⽤⼀个 LR,每种异常模式都有各⾃专⽤的R14 寄存器(LR )。
这些链接寄存器分别为 R14、R14_svc、R14_abt、R14_und、R14_irq、R14_fiq,程序设计者要清晰处理器的模式与相应寄存器的对应关系,都是使⽤ R14,但不同模式下的R14 不是同⼀个物理资源,其内容可能天壤之别。
R14 不⽤做链接寄存器(LR )时,也可以⽤做通⽤数据寄存器。
PC 代表程序计数器,流⽔线使⽤三个阶段,因此指令分为三个阶段执⾏:1.取指(从存储器装载⼀条指令);2.译码(识别将要被执⾏的指令);3.执⾏(处理指令并将结果写回寄存器)。
ARM指令集ARM指令的基本格式ARM指令的基本格式为:<Opcode> {<Cond>} {S} <Rd>, <Rn> { , <Opcode2> }其中,<>内的项是必需的,{}内的项是可选的。
1)Opcode项Opcode是指令助记符,即操作码,说明指令需要执⾏的操作,在指令中是必需的。
2)Cond项(command)Cond项表明了指令的执⾏的条件,每⼀条ARM指令都可以在规定的条件下执⾏,每条ARM指令包含4位的条件码,位于指令的最⾼4位[31:28]。
条件码共有16种,每种条件码⽤2个字符表⽰,这两个字符可以添加⾄指令助记符的后⾯,与指令同时使⽤。
当指令的执⾏条件满⾜时,指令才被执⾏,否则指令被忽略。
如果在指令后不写条件码,则使⽤默认条件AL(⽆条件执⾏)。
指令的条件码条件码助记符后缀标志含义0000 EQ Z置位相等equal0001 NE Z清零不相等not equal0010 CS C置位⽆符号数⼤于或等于Carry Set0011 CC C清零⽆符号数⼩于0100 MI N置位负数minus0101 PL N清零正数或零plus0110 VS V置位溢出0111 VC V清零没有溢出1000 HI C置位Z清零⽆符号数⼤于high1001 LS Z置位C清零⽆符号数⼩于或等于less1010 GE N等于V 带符号数⼤于或等于1011 LT N不等于V 带符号数⼩于least1100 GT Z清零且(N等于V)带符号数⼤于great1101 LE Z清零或(N不等于V)带符号数⼩于或等于1110 AL 忽略⽆条件执⾏all1111条件码应⽤举例:例:⽐较两个值⼤⼩,并进⾏相应加1处理,C语⾔代码为:if ( a > b ) a++;else b++;对应的ARM指令如下(其中R0中保存a 的值,R1中保存b的值):CMP R0, R1 ; R0与R1⽐较,做R0-R1的操作ADDHI R0, R0, #1 ;若R0 > R1, 则R0 = R0 + 1ADDLS R1, R1, #1 ; 若R0 <= R1, 则R1 = R1 + 1CMP⽐较指令,⽤于把⼀个寄存器的内容和另⼀个寄存器的内容或⼀个⽴即数进⾏⽐较,同时更新CPSR中条件标志位的值。
汇编寄存器功能详解汇编语言是一种底层语言,与计算机硬件直接交互。
在汇编语言中,寄存器是一组特殊的存储单元,用于暂时存储数据或指令。
它们在处理器中的位置较为接近,可以快速访问。
在汇编语言中,寄存器被分为通用寄存器、数据段寄存器、指令指针寄存器、标志寄存器等几个类别,每个寄存器都有特定的功能。
一、通用寄存器通用寄存器是CPU中最常见的寄存器,用于存放临时数据和计算的结果。
通用寄存器是命名的,有固定的用途,分别是AX(累加寄存器)、BX(基址寄存器)、CX(计数寄存器)、DX(数据寄存器)、SI(源变址寄存器)、DI(目的变址寄存器)、SP(堆栈指针寄存器)和BP(基址指针寄存器)。
1. AX寄存器(Accumulator Register):是累加器寄存器,用于存放算术和逻辑运算的结果。
在一些特定指令中,它还可以充当乘法或除法运算的除数或被除数。
2. BX寄存器(Base Register):是基址寄存器,通常用于存放数据内存的基址。
它也可以充当累加器或存放地址偏移量的累加器。
3. CX寄存器(Count Register):是计数寄存器,在一些循环指令中用于记录循环迭代的次数。
此外,它还可以充当数据传输或移位指令的位数计数器。
4. DX寄存器(Data Register):是数据寄存器,通常用于存放数据操作的源数据或目标数据。
它也可以存放除法运算的余数或乘法运算的高位结果。
5. SI寄存器(Source Index Register):是源变址寄存器,用于存放源数据的偏移地址。
在字符串或数组的操作中,它通常与DI寄存器共同使用。
6. DI寄存器(Destination Index Register):是目的变址寄存器,用于存放目标数据的偏移地址。
在字符串或数组的操作中,它通常与SI寄存器共同使用。
7. SP寄存器(Stack Pointer Register):是堆栈指针寄存器,用于指向栈顶位置。
寄存器的工作原理寄存器是计算机中的一种重要的存储设备,用于暂时存储和处理数据。
它是由若干个存储单元组成的,每个存储单元能够存储一个固定长度的二进制数据。
寄存器在计算机中起到了非常关键的作用,它们用于存储指令、数据和地址等信息,是计算机进行数据处理和运算的基础。
一、寄存器的分类根据功能和使用方式的不同,寄存器可以分为以下几种类型:1. 通用寄存器:用于存储临时数据和运算结果,供计算机进行各种运算和逻辑操作使用。
2. 累加器:用于存储运算结果,特别用于算术和逻辑运算。
3. 数据寄存器:用于存储数据,包括输入和输出数据。
4. 地址寄存器:用于存储指令或数据的地址。
5. 状态寄存器:用于存储运算结果的状态信息,如溢出、零标志等。
二、寄存器的工作原理寄存器的工作原理主要包括存储、读取和写入三个过程。
1. 存储:在计算机执行指令或运算时,需要将数据暂时存储到寄存器中。
存储过程可以通过将数据输入到寄存器的输入端口来完成。
数据经过输入端口进入寄存器后,会被存储到寄存器的存储单元中。
2. 读取:当计算机需要使用寄存器中的数据时,可以通过读取操作将数据从寄存器中取出。
读取过程可以通过将数据从寄存器的输出端口输出来完成。
输出的数据可以供其他部件或者运算单元进行进一步的处理。
3. 写入:当计算机需要将数据写入到寄存器中时,可以通过写入操作将数据传输到寄存器的输入端口。
写入操作可以覆盖原有的数据,也可以追加到原有的数据之后。
寄存器的工作原理是基于电子元件的工作原理实现的。
寄存器内部的存储单元是由触发器构成的,触发器是一种能够存储一个位或多个位的电子元件。
触发器的状态可以由输入信号的变化来改变,从而实现数据的存储和传输。
寄存器的工作原理还涉及到时钟信号的控制。
时钟信号用于同步寄存器的读写操作,保证数据的稳定性和正确性。
时钟信号的变化可以触发寄存器的读写操作,使得数据能够按照指定的时序进行存储和传输。
三、寄存器的应用寄存器在计算机中有广泛的应用,它们是计算机的重要组成部分,用于支持计算机的各种功能和操作。
查看文章PowerPC常用指令2009年05月14日星期四 22:20 指令缩写-------------------------st = storeld = loadr = rightl = left 或者 logicalw = wordu = updatem = movef = from 或者 fieldt = to 或者 thani = Immediateh = half wordz = zerob = branchn = andcmp = comparesub = subtractclr = clearcr = condition registerlr = link registerctr = couter registerstwu = STore Word witch Updatestwu r1, <-frame_size>(r1)--------------------------------在GDB/IDA汇编中通常写成stwu %sp, -0×20(%sp)意思是,先将SP放入到(SP-20)这个内存地址然后SP = SP - 20;从特殊寄存器取值的扩展助记符-------------------------mflr = Move From Link Registermflr rt 等同于 mfspr rt,8将连接寄存器的值放到RT一般是mflr %r0存值到特殊寄存器的扩展助记符-------------------------mtctr = Move To Counter Registermtctr rs 等同 mtspr 9,rs将RS的值放入到计数寄存器mtcrf = Move to Condition Register Fields mtcrf FXM, RS按照掩码FXM,复制Rs的内容到CRFXM是8位,控制 RS的32位(8组,共32位)复制过去,也就是说 FXM的1位,可以控制Rs的4位一位掩码控制一组CR条件寄存器扩展助记符-------------------------crclr = Control Register CLeaRcrclr bx 等同于 crxor bx, bx, bx 作用是将条件寄存器相应的位清零例如crclr so 等同于 crxor 3, 3, 3 将CR0的SO位(第3位)清零crclr 4*cr3+eq 等同于 crxor 14, 14, 14 将CR3的EQ位清零比较指令-------------------------cmpli = Compare Logical Immediatecmplwi bf, ra, ui 等同于 cmpli bf, 0, ra, uiCompare Logical Word Immediate所谓逻辑比较,就是同无符号整数比较存储指令-------------------------sth = Store Half 并且是存储高位 (16-31位)载入指令-------------------------lhz = Load Half and Zero 载入半字并将高16位清零lwzx = Load Word and Zero Indexed 意思是 lwzx RT, RA, RB (Ra+Rb就是地址)跳转-------------------------bccl = bctrl (有别名的助记符)Branch Conditional to Count Register条件跳转到计数寄存器指定的地址逻辑操作-------------------------ori 或者 oril = OR Immediate 同16位立即数进行或操作循环掩码操作循环左移然后进行掩码操作是PowerPC指令集的精华,包含了一组非常强大的指令集移位指令-------------------------slwi = Shift left immediate 左移几位(位数用立即数表示)rotlwi = Rotate left immediate 循环左移抽取-------------------------extrwi = Extract and right justify immediate例如 extrwi RX, RY, 1, 0等同于 rlwinm RX, RY, 1, 31, 31rlwinm or rlinm (Rotate Left Word Immediate Then AND with Mask)清除-------------------------clrlwi = Clear left immediate怪异清除clrlslwi = Clear (Left Word) and Shift Left clrlslwi %r0, %r0, 24,8 等同于rlwinm RA, RS, 24-8, 31-24 =rlwinm Ra, Rs, 16, 7rlwinm RA, RS, SH, MB, ME将R0向左循环移动掩码是 [8, 15]影响CR的运算-------------------------如果Overflow Exception(OE)设置1,那么结果影响定点异常寄存器的Summary Overflow(SO)和 Overflow(OV),助记符是后面加o, addo如果Record(Rc)设置1,那么结果影响Less Than(LT) zero, Greater Than (GT) zero, Equal To (EQ) zero,和Summary Overflow (SO)等条件寄存器CR助记符是后面加”点” add.算术运算-------------------------注意方向subf = Subtract From 注意,被减数是后面的那个寄存器计数器循环在扩展助记符中,计数寄存器的语义可以通过在b后面立即添加dz或 dnz来指定。
汇编语⾔-05[BX]和loop指令[bx]和内存单元的描述内存单元mov ax,[0]将⼀个内存单元的内容送⼊ax,这个内存单元的长度为2字节(字单元),存放⼀个字,偏移地址为0, 段地址在ds中。
mov al,[0]将⼀个内存单元的内容送⼊al,这个内存单元的长度为1字节(字节单元),存放⼀个字节,偏移地址为0,段地址在ds中。
要完整地描述⼀个内存单元,需要两种信息:1.内存单元的地址;2.内存单元的长度(类型)。
⽤[0]表⽰⼀个内存单元时,0表⽰单元的偏移地址,段地址默认在ds中,单元的长度(类型)可以由具体指令中的其他操作对象(⽐如说寄存器)指出。
[bx][bx]同样也表⽰⼀个内存单元,它的偏移地址在bx 中,⽐如下⾯的指令:mov ax,[bx]将⼀个内存单元的内容送⼊ax,这个内存单元的长度为2字节(字单元),存放⼀个字,偏移地址在bx中,段地址在ds中。
mov al,[bx]将⼀个内存单元的内容送⼊al,这个内存单元的长度为1字节(字节单元),存放⼀个字节,偏移地址在bx中,段地址在ds中。
loop循环指令符号"()”使⽤⼀个描述性的符号”()”来表⽰⼀个寄存器或⼀个内存单元中的内容。
(ax)表⽰ax中的内容、(al)表⽰al中的内容;(20000H)表⽰内存20000H 单元的内容(()中的内存单元的地址为物理地址);((ds)*16+(bx))表⽰:ds中的内容为ADR1,bx中的内容为ADR2,内存ADR1 x16 +ADR2单元的内容。
或者ds中的ADR1作为段地址,bx中的ADR2作为偏移地址,内存ADR1:ADR2单元的内容。
”()”中的元素可以有3 种类型: 1.寄存器名; 2.段寄存器名; 3.内存单元的物理地址(⼀个20 位数据)。
(ax)、(ds)、(al)、(ex)、(20000H)、((ds)*16+(bx))等是正确的⽤法;(2000:0)、((ds):1000H)等是不正确的⽤法,这⾥没有计算出物理地址。
各寄存器的作⽤各寄存器的作⽤============通⽤寄存器EAX累加(Accumulator)寄存器AX(AH、AL)常⽤于乘、除法和函数返回值EBX基址(Base)寄存器BX(BH、BL)常做内存数据的指针, 或者说常以它为基址来访问内存.ECX计数器(Counter)寄存器CX(CH、CL)常做字符串和循环操作中的计数器EDX数据(Data)寄存器DX(DH、DL)常⽤于乘、除法和 I/O 指针ESI来源索引(Source Index)寄存器SI常做内存数据指针和源字符串指针EDI⽬的索引(Destination Index)寄存器DI常做内存数据指针和⽬的字符串指针ESP堆栈指针(Stack Point)寄存器SP只做堆栈的栈顶指针; 不能⽤于算术运算与数据传送EBP基址指针(Base Point)寄存器BP只做堆栈指针, 可以访问堆栈内任意地址, 经常⽤于中转 ESP 中的数据, 也常以它为基址来访问堆栈; 不能⽤于算术运算与数据传送指令指针寄存器EIP指令指针(Instruction Pointer)寄存器总是指向下⼀条指令的地址; 所有已执⾏的指令都被它指向过.标志寄存器EFLAGS 标志(Flag)寄存器:EFLAGS 中的 32 位被分成 0-31 个⼆进制位分别使⽤;第 0、2、4、6、7、11 位是状态标志位;第 10 位是字符串操作控制标志位;其他标志位⼀般不⽤或⽆权使⽤0CF进位(Carry)标志⽬标⽆法容纳⽆符号算术运算的结果, 需要进位或借位时被设置;可⽤ STC 指令设置, CLC 指令取消.12PF奇偶(Parity)标志低 8 位中有偶数个 1 时被设置34AF辅助(Auxiliary)标志使⽤ BCD 码运算导致 3 位到 4 位产⽣进位时被设置56ZF零(Zero)标志运算结果为 0 时被设置7SF符号(Sign)标志运算结果为负数时被设置8910DF⽅向(Direction)标志字符串操作是从⾼位到低位时被设置; 可⽤ STD 指令设置, CLD 指令取消.11OF溢出(Overflow)标志因有符号运算的结果太宽⽽导致数据丢失时被设置...31...其中的 EAX、ECX、EDX 三个寄存器相对⾃由些, 所以练习时⽤它们较多.没理会段寄存器: CS、DS、SS、ES、FS、GS, 是因在 Win32 保护模式下编程它们不再重要了.还有 FPU、MMX 系列寄存器, 等⽤到再说吧.4个数据寄存器(EAX、EBX、ECX、EDX)2个变址和指针寄存器(ESI、EDI)2个指针寄存器(ESP、EBP)6个段寄存器(ES、CS、SS、DS、FS、GS)1个指令指针寄存器(EIP)1个标志寄存器(EFL)1、数据寄存器数据寄存器主要⽤来保存操作数和运算结果等信息,从⽽节省读取操作数所需占⽤总线和访问存储器的时间。
常见寄存器名称及作用(A~L)常见寄存器名称及作用(A~L)本汇总主要供个人学习使用,如果大家觉得方便自己学习尽可以拿去用,为了查阅方便,本表格按照字母顺序排序,若有错误之处希望大家予以指出!谢谢!名称作用备注AC AC=1且CR0的AM=1时进行对其校验alignment check(80486新增,包含于EFLAGS中)AF 指令执行后,在低4位产生进位或错位则AF=1.否则AF=0auxiliary carry flag,辅助进位标志(包含于FLAGS中)AH AX的高位AL AX的低位AM AM=AC=1时,允许对界检查,否则禁止alignment mask(包含于CR0中)AX 算术运算主存储器accumulator,累加器BH BX的高位BL BX的低位BP 用来提供堆栈中某指定单元的偏移地址作为基地址使用base pointer,基址指针BX 用于存放数据段内存空间的地址base,基址寄存器cache 存放描述符信息的高速缓存,包括段描述符、LDT描述符和TSS描述符描述符(程序不可见)CD CD=1则禁止高速缓存,NW=CD=0则cache工作正常cache disable(包含于CR0中)CF 指令执行后,在最高为产生进位或错位则CF=1。
否则CF=0carry flag,进位标志CH CX的高位CL CX的低位CS 用来存放代码段起始地址的高16位coude segment,代码段寄存器CX 用于循环操作和数据串处理的技术控制Count,计数寄存器DE DE=1则允许对I/O断点调试扩展debugging extensions(包含于CR4中)DF DF=1则数据串操作时变址寄存器中的内容是自动减量,DF=0则为增量direction flag,方向标志(包含于FLAGS中)DH DX的高位DI 串操作时提供ES段中指定单元的偏移地址destination index,目标变址寄存器DL DX的低位DS 用来存放数据段起始地址的高16位data segment,数据段寄存器DX 用于乘除法时扩展累加器及I/O操作时提供端口地址data,数据寄存器EAX AX的32位扩展80386新增EBP BP的32位扩展80386新增EBX BX的32位扩展80386新增ECX CX的32位扩展80386新增EDI DI的32位扩展80386新增EDX DX的32位扩展80386新增EIP IP的32位扩展80386新增EM EM=1表示处理器内部无FPU,使用软件模拟器执行数学运算emulation(包含于CR0中)ES 用来存放附加段起始地址的高16位extra segment,附加段寄存器ESI SI的32位扩展80386新增ESP SP的32位扩展80386新增ET 从Pentium Pro开始ET固定为1,表示处理器内部有FPUextension type(包含于CR0中)FS 附加段寄存器Pentium新增GDTR 设置全局描述符表GDT的基地址和界限全局描述符表寄存器(程序不可见)GS 附加段寄存器Pentium新增ID ID=1表示Pentium支持CPU ID指令identification(Pentium 4新增,包含于EFLAGS中)IDTR 设置中断描述符表IDT的基地址和界限中断描述符表寄存器(程序不可见)IF IF=1则允许中断,IF=0则禁止中断interrupt enable flag,中断允许标志(包含于FLAGS中)IOPL 指示当前运行程序或任务的I/O特权级I/O privilege level field(2位,80286新增,包含于EFLAGS中)IP 用来存放CS段中指令的偏移地址,是一个16位寄存器LDTR 存放LDT描述符的选择子局部描述符表寄存器(程序不可见)。
GPIOB_BASE是一个地址,这个地址是GPIOB一系列寄存器的首地址,后面地址依次是GPIOB 的寄存器,将这个地址转换为结构体形式,并将后面寄存器按顺序定义在结构体里面,这样访问寄存器就可以通过引用结构体的形式了而不必书写寄存器的地址来访问寄存器。
寄存器用途:
1.可将寄存器内的数据执行算术及逻辑运算;
2.存于寄存器内的地址可用来指向内存的某个位置,即寻址;
3.可以用来读写数据到电脑的周边设备。
AX 累加器,得名原因是最初常使用ADD AX,n这样的指令
CX 计数器,得名原因是最常使用CX的值作为重复操作的次数
BX 常用作地址寄存器,如MOV AX,[BX],把BX所指地址中的数取到AX中去
DX 通用寄存器
所讲的寄存器都是以x86为基础的,那么这种CPU内,寄存器可分为以下几种:
1.EAX、EBX、ECX、EDX等通用寄存器——从通用上来讲,它所存储的东西,只要它的容积所容许的话,什么都是可以存储的;
2.CS、SS、ES等段寄存器——它所存储的只能是地址,它的作用是从寻址上可以体现出来;
3.EIP,也称为指令指针
4.EFLAGS寄存器,俗称为标志寄存器——所存储的是与CPU的每一个执行的指令有关。
是关系到CPU每一个指令的执行相关内容与特殊的关联,即CPU所执行的指令是否违规,它的指令是否有进位,它的指令是否有溢出,都是在标志寄存器中能表现与表达出来;
5.浮点单元,这里面之所以只浮点单元,是因为在它里面还有一些小的寄存分类,主要是数学上的浮点上的计算
6.MMX指令使用的8个64位寄存器
7.单指令、多数据操作(SIMD,single-instruction,multiple-data)使用的8个128位XMM寄存器。
一文看懂LR寄存器及BXLR指令的两种用途LR寄存器是ARM体系结构中的一个特殊寄存器,全称为Link Register。
在函数调用和返回过程中,LR寄存器具有重要的作用。
LR寄存器有两种常见的用途,同时也和BXLR指令密切相关。
首先,LR寄存器用于函数调用的链接。
当一个函数被调用时,调用指令通常会将下一条指令的地址存储到LR寄存器中。
这样,当函数执行完毕后,可以通过BXLR指令将程序控制权返回到原来的调用点。
在函数返回时,BXLR指令会将LR中保存的地址加载到程序计数器(PC)中,从而实现函数的返回。
其次,LR寄存器还用于存储异常返回地址。
当处理器进入异常处理模式(如中断或异常)时,处理器会将PC的值保存到LR寄存器中,然后跳转到异常处理程序。
而当异常处理程序执行完毕时,通过BXLR指令将LR中保存的异常返回地址加载到PC中,从而实现从异常处理返回到原来的程序。
综上所述,LR寄存器在函数调用和返回过程中起着关键的作用。
在函数调用时,LR寄存器存储下一条指令的地址,并通过BXLR指令返回到原来的调用点;在异常处理时,LR寄存器存储PC的值,并通过BXLR指令返回到原来的程序。
BXLR指令是ARM指令集中的一条特殊指令,用于将程序控制权返回到一些地址。
BXLR指令的使用需要结合LR寄存器来完成,在函数调用和异常处理两个场景中有不同的用途。
在函数调用中,BXLR指令用于将程序控制权返回到LR寄存器中保存的地址,即函数调用的返回点。
当函数执行完毕后,通过BXLR指令从函数返回到原来的调用点,继续执行后续指令。
在异常处理中,BXLR指令用于将程序控制权返回到LR寄存器中保存的异常返回地址,即异常处理的返回点。
当异常处理程序执行完毕后,通过BXLR指令从异常处理返回到原来的程序,继续执行后续指令。
需要注意的是,BXLR指令只能在ARM状态下使用,无法在Thumb状态下使用。
在Thumb状态下,可以通过BLX指令实现相似的功能,即将程序控制权返回到一些地址。
综上所述,LR寄存器和BXLR指令在函数调用和异常处理中具有重要的作用。
LR寄存器用于存储返回地址,而BXLR指令用于实现函数调用和异常处理的返回。
这种设计可以简化函数调用和异常处理的逻辑,提高了系统的可维护性和可扩展性。