1.使用单一数据传送指令(STR 和 LDR)来装载和存储单一字节或字的数据从/到内
存。
请问装载(LDR)和存储(STR)有什么区别?我个人理解没有区别.就是向指定的地址写数
据.是么?
LDR是内存数据放到寄存器,即装载,是读
STR是寄存器数据到内存,即存储,是写
2.ldr r0, PtEBIBase
对于这条指令中的PtEBIBase,它是一个地址么?可是它之前的定义是:
PtEBIBase:
.long EBI_BASE
PtEBIBase是一个标号,指向一个long型的数,这个数的值等于EBI_BASE,就是EBI的
基地址
3.ldr r1, [pc,#-(8+.-InitTableEBI)]
#-(8+.-InitTableEBI)这个东西如何计算?比如:
InitTableEBI是一个标号
8 + 当前地址 = 当前PC
8 + 当前地址 - InitTableEBI = 当前PC到InitTableEBI这个标号(即地址)的距
离。
pc - (8 + 当前地址 - InitTableEBI) = InitTableEBI这个标号的地址。
就是说,最后r1的值是InitTableEBI这个标号的地址。
关键字:ARM汇编 STR LDR
引用地址:
ARM汇编STR和LDR
推荐阅读最新更新时间:2024-03-16 14:52
ARM汇编编程基础之五-ADS开发环境的使用
掌握了基本的汇编指令和伪操作后,就具备了编写简单ARM汇编程序的基本理论能力,不过要实战得到真实可执行的程序,还需要可以对程序进行编辑和编译的开发环境(命令行编译器或IDE)的支持,同时程序在开发过程中免不了要进行调试,这就需要调试器的支持。一般而言,会有供应商将程序的编译器、编译器、调试器以及其它一些辅助工具组合在一起,形成程序的开发、调试集成开发环境(IDE)软件,提供给程序开发人员使用。对ARM程序开发而言,目前比较流行的IDE有2套:运行于windows平台的ADS和运行于Linux平台的gcc等交叉编译工具链。总的来看,ADS在程序的编译和调试方面要比gcc使用起来方便很多,也更容易掌握和使用,因此针对初学者,本文将展示A
[单片机]
GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法
在《 GNU ARM汇编--(十七)u-boot的makefile和mkconfig解读 》中分析完u-boot-2012.07的makefile以及mkconfig脚本后,发现一个现象:在makefile中少了许多xxx_config之类的目标,而在目录下多了一个boards.cfg文件.仔细看下makefile和mkconfig就明白其实也没什么实质性的变化.也就是说,我们在make xxx_config的时候都用的是 %_config::unconfig @$(MKCONFIG) -A $(@:_config=) 奇怪的就是在下面一点点有: #################################
[单片机]
arm中ldr与mov的区别
关键字:ldr,立即数前面的等号,mov 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伪指令可以在立即数
[单片机]
第2课:ARM汇编学习
首先要明确这节课要学的是什么: 1通过学习ARM汇编语言从而了解ARM处理器的工作原理。 2用汇编写Bootloader 在这里汇编的基本语法在《ARM嵌入式系统开发》里面已经写过了。这里就写一点需要特别注意的地方 我们学汇编,并不是要求用汇编写很多复杂的程序。那样不切实际,那些可以用更高一层的C来写。 7种寻址方式: 1立即数寻址 ADD r0,r0,#1 2寄存器寻址 ADD r0,r0,r1 3寄存器间接寻址 LDR r0, 4寄存器变址寻址 :前变址,自动变址,后变址 LDR r0, LDR r0, ! LDR r0, ,#4 5堆栈寻址 我们一般用FD 满递减 LDM {sp}!,{r1-r4}
[单片机]
加深对ARM汇编中对stmfd和ldmfd的理解
AREA STMFD,CODE,READONLY ENTRY CODE32 START sub sp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc mov r0,#0x1d ;将0x1d赋值给r0寄存器 mov r1,#0x1c ;将0x1c赋值给r1寄存器 stmfd sp!,{r0} ;将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d) 第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(
[单片机]
ARM 汇编 LDR STR MOV
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
[单片机]
ARM汇编-ARM中的汇编!
.equ and .word .word is like unsigned int in C. .equ is like #define exp: #define bob 10 .equ bob,10 unsigned int ted; ted: .word 0 unsigned int alice=5; alice: .word 5 @.text .global 是arm-gcc编译器的关键词 .text @指定了后续编译出来的内容放在代码段 .global _start @告诉编译器后续跟的是一个全局可见的名字 _start: @_start是一个函数的起始地址,也是编译、链接后程序的
[单片机]
ARM汇编----IMPORT
IMPORT伪操作告诉编译器当前的符号不是在本源文件中定义的,而是在其他源文件中定义的,在本源文件中可能引用该符号,而且不论本源文件是否实际引用该符号,该符号都将被加入到本源文件的符号表中。 语法格式: IMPORT symbol{ } 其中,symbol为声明的符号的名称。它是区分大小写的。 指定这个选项后,如果symbol在所有的源文件中都没有被定义,编译器也不会产生任何错误信息,同时编译器也不会到当前没有被INCLUDE进来的库中去查找该符号。 使用说明: 使用IMPORT伪操作声明一个符号是在其他源文件中的定义。如果连接器在连接处理时不能解析该符号,而IMPORT伪操作中没有指定 选项,则连接器将会报告错误。如果连
[单片机]