ARM汇编语言入门(六)

发布者:和谐共融最新更新时间:2021-03-25 来源: eefocus关键字:ARM  汇编语言  入门 手机看文章 扫描二维码
随时随地手机看文章

Part 6:条件状态和分支

在探讨CPSR时我们已经接触了条件状态。我们通过跳转(分支)或者一些只有满足特定条件才执行的指令来控制程序在运行时的执行流。通过CPSR寄存器中的特定bit位来表示条件状态。这些位根据指令每次执行的结果而不断变化。例如,比较运算时如果两个数相等,那么就置CPSR中的Zero位(Z=1),实际上是因为:a - b = 0,这种情况下就是相等状态。如果第一个数大,那么就是大于状态。如果第二个数大,就是小于状态。除此之外,还有小于等于、大于等于等等。


下面的表格列出了可用的条件状态码,描述和标志位:

在下面代码片段中看一下执行条件加法时的实际用法L:


.global main

main:

        mov     r0, #2     /* 初始化变量 */

        cmp     r0, #3     /* 将R0中的值与3比较,负数位置1 */

        addlt   r0, r0, #1 /* 如果上一条比较结果是小于(查看CPSR),则将R0加1 */

        cmp     r0, #3     /* 将R0中的值再与3比较, 零位置1,同时负数位重置为0 */

        addlt   r0, r0, #1 /* 如果上一条比较结果是小于(查看CPSR),则将R0加1 */

        bx      lr

第一条cmp指令结果导致CPSR中的负数位置1(2- 3 = -1)意思是R0小于R3。因为满足小于条件(CPSR中的溢出位不等于负数位V != N)所以接下来的ADDLT指令执行。在执行下一条cmp指令时,R0 = 3。所以清除负数位(3 - 3 = 0,负数位清零),零位置位(Z = 1)。现在溢出位是0,负数位是0,不满足小于条件。所以最后一条ADDLT指令不执行,R0值保持3不变。


Thumb模式下的条件执行

我们在介绍指令集的章节讨论了Thumb状态下的不同。具体而言是Thumb-2版本支持条件执行。某些 ARM 处理器版本支持"IT"指令,允许在 Thumb 状态下支持多达4个条件执行指令。参考:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/BABIJDIC.html。


语法:IT{x{y{z}}} cond


cond 指定 IT 块的第一个指令的条件。

x 指定 IT 块中第二个指令的条件开关。

y 指定 IT 块中第三个指令的条件开关。

z 指定 IT 块中第四个指令的条件开关。

其实IT指令的结构就是“IF-Then-(Else)”,语法都是由字母“T”和“E”构成:


IT:If-Then(下一条指令是条件的);

ITT:If-Then-Then(后两条指令是条件的);

ITE:If-Then-Else(后两条指令是条件的);

ITTE:If-Then-Then-Else(后三条指令是条件的);

ITTEE:If-Then-Then-Else-Else(后四条指令是条件的);

IT块中的每条指令必须指定相同或逻辑相反的条件后缀。意思是,如果使用ITE,那么前两个指令必须有相同的后缀,而第三个必须是逻辑相反的后缀。下面是 ARM 参考手册中的一些示例,说明了这些逻辑:


ITTE   NE           ; 接下来的3条指令都是有条件的。

ANDNE  R0, R0, R1   ; ANDNE不更新条件标志。

ADDSNE R2, R2, #1   ; ADDSNE更新条件标志。

MOVEQ  R2, R3       ; 有条件的移动

ITE    GT           ; 接下来的2条指令都是有条件的。

ADDGT  R1, R0, #55  ; 条件满足大于时进行相加。

ADDLE  R1, R0, #48  ; 条件不满足大于时进行相加。

ITTEE  EQ           ; 接下来的4条指令都是有条件的。

MOVEQ  R0, R1       ; 有条件的MOV

ADDEQ  R2, R2, #10  ; 有条件的ADD

ANDNE  R3, R3, #1   ; 有条件的AND

BNE.W  dloop        ; 分支指令只能在IT块的最后一个指令中使用。

错误示例:


IT     NE           ; 下一条指令是条件的。     

ADD    R0, R0, R1   ; 语法错误,不是有条件的指令。

下面是条件代码和相反代码:

