ARM MOV和 LDR指令关系

2024-03-08 10:38
文章标签 关系 指令 arm mov ldr

本文主要是介绍ARM MOV和 LDR指令关系,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令。
比如想把数据从内存中某处读取到寄存器中,只能使用ldr
比如:
ldr r0, 0x12345678
就是把0x12345678这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。

另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。

ldr伪指令和ldr指令不是一个同东西。

1.汇编器所做的工作:
   如果LDR Rd, =const能够被转换成MOV 或者 MVN指令,则汇编器将转换成它成为相应的指令;
   如果不能被转换,则汇编器会将value存放在在一个叫做literal pool(一段嵌在代码中用以存储constant values的内存空间),并且产生一个LDR指令操作,它是

Program-relative address的,并且是从literal pool来读这个constant value的。
   例如:
   LDR R1,=23   ;MOV R1, #23
   LDR Rn, [pc, #offset to liteal pool]   ;从内存单元pc+offset处装载数据到Rn。

2.offset与pc之间的偏移量还有一定的规定:
   在arm状态为<4KB,并且是双向的。
   在thumb状态为<1KB,并且只能向前(Forward)。  
3.设置literal pools
   以LTORG伪指令来标识。LTORG伪指令通常放在无条件跳转指令之后,或者子程序返回指令之后,这样处理器就不会错误的将文字池中的数据当作指令来执行了。
4.例程:
AREA   Loadcon, CODE, READONLY
   
    ENTRY;标识第一条指令执行的地方。

start
    BL func1
    ; Branch to first subroutine
    BL func2    ; Branch to second subroutine

stop       
    MOV r0
, #0x18
    LDR r1, =0x20026;          
    SWI 0x123456    ;ARM semihosting SWI

func1
    LDR r0, =42
    ; 可以转换成MOV格式=> MOV R0, #42
    LDR r1, =0x55555555    ;不能转换,因为超过了MOV操作数的范围,故用literal pool => LDR R1, [PC,#offset to Literal Pool 1]
LDR r2, =0xFFFFFFFF    ;可以转换成MVN =>MVN R2, #0   
    MOV pc, lr        ;返回到调用该函数的下一条,一般情况下将LTORG的声明放在此语句之后。
           LTORG    ;Literal Pool 1 contains;此处是存放LDR中constant values的一个embedded memory in code section!
                    ;针对此示例存放的内容为:literal Ox55555555
func2
    LDR r3, =0x55555555
    ; => 不能够被转换,故使用literal pool,由于0x55555555已经存在literal pool1,故可以使用literal pool1中的literal data,转换成此

种形式=> LDR R3, [PC, #offset to Literal Pool 1]
    ; LDR r4, =0x66666666    ;If this is uncommented it fails, because Literal Pool2 is out of reach因为0x66666666未出现,所以这个需要存放在此代码后面的

literal pool2中,由于在后面分配了一块4200大小的内存块,这样与literal pool2之间的offset>4KB.若不注释掉此句话,则编译器会提示出现错误。
    MOV pc, lr    ;返回到调用该函数的下一条,

LargeTable
    SPACE 4200
    ;Starting at the current location, clears a 4200 byte area of memory to zero
        END    ;Literal Pool 2 is empty,由于没有显示声明literal pool2,故这是literal pool2的默认声明位置(程序的结束位置)




关于LTORG:

LTORG用于声明一个文字池,在使用LDR伪指令的时候,要在适当的地址加入LTORG声明文字池,这样就会把要加载的数据保存在文字池内,再用ARM的加载指令读出数据。(若没有

使用LTORG声明文字池,则汇编器会在程序末尾自动声明)。
伪指令格式为:
    LTORG
伪指令应用举例如下:
    ;..............
    LDR R0, =0X12345678
    ADD R1, R1, R0
    MOV PC, LR
    LTORG    ;声明文字池,此地址存储0x12345678

这篇关于ARM MOV和 LDR指令关系的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/786829

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

POJ1269 判断2条直线的位置关系

题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题思路: 先判断两条直线p1p2, q1q2是否共线, 如果不是,再判断 直线 是否平行, 如果还不是, 则两直线相交。  判断共线:  p1p2q1 共线 且 p1p2q2 共线 ,共线用叉乘为 0  来判断,  判断 平行:  p1p

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

Android中如何实现adb向应用发送特定指令并接收返回

1 ADB发送命令给应用 1.1 发送自定义广播给系统或应用 adb shell am broadcast 是 Android Debug Bridge (ADB) 中用于向 Android 系统发送广播的命令。通过这个命令,开发者可以发送自定义广播给系统或应用,触发应用中的广播接收器(BroadcastReceiver)。广播机制是 Android 的一种组件通信方式,应用可以监听广播来执行

mysql中导入txt文件数据的操作指令

1 表tt的格式:    CREATE TABLE `tt` (   `ind` int NOT NULL auto_increment,   `name` char(100) default NULL,   PRIMARY KEY  (`ind`)  )   2 文件d.txt的内容示例:  1,a  2,b  3,c

可选择的反思指令微调

论文:https://arxiv.org/pdf/2402.10110代码:GitHub - tianyi-lab/Reflection_Tuning: [ACL'24] Selective Reflection-Tuning: Student-Selected Data Recycling for LLM Instruction-Tuning机构:马里兰大学, Adobe Research领

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的,彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在时,包含另一个概念才有意义 1.3. 概念依赖关系图简要概括了软件的概念和概念存在的理