实验二:ARM指令集-条件执行
- 格式:doc
- 大小:81.00 KB
- 文档页数:3
arm 条件分支指令ARM条件分支指令是一种在程序中根据条件进行跳转的指令。
它根据条件的满足与否来判断是否执行跳转操作,从而实现程序的控制流程。
本文将介绍ARM条件分支指令的基本用法和常见的几种条件分支指令。
一、ARM条件分支指令的基本用法在ARM架构中,条件分支指令的格式如下所示:```B{cond} label```其中,B表示分支指令,cond是条件码,label是分支目标的标签。
条件码决定了分支是否执行的条件,它由程序状态寄存器(CPSR)中的标志位来决定。
二、常见的条件分支指令1. BEQ(条件码:Z=1)BEQ指令用于判断前一条指令执行的结果是否为零,如果为零则执行跳转操作。
例如:```CMP r1, #0BEQ label```上述代码中,CMP指令用于比较寄存器r1的值和0,BEQ指令判断比较的结果是否为零,如果为零则执行跳转到label处。
2. BNE(条件码:Z=0)BNE指令用于判断前一条指令执行的结果是否不为零,如果不为零则执行跳转操作。
例如:```CMP r1, #0BNE label```上述代码中,CMP指令用于比较寄存器r1的值和0,BNE指令判断比较的结果是否不为零,如果不为零则执行跳转到label处。
3. BGT(条件码:Z=0,N=0)BGT指令用于判断前一条指令执行的结果是否大于零,如果大于零则执行跳转操作。
例如:```CMP r1, #0BGT label```上述代码中,CMP指令用于比较寄存器r1的值和0,BGT指令判断比较的结果是否大于零,如果大于零则执行跳转到label处。
4. BLE(条件码:Z=1或N=1)BLE指令用于判断前一条指令执行的结果是否小于等于零,如果小于等于零则执行跳转操作。
例如:```CMP r1, #0BLE label```上述代码中,CMP指令用于比较寄存器r1的值和0,BLE指令判断比较的结果是否小于等于零,如果小于等于零则执行跳转到label 处。
实验二 ARM汇编语言程序设计一、实验目的1.了解ARM汇编语言的基本框架,学会使用ARM的汇编语言编程2.掌握ARM汇编指令二、实验设备1. EL-ARM-830教学实验箱,PentiumII以上的PC机,仿真器电缆。
2. PC操作系统WIN98或WIN2000或WINXP, ADS1.2集成开发环境,仿真器驱动程序。
三、汇编语言简介1.ARM汇编的一些简要的书写规范ARM汇编中,所有标号必须在一行的顶格书写,其后面不要添加“:”,而所有指令均不能顶格书写。
ARM汇编对标识符的大小写敏感,书写标号及指令时字母大小写要一致。
在ARM汇编中,ARM指令、伪指令、寄存器名等可以全部大写或者全部小写,但不要大小写混合使用。
注释使用“;”号,注释的内容由“;”号起到此行结束,注释可以在一行的顶格书写。
详细的汇编语句及规范请参照ARM汇编的相关书籍、文档。
2. ARM汇编语言程序的基本结构在ARM汇编语言程序中,是以程序段为单位来组织代码。
段是相对独立的指令或数据序列,具有特定的名称。
段可以分为代码段的和数据段,代码段的内容为执行代码,数据段存放代码运行时所需的数据。
一个汇编程序至少应该有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行文件。
可执行映像文件通常由以下几部分构成:◆一个或多个代码段,代码段为只读属性。
◆零个或多个包含初始化数据的数据段,数据段的属性为可读写。
◆零个或多个不包含初始化数据的数据段,数据段的属性为可读写。
链接器根据系统默认或用户设定的规则,将各个段安排在存储器中的相应位置。
源程序中段之间的相邻关系与执行的映象文件中的段之间的相邻关系不一定相同。
3. 简单的小例子下面是一个代码段的小例子AREA Init,CODE,READONLYENTRYLDR R0, =0x3FF5000LDR R1, 0x0fSTR R1, [R0]LDR R0, =0x3F50008LDR R1, 0x1STR R1, [R0]……END在汇编程序中,用AREA指令定义一个段,并说明定义段的相关属性,本例中定义了一个名为Init的代码段,属性为只读。
实验二ARM汇编指令实验一、实验目的1.掌握ARM数据处理指令的用法2.了解ARM汇编指令灵活的第二操作数,编写简单的汇编程序二、实验内容1.用MOV和MVN指令访问ARM通用寄存器2.使用ADD、SUB、AND、ORR、CMP和TST指令完成数据的加减运算及逻辑运算。
3.用ADS1.2软件仿真,单步、全速运行程序,设置断点,打开寄存器窗口(ProcessorRegister)监视运算值,打开存储器观察窗口(Memory)监视0x40003100地址处的值。
三、预备知识1、用ARM ADS集成开发环境,编写和调试程序的基本过程。
2、ARM指令的使用四、实验设备及工具(包括软件调试工具)硬件:PC机Pentium100以上。
软件:PC机Windows操作系统、ARM ADS 1.2集成开发环境、AXD五、实验步骤1.启动ADS1.2,使用ARM Executable Image工程模板建立一个工程。
如SY22.建立汇编源文件Test2.s,然后加入工程中。
3.编译、连接工程,选择Project Debug ,启动AXD软件仿真调试。
4.打开寄存器窗口,监视寄存器的值。
5.可以单步运行程序,可以设置、取消断点,或者全速运行,停止运行,调试时观察寄存器的值,运行结果见图2-1。
图2-1 ARM实验2的运行结果六、实验参考程序X EQU 11Y EQU 8BIT23 EQU (1<<23) ;BIT23 = 0X00800000AREA test2,CODE,READONL YENTRYCODE32START;MOV,ADD, R8=R3=X+YMOV R0,#XMOV R1,#YADD R3,R0,R1MOV R8,R3;MVN,SUB, R5= 0X5FFFFFF8 -R8*8MVN R0,#0XA0000007SUB R5,R0,R8,LSL #3;CMP, 5*Y/2 > 2*X ? R5=R5&0XFFFF0000,R5=R5|0X000000FFMOV R0,#YADD R0,R0,R0,LSL #2MOV R0,R0,LSR #1MOV R1,#XMOV R1,R1,LSL #1CMP R0,R1LDRHI R2,=0xFFFF0000ANDHI R5,R5,R2ORRLS R5,R5,#0x000000FF;TST,BIC:BIT23 =1?BIT6 = 0:1TST R5,#BIT23BICNE R5,R5,#0x00000040B STARTEND。
arm 条件执行ARM条件执行是一种在ARM处理器中常用的执行方式,它允许根据指定的条件来选择性地执行指令。
在本文中,我们将详细介绍ARM条件执行的原理、用法和优势。
一、ARM条件执行简介ARM条件执行是指根据指令中的条件码来决定是否执行这条指令。
在ARM体系结构中,每条指令在执行后都会更新一组条件码,用于描述前一条指令的执行结果。
这些条件码包括零位(Z)、负位(N)、进位位(C)和溢出位(V),可以用于判断两个操作数的关系,从而决定下一条指令的执行方式。
二、ARM条件执行的用法在ARM指令集中,条件执行通常使用指令后缀来表示。
例如,BEQ指令表示“如果前一条指令的结果等于零,则跳转到指定的地址”。
这种条件跳转的用法在编写高效的程序时非常有用,可以根据不同的条件选择性地执行指令,提高程序的执行效率。
除了条件跳转外,ARM条件执行还可以用于其他指令中。
例如,CMP指令用于比较两个操作数的大小关系,并根据比较结果更新条件码。
接下来的指令可以根据条件码选择性地执行,从而实现条件判断和分支执行的功能。
三、ARM条件执行的优势使用ARM条件执行的好处是可以减少分支指令的数量,从而提高程序的执行效率。
在传统的分支执行方式中,每次都需要进行条件判断和跳转操作,而使用条件执行可以直接在指令中完成条件判断,减少了不必要的跳转指令,提高了程序的执行速度。
ARM条件执行还可以减少代码的复杂性和长度。
在传统的分支执行方式中,需要编写多个分支语句来实现条件判断和执行,而使用条件执行可以将这些分支语句合并成一条指令,使代码更加简洁和易于维护。
四、ARM条件执行的应用场景ARM条件执行广泛应用于各种领域,特别是在嵌入式系统和移动设备中。
由于嵌入式系统和移动设备对计算资源和能耗的要求较高,因此使用ARM条件执行可以提高系统的性能和效率。
在嵌入式系统中,ARM条件执行可以用于实现各种控制逻辑和算法。
例如,通过判断传感器数据的变化情况,可以选择性地执行不同的控制指令,实现自动控制和优化算法。
ARM汇编指令的条件执行及其他相关细节详细资料集合2008-08-03 19:44以前没有真正理解ARM汇编指令的条件执行还自以为是的闹了一些笑话还好没人知道本来我以为造CPU的都是技术超牛x ,是最最高级的科技Intel简直就是神圣的象征现在看起来,那时还真是幼稚。
Intel因为一直要和8086兼容,不得不使用落后的构架比Intel高效科学的cpu多了去了本来我以为汇编语言是最牛x的8086汇编是最高效的直到见识了ARM汇编,我靠,一句ARM汇编能顶2条8086汇编的功能,甚至3条再加上ARM的其他特性,真得让我佩服居然可以有这么优秀的cpu构架废话不说开始主题首先要知道寄存器R16 ,即当前程序状态寄存器CPSR我觉得功能类似于8086汇编里的标志寄存器FLAGS详细的知识参见/viewdiary.13436031.html接下来就要知道ARM指令的表示方法ARM指令在机器中的表示格式用32位的二进制数表示例如ADDEQS R0,R1,#8 表示为下表ARM指令一般分为5个域:第一个域就是跟条件执行相关的cond,即条件码域第二个是指令代码域,即opcode ,第三个域是地址基址Rn,即第一个操作数,为寄存器第四个域是目标或源寄存器Rd,第五个域是地址偏移或操作寄存器、操作数区,即Op2上述指令的5个域为0000 0010 1001 0001 0000 0000 0000 100016进制代码为0291008H ,指令功能是将R1和8相加,结果放入R0中用助记符表示的ARM指令一般格式如下<opcode>{<cond>}{S}<Rd>,<Rn>{,<OP2>} 其中{}里的是可以省略的如上述的指令ADDEQS R0,R1,#8opcode是ADD ,cond是EQ,S代表的是第20位,{S}决定指令的执行结果是否影响CPSR的值,本例为1Rd为R0,Rn为R1,op2为8助记符中的{S}位,即32位机器码的第20位,在助记符中通常可以取S或!或空取S的情况已经说了,加上S影响CPSR的值加上!后缀,指令执行后,基址寄存器中的地址将发生如下变化:基址寄存器中的值(指令执行后)=指令执行前的值+地址偏移量如LDR R3,[R0,#4]! ,指令的结果将R0加4作为地址指针,把这个指针所指向的地址单元所存贮的数据读入R3使用!后缀必须注意以下事项:1、!后缀必须紧跟在地址表达式后面,而地址表达式要有明确的地址偏移量2、!后缀不能用于R15(PC)的后面3、!后缀当用在单个地址寄存器后面时,必须确保这个寄存器有隐性的偏移量,例如STMDB R1!{R3,R5,R7} 此时的地址基址寄存器的隐性偏移量为4好了最后讲正题,条件的指令执行前面提到cond有4位,[31:28],一共有16种组合,跟CPSR配合决定指令是否执行如指令ADDEQ R4,R3,#1 ,带EQ标志位只有当CPSR中的Z置位才执行该指令又如前面的例子 ADDEQS R0,R1,#8 ,也是只有当CPSR中的Z置位才执行该指令条件后缀和S后缀的关系如下1、如果既有条件后缀又有S后缀,则书写时S排在后面如ADDEQS R1,R0,R2该指令在Z=1时执行,将R0+R2的值放入R1,同时刷新条件标志位2、条件后缀是要测试条件标志位,而S后缀是要刷新条件标志位3、条件后缀要测试的是执行前的标志位,而S后缀是依据指令的结果改变条件标志。
ARM指令集——条件执⾏、内存操作指令、跳转指令ARM 汇编指令条件执⾏在ARM模式下,任何⼀条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位。
在数据处理指令中使⽤S后缀来实现该功能。
不要在CMP,CMN,TST或者TEQ指令中使⽤S后缀。
这些⽐较指令总是会更新标志位。
在Thumb模式下,所有数据处理指令都更新CPSR中的标志位。
有⼀个例外就是:当⼀个或更多个⾼寄存器被⽤在MOV和ADD指令时,此时MOV和ADD不能更新状态标志.⼏乎所有的ARM指令都可以根据CPSR中的ALU状态标志位来条件执⾏。
参见表2-1条件执⾏后缀表。
在ARM模式下,你可以:根据数据操作的结果更新CPSR中的ALU状态标志;执⾏其他⼏种操作,但不更新状态标志;根据当前状态标志,决定是否执⾏接下来的指令。
在Thumb模式,⼤多数操作总是更新状态标志位,并且只能使⽤条件转移指令(B)来实现条件执⾏。
该指令(B)的后缀和在ARM模式下是⼀样的。
其他指令不能使⽤条件执⾏。
ALU状态标志CPSR寄存器包含下⾯的ALU状态标志: N Set when the result of the operation was Negative Z Set when the result of the operation was Zero C Set when the operation result in a Carry(发⽣进位,或借位) V Set when the operation caused oVerflow(操作造成溢出) Q ARM architecture v5E only sticky flag2.5.2 执⾏条件N,Z,C,V相关的条件码后缀如下表所列:⽰例1 ADD r0, r1, r2 ; r0 = r1 + r2, 不更新标志位 ADDS r0, r1, r2 ; r0 = r1 + r2, 后缀S表⽰更新标志位 ADCSS r0, r1, r2 ; If C 标志为1,则执⾏r0 = r1 + r2, 且更新标志, CMP r0, r1 ; CMP指令肯定会更新标志.⽰例2 求最⼤公约数gcd CMP r0, r1 BEQ end ; r0 = r0 结束程序 BLT less ; r0 < r1 跳转⾄ less SUB r0, r0, r1 ; r0 > r1时 r0 = r0 - r1 B gcd ; 条件都不满⾜是继续循环less SUB r1, r1, r0 ; r0 < r1 r1 = r1 - r0 B gcdend⽰例3MAIN mov r1, #1 mov r2, #1 cmp r1, r2 beq FUNC ;if(eq) b FUNC => 实质:if(z == 1) b FUNC bne FUNC ;实质:if(z == 0) b FUNC mov r3, #3FUNC mov r5, #5 mov r6, #6寻址⽅式基地址变址寻址⽅式种类格式模式1[Rn, #±<offset_12]>⽴即数前索引寻址2[Rn, ±Rm]寄存器前索引寻址3[Rn, Rm, <shift>#<offset_12>]寄存器位移的前索引寻址4[Rn, #±<offset_12>]!⽴即数⾃动索引寻址5[Rn, ±Rm]!寄存器⾃动索引寻址6[Rn, Rm, <shift<#<offset_12>]!寄存器移位的⾃动索引寻址7[Rn], #±<offset_12>⽴即数后索引寻址8[Rn], ±<Rm>寄存器后索引寻址9[Rn], ±<Rm>, <shift>#<offset_12>带移位的寄存器后索引寻址寄存器前索引寻址 mov r0, #0x40000000 mov r1, #0xF000000F str r1, [r0, #4] ;将 r1 中的数据存储到地址为 r0 + 4 的内存空间中寄存器移位的前索引寻址 mov r2, #8 str r1, [r0, r2, lsl #1] ;将 r1 中的数据存储到地址为 r0 + (r2 << 1)的内存空间中寄存器后索引寻址 str r1, [r0], #4 ;将 r1 中的数据存储到地址为 r0 的内存空间中,然后 r0 = r0 + 4寄存器⾃动索引寻址 str r1, [r0, #4]! ;将 r1 中的数据存储到 r0 + 4 的内存空间中,然后 r0 = r0 + 4多寄存器寻址/块拷贝寻址 LDM STM对栈进⾏操作是,使⽤较多 ⽐如说⽤ IA ⾃动索引寻址存,就⽤ DB ⾃动索引读Load/Store指令Load/store是⼀组内存访问指令,⽤来在ARM寄存器和内存之间进⾏数据传送,ARM指令中有3种基本的数据传送指令。
ARM中的条件执⾏指令(IT指令)条件执⾏在之前讨论CPSR寄存器那部分时,我们⼤概提了⼀下条件执⾏这个词。
条件执⾏⽤来控制程序执⾏跳转,或者满⾜条件下的特定指令的执⾏。
相关条件在CPSR寄存器中描述。
寄存器中的⽐特位的变化决定着不同的条件。
⽐如说当我们⽐较两个数是否相同时,我们使⽤的Zero⽐特位(Z=1),因为这种情况下发⽣的运算是a-b=0。
在这种情况下我们就满⾜了EQual的条件。
如果第⼀个数更⼤些,我们就满⾜了更⼤的条件Grater Than或者相反的较⼩Lower Than。
条件缩写都是英⽂⾸字母缩写,⽐如⼩于等于Lower Than(LE),⼤于等于Greater Equal(GE)等。
下⾯列表是各个条件的含义以及其检测的状态位(条件指令都是其英⽂含义的缩写,为了便于记忆不翻译了):image我们使⽤如下代码来实践条件执⾏相加指令:.global mainmain:mov r0, #2 /* 初始化值 */cmp r0, #3 /* 将R0和3相⽐做差,负数产⽣则N位置1 */addlt r0, r0, #1 /* 如果⼩于等于3,则R0加⼀ */cmp r0, #3 /* 将R0和3相⽐做差,零结果产⽣则Z位置⼀,N位置恢复为0 */addlt r0, r0, #1 /* 如果⼩于等于3,则R0加⼀R0 IF it was determined that it is smaller (lower than) number 3 */ bx lr上⾯代码段中的第⼀条CMP指令将N位置⼀同时也就指明了R0⽐3⼩。
之后ADDLT指令在LT条件下执⾏,对应到CPSR寄存器的情况时V与N⽐特位不能相同。
在执⾏第⼆条CMP前,R0=3。
所以第⼆条置了Z位⽽消除了N位。
所以ADDLT不会执⾏R0也不会被修改,最终程序结果是3。
Thumb模式中的条件执⾏在指令集那篇⽂章中我们谈到了不同的指令集,对于Thumb中,其实也有条件执的(Thumb-2中有)。
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中条件标志位的值。
ARM指令集详解(超详细!带实例!)ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比 32 位大的加法。
下列例子将加两个 128 位的数。
128 位结果: 寄存器 0、1、2、和 3第一个 128 位数: 寄存器 4、5、6、和 7第二个 128 位数: 寄存器 8、9、10、和 11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD 将把两个操作数加起来,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数 2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
实验二ARM指令系统试验讲师:杨行【实验目的】1、了解ARM汇编语言2、掌握简单C语言嵌套ARM汇编语言编程;3、了解APCS规范;【实验原理】一、介绍APCS,ARM 过程调用标准(ARM Procedure Call Standard),提供了紧凑的编写例程的一种机制,定义的例程可以与其他例程交织在一起。
最显著的一点是对这些例程来自哪里没有明确的限制。
它们可以编译自C、Pascal、也可以是用汇编语言写成的。
APCS 定义了:对寄存器使用的限制。
使用栈的惯例。
在函数调用之间传递/返回参数。
可以被‘回溯’的基于栈的结构的格式,用来提供从失败点到程序入口的函数(和给予的参数)的列表。
APCS 不一个单一的给定标准,而是一系列类似但在特定条件下有所区别的标准。
例如,APCS-R (用于RISC OS)规定在函数进入时设置的标志必须在函数退出时复位。
在32 位标准下,并不是总能知道进入标志的(没有USR_CPSR),所以你不需要恢复它们。
如你所预料的那样,在不同版本间没有相容性。
希望恢复标志的代码在它们未被恢复的时候可能会表现失常...如果你开发一个基于ARM 的系统,不要求你去实现APCS。
但建议你实现它,因为它不难实现,且可以使你获得各种利益。
但是,如果要写用来与编译后的C 连接的汇编代码,则必须使用APCS。
编译器期望特定的条件,在你的加入(add-in)代码中必须得到满足。
一个好例子是APCS 定义a1 到a4 可以被破坏,而v1 到v6 必须被保护。
二、C语言嵌套ARM汇编语言int (*my_printf)(const char *format, ...);int main(void){int n = 5;int m = 1;int ret;my_printf = (void *)0x33f963a8;// 1 + 2 * 3 - 5__asm__ __volatile__(/*汇编程序*/"mov r0, %1\n""mov r1, %2\n""sub r2, r0, r1\n""mov %0, r2\n":"=r"(ret) /*输出部,=代表输出*/:"r"(n),"r"(m) /*输入部,r代表和寄存器相关联*/:"r0","r1","r2" /*保护部*/);my_printf("[ ret = %d]\n", ret);return 0;}三、汇编语言编程.text.global _start_start: @这个是裸板程序的入口函数@lr寄存器是程序链接寄存器,是pc的备份stmfdsp!,{r0-r12,lr} @函数跳转的时候,保存现场bl mainldmfdsp!,{r0-r12,pc} @函数跳转的时候,恢复现场【实验仪器】1、装有Linux操作系统的PC机一台;2、mini2440实验开发平台一套【实验内容】1、在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的和,通过串口输出;以下是输入两个个位数然后计算其和;int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;ch=my_getc();my_printf("a= %c\n",ch);a=ch-48;ch=my_getc();my_printf("b= %c\n",ch);b=ch-48;__asm__ __volatile__("mov r0,%1\n""mov r1,%2\n""add r2,r1,r0\n""mov %0,r2\n":"=r"(c):"r"(a),"r"(b):"r0","r2","r3");my_printf("%d+%d=%d\n",a,b,c);return 0;}2、在u-boot环境下,使用c语言嵌套ARM汇编语言实现从串口输入两个数,并计算两个数的积,通过串口输出;以下是计算两个个位数积的源程序int (*my_getc)();int (*my_printf)(const char *format,...);int _start(){char ch;inta,b,c;my_getc=(void *)0x33f965f0;my_printf=(void *)0x33f963a8;ch=my_getc();my_printf("a= %c\n",ch);a=ch-48;ch=my_getc();my_printf("b= %c\n",ch);b=ch-48;__asm__ __volatile__("mov r0,%1\n""mov r1,%2\n""mul r2,r1,r0\n""mov %0,r2\n":"=r"(c):"r"(a),"r"(b):"r0","r2","r3");my_printf("%d*%d=%d\n",a,b,c);return 0;}3、在u-boot命令行输入一个数,先写入0x30008000地址然后从从0x30008000地址读出数据。
算术和逻辑指令ADC : 带进位的加法(Ad dition with C arry)ADC{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2 + carryADC将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比32 位大的加法。
下列例子将加两个128 位的数。
128 位结果: 寄存器0、1、2、和3第一个128 位数: 寄存器4、5、6、和7第二个128 位数: 寄存器8、9、10、和11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Add ition)ADD{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 + op_2ADD将把两个操作数加起来,把结果放置到目的寄存器中。
操作数 1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 << 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} <dest>, <op 1>, <op 2>dest = op_1 AND op_2AND将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
arm指令的条件域
ARM指令的条件域是用来控制指令执行的条件,它可以根据当前的状态寄存器的值来决定是否执行指令。
条件域包括以下几个部分: 1. 条件代码:条件代码是用来表示状态寄存器的状态是否符合某个特定的条件。
例如,EQ表示等于,NE表示不等于,GT表示大于等于,LT表示小于等于等等。
条件代码可以与指令进行组合,形成完整的条件表达式。
2. 条件执行:条件执行是指令只有在指定的条件下才能执行。
例如,BEQ表示当状态寄存器的值为等于时才执行,BNE表示当状态寄存器的值为不等于时才执行。
3. 条件码:条件码是状态寄存器的一组标志位,表示指令执行时的结果。
例如,Z表示结果为零,C表示进位,N表示结果为负数,V表示溢出等等。
总的来说,条件域是ARM指令的一个重要部分,它通过控制指令的执行条件和结果,提高了程序的灵活性和安全性。
了解条件域的基本原理和使用方法,对于ARM指令的学习和应用都是非常有帮助的。
- 1 -。
ARM汇编指令集特点之⼀:条件执⾏后缀
mov r0,r1;
moveq r0,r1;//这句代码是否执⾏取决于上⼏句代码的运⾏结果(最后⼀次CPSR 寄存器的⾼四位 NZCV的标志位)
条件后缀执⾏特点:
1、条件后缀执⾏是否成⽴,不是取决于本句代码,⽽是取决于这句代码之前的代码运⾏后的结果!
2、条件后缀只是决定本句代码是否执⾏,并不影响下⼀句代码。
CPSR : ⾼四位解释
N:在结果是有符号的⼆进制补码情况下,如果结果为负数,则N=1;如果结果为⾮负数,则N=0。
Z:如果结果为0,则Z=1;如果结果为⾮零,则Z=0。
C:其设置分⼀下⼏种情况:
对于加法指令(包含⽐较指令CMN),如果产⽣进位,则C=1;否则C=0。
对于减法指令(包括⽐较指令CMP),如果产⽣借位,则C=0;否则C=1。
对于有移位操作的⾮法指令,C为移位操作中最后移出位的值。
对于其他指令,C通常不变。
V:对于加减法指令,在操作数和结果是有符号的整数时,如果发⽣溢出,则V=1;如果⽆溢出发⽣,则V=0;对于其他指令,V通常不发⽣变化。
详细的指令表:
CPSR 寄存器详解:。
嵌入式系统课程实验
实验二:ARM指令集-条件执行
实验目的
1、掌握ARM指令的一般格式,了解条件位的作用
2、掌握条件执行的使用方法,了解条件执行的原理
实验内容
使用CodeWarrior创建ARM工程,并为工程添加汇编源码文件Start.S,输入源码。
修改工程链接设置,编译工程后Debug工程。
使用AXD单步运行方式调试工程,通过观察指令执行结果理解条件执行的原理。
实验设备
硬件:PC机(CPU不低于2G Hz,内存不低于1GB)
软件:Windows操作系统(XP以上)、ADS1.2集成开发环境
基础知识
见“嵌入式系统”课件
实验内容
1ARM指令格式
1.1在实验一创建的工程中,修改Start.S文件,添加如下指令
AREA BOOT, CODE, READONL Y
ENTRY
B RESET
B .
B .
B .
B .
B .
B .
B .
RESET
add r0,r1,r2
adds r0,r1,r2
add r1,r2,r3
add r0,r1,#5
sub r0,r1,r2
subs r0,r1,r2
subeqs r0,r1,r2
B .
END
1.2编译工程后,在AXD中使用Interleave Disassembly模式察看指令编译出来
的二进制代码
1.3根据PPT上的ARM指令格式,以上述指令为例,分析二进制代码的意义
2 条件执行
2.1 参考以下两份代码,分别修改Start.S 中的代码,并使用ARMulator 运行代码,
通过设定不同的R0值,观察指令的运行结果,理解条件执行的意义。
扩展实验(选做实验)
1、 通过修改实验内容1的指令,深入探索ARM 指令编码格式;
2、 在AXD 的Memory 窗口手动修改ARM 指令的二进制编码,然后以ARM 指令的方
式察看内存,验证修改结果;
3、 修改实验内容2的指令,深入探索条件执行的原理和使用方法。
CMP r0, #0
BNE else
ADD r1, r1, #1
B end1
else
ADD r2, r2, #1
end1
B.
... ARM instructions
unconditional
CMP r0, #0 ADDEQ r1, r1, #1 ADDNE r2, r2, #1 B . ...
conditional。