现在使用以下代码来测试:


.syntax unified    @ 非常重要!

.text

.global _start

_start:

    .code 32

    add r3, pc, #1   @ PC的值加1并存储到R3。

    bx r3            @ 跳转到R3中的地址处,并切换运行模式 ->切换到Thumb模式,因为R3最低有效位(LSB) = 1。

    .code 16         @ Thumb模式

    cmp r0, #10      

    ite eq           @ 如果R0等于10...

    addeq r1, #2     @ ... 那么 R1 = R1 + 2

    addne r1, #3     @ ... 否则 R1 = R1 + 3

    bkpt

.code 32


示例中的代码开始在ARM模式下,第一条指令将PC中的地址值加1并存储到R3,然后bx指令跳转到R3中的地址位置,并且模式切换成Thumb模式,因为R3中的值最低有效位为1(0不切换)。为此使用bx(分支+交换)非常重要。


.code 16


在Thumb模式下,首先比较R0和10,结果将负数位N置位(0 - 10 = -10)。之后使用If-Then-Else块,因为零位Z(Zero)没有被置位所以ADDEQ指令被跳过,然后因为结果不相等所以执行ADDNE指令。


在 GDB 中单步执行此代码会干扰结果,因为你要在 ITE 块中执行这两个指令。 但是,在 GDB 中运行代码而不设置断点并单步执行每个指令将生成正确的结果设置 R1 = 3。


分支

分支(跳转)允许我们跳转到另一个代码段。当你需要跳过(或者重复)某块代码或者跳转到指定的函数的时候,分支很有用。此类情形中最佳的示例是IF和循环。先来看看IF案例。


.global main

main:

        mov     r1, #2     /* 设置初始变量a */

        mov     r2, #3     /* 设置初始变量b */

        cmp     r1, r2     /* 比较两个变量值看哪个更大 */

        blt     r1_lower   /* 因为R2更大(N==1),跳转到r1_lower */

        mov     r0, r1     /* 如果没有跳转, 例如R1的值更大(或者相等),则将R1的值存储到R0 */

        b       end        /* 结束 */

r1_lower:

        mov r0, r2         /* R1小于R2时跳转到此处, 将R2的值存储到R0 */

        b end              /* 结束 */

end:

        bx lr              /* THE END */

上面代码是比较两个初始值并返回最大值,C语言伪代码:


int main() {

   int max = 0;

   int a = 2;

   int b = 3;

   if(a < b) {

    max = b;

   }

   else {

    max = a;

   }

   return max;

}

现在再看一下怎么使用条件分支实现循环:


.global main

main:

        mov     r0, #0     /* 设置初始变量a */

loop:

        cmp     r0, #4     /* 比较a==4 */

        beq     end        /* 如果a==4,结束 */

        add     r0, r0, #1 /* 否则将R0中的值递增1 */

        b loop             /* 跳转到loop开始位置 */

end:

        bx lr              /* THE END */

C语言伪代码:


int main() {

   int a = 0;

   while(a < 4) {

   a= a+1;

   }

   return a;

}



B、BX、BLX指令

有三种类型的分支指令:


普通分支(B)

简单的跳转到一个函数。



带链接的跳转(BL)

将PC+4的值保存到LR寄存器,然后跳转。



带状态切换的跳转(BX)和带状态切换及链接的跳转(BLX)

与B和BL一致,只是添加了工作状态的切换(ARM模式-Thumb模式)。

需要寄存器作为第一个操作数。



BX、BLX用来切换ARM模式到Thumb模式。


.text

.global _start

_start:

     .code 32         @ ARM mode

     add r2, pc, #1   @ put PC+1 into R2

     bx r2            @ branch + exchange to R2

    .code 16          @ Thumb mode

     mov r0, #1

这里的技巧是获得当前PC的值,加1然后保存到一个寄存器,然后跳转(并且切换状态模式)到这个寄存器内的地址。可以看到加指令(add r2, pc, #1)获取到有效的PC地址值(当前PC内的值+8=0x805C)然后加1(0x805C + 1 = 0x805D)。接下来,我们跳转的地址( 0x805D = 10000000 01011101)最低有效位为1,那么意味着地址不是4字节(32bit)对齐的。跳转到这样的地址不会导致非对齐问题。在GDB中运行的样子(含GEF):


注意上面的gif图片是在低版本的GEF下创建的,所以你的显示界面可能不一样,但是逻辑是一样的。


条件分支

分支也可以有条件地执行,用于在满足特定条件时跳转到函数。我们看一个使用BEQ应用条件分支的例子,这是一段没太有用的汇编代码,只不过是在寄存器等于特定值时将一个值移动到寄存器并跳转到另一个函数的过程。


.text

.global _start

_start:

   mov r0, #2

   mov r1, #2

   add r0, r0, r1

   cmp r0, #4

   beq func1

   add r1, #5

   b func2

func1:

   mov r1, r0

   bx  lr

func2:

   mov r0, r1

   bx  lr


关键字:ARM  汇编语言  入门 引用地址:ARM汇编语言入门(六)

上一篇:ARM常用的22个概念!
下一篇:瑞萨超低功耗RE产品增加蓝牙5功能,简化软件更新

推荐阅读最新更新时间:2024-11-21 09:55

AMD通过SoC设计,将ARM TrustZone技术集成到未来APU
AMD公司宣布将在其未来产品上集成新型安全解决方案,以满足消费者和企业对安全内容访问和无忧网上交易不断增长的需求。通过与ARM达成战略性技术合作伙伴关系,AMD将通过一种“系统单芯片”(SoC)的设计方法,将成熟的ARM TrustZone 技术集成到未来的APU(加速处理器)中。这项开行业先河的合作,通过将x86硬件与世界上应用最广泛的移动安全生态系统相融合,有助于加速更广泛的生态系统支持。 通过由TrustZone 技术实现的行业标准安全方式,无论是采用ARM 处理器还是采用AMD 的x86 架构APU, AMD和ARM都能为数十亿的移动设备、平板电脑、个人电脑和服务器提供全面适用的安全保障。AMD计划于2013年在选定的
[单片机]
ARM单片机汇编指令使用一
目录: 1、ldr/str/mov指令 1)LDR指令 2)STR和LDRB指令 3)MOV指令 4)使用示例 2、movs指令 3、LDM表示装载,STM表示存储 4、teq指令 5、使用tst来检查是否设置了特定的位 6、'^'的理解 7、spsr_cxsf,cpsr_cxsf的理解 8、cpsr的理解 9、指令后缀和条件判断 10、B、BL、BX、BLX 和 BXJ指令的区别 1)B 指令 2)BL 指令 3)BLX 指令 4)BX 指令和BXJ指令 5)总结 -------------------------------------------- 说明: ARM单片机汇编指令使用一 ARM
[单片机]
<font color='red'>ARM</font>单片机汇编指令使用一
基于ARM11和DSP协作视频流处理技术的3G视频安全帽设计
  1.引言   为提高在高危工作场所现场作业的可控性,本文采用仿生学原理和高集成度设计实现了与人眼同视角的3G视频安全帽。本设计由视频安全帽和腰跨式数据处理终端两部分组成,采用高可靠性航空插头连接。其中图像处理采用三星公司的S3C6410ARM11处理器和TMS320DM642 DSP处理器组成。本设计结合DSP处理器在视频压缩方面的优势和运行于ARM之上的Linux操作系统在数据管理与任务调度机制方面的出色表现,由DSP完成图像处理功能,并通过高速接口把视频数据传输给嵌入式微处理系统,完成视频数据的传输、存储功能。   2.系统构成   本设计由视频安全帽和腰跨式视频终端两部分组成。视频安全帽中包含1路视频输入、1路音频
[单片机]
基于<font color='red'>ARM</font>11和DSP协作视频流处理技术的3G视频安全帽设计
Arm推出新一代指令集架构Armv9,整体性能跃升一级
Arm推出新一代指令集架构Armv9,以越来越强大的安全性和人工智能能力,应对无处不在的专业处理需求,这是Arm十年来最大的技术革新,上一代的Armv8发布于2011年10月。Arm表示,Armv9架构将在安全性和人工智能方面与英特尔相抗衡。 基于Arm架构的芯片出货量持续增长,过去五年出货超过1000亿颗。按照这个增长速度,全球100%的共享数据将很快在Arm芯片上进行处理,包括端点,数据网络或云中。随着AI,物联网和5G在全球范围内蓬勃发展,Armv9中的新功能将加速在每个应用程序中从通用计算向更专业的计算转变。 Arm首席执行官Simon Segars表示,Armv9在基于通用计算的经济性,设计自由度和可访问性的基础
[嵌入式]
<font color='red'>Arm</font>推出新一代指令集架构Armv9,整体性能跃升一级
ARM矩阵键盘设计及其linux驱动实现
在嵌入式系统开发中,经常通过键盘来实现人机交互。本文介绍了一种直接利用ARM的I/O口扩展矩阵键盘的方法。同时以TQ2440开发板为例,对硬件电路连接和相应的linux驱动设计方法都作了详细说明。 1.引言 ARM微处理器已广泛应用于工业控制、消费类电子产品、通信系统等领域。矩阵键盘是一种常用的键盘形式,它将按键设计成M行N列,这样共需M+N根信号线,却可驱动M×N个按键,大大节约了I/O资源。本文介绍了一种利用TQ2440开发板的GPIO口扩展5×4矩阵键盘的方法,并将所有按键重新布局成手持终端的键盘形式,方便操作。 2.硬件设计 本设计扩展5行4列的矩阵键盘,如图1所示。其中行线ROW1-ROW5连接S3C24
[单片机]
<font color='red'>ARM</font>矩阵键盘设计及其linux驱动实现
基于ARM控制器LPC2214的税控收款机系统的设计
引言 税控收款机是指具有特定税控功能的电子收款机,它是集软硬件为一体的嵌入式系统,硬件设计考虑高性价比和高可靠性,软件设计考虑系统的稳定性和可靠性。根据这一原则,本文介绍了一种基于ARM控制器LPC2214的税控收款机的设计方案。 税控收款机硬件系统的设计与实现 税控收款机的硬件组成框图如图1所示,其硬件系统由中央处理模块、显示模块、打印模块、电源模块、时钟模块、IC卡接口、外部通讯接口(包括RS232串行接口、网络接口、USB接口等)、蜂鸣器,以及输入键盘、电子锁、条码扫描仪和手写板等几部分组成。 图1 税控收款机硬件框图 中央处理模块 中央处理模块采用飞利浦公司基于32位ARM7TDMI-S内核的
[嵌入式]
信号硬件入门--振幅调制信号发生器(正弦波发生器方案、AM调制方案)
一、基于DXP的正弦波发生器原理图及PCB的设计(以下顶层线均为0Ω直插电阻) 图 3-1 500HZ和5KHZ正弦波发生器DXP原理图 图 3-2 500HZ和5KHZ正弦波发生器DXP PCB 图 二、基于DXP的AM调制器原理图及PCB的设计 1. MC1596乘法器 图 3-3 MC1596 AM调制器DXP原理图 图 3-4 MC1596 AM调制器DXP PCB 图 2. AD835乘法器 图 3-5 AD835 AM调制器DXP原理图 图 3-6 AD835 AM调制器DXP PCB 图 三、做出板子实物(分模块制作,便于 错误查清与调试) 图 3-7 振幅调制信号
[测试测量]
信号硬件<font color='red'>入门</font>--振幅调制信号发生器(正弦波发生器方案、AM调制方案)
AI 大模型迈向多模态,助力具身智能与机器人实现创新
你听过莫拉维克悖论 (Moravec's paradox) 吗?该悖论指出,对于人工智能 (AI) 系统而言,高级推理只需非常少的计算能力,而实现人类习以为常的感知运动技能却需要耗费巨大的计算资源。实质上, 与人类本能可以完成的基本感官任务相比,复杂的逻辑任务对 AI 而言更加容易。这一悖论凸显了现阶段的 AI 与人类认知能力之间的差异。 人本来就是多模态的。我们每个人就像一个智能终端,通常需要去学校上课接受学识熏陶(训练),但训练与学习的目的和结果是我们有能力自主工作和生活,而不需要总是依赖外部的指令和控制。 我们通过视觉、语言、声音、触觉、味觉和嗅觉等多种感官模式来了解周围的世界,进而审时度势,进行分析、推理
[嵌入式]
AI 大模型迈向多模态,助力具身智能与机器人实现创新
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved