arm汇编 ldr r0 =0x00000000 这个=号代表啥啊
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arm汇编 ldr r0 =0x00000000 这个=号代表啥啊相关的知识,希望对你有一定的参考价值。
参考技术Aarm汇编 ldr r0 =0x00000000 这个=号代表什么啊
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指令的。
ARM汇编指令请教 ldr r1,=0x00555555中等号到底怎么用?
LDR r0,=label
如果label是立即数,就把数值赋给r0, 如果lable是标识符,就把label地址的值赋给r0
下面ARM汇编指令( )完成R1=R0×8操作。
[D]MOV R1,R0,LSL #3
这个左移位操作是做乘法运算的。2的3次方,就是8
ARM 中LDR R0, TABLE 和 ADR R0, TABLE 和LDR R0, =TABLE 有什么差别
先解释下这个LDR,ADR命令的具体含义。
1、LDR
使用格式 :LDR <Rd> <address_mode>
LDR用于从内存中将一个32位的字读取到指令的目标寄存器中,如果PC作为指令中的目标寄存器,指令就可以实现程序的跳转功能。
其实ARM的LDR指令有两种,一种就是LDR指令,另一个是LDR伪指令,它们的写法一样,但是含义不一样,伪指令的LDR有“=”,所以你所给的三个指令中,第一个LDR是ARM的LDR指令,第三个是ARM的伪指令LDR,伪指令LDR=后面的数是一个32位的立即数(可以立即为常量),在汇编编译源程序时,LDR 伪指令被编译器替换成一条合适的指令。若加载的常数未超出 MOV 或 MVN 的范围,则使用 MOV 或 MVN 指令代替该 LDR 伪指令;否则汇编器将常量放入文字池,并使用一条程序相对偏移的 LDR 指令从文字池读出常量。LDR 用于加载芯片外围功能部件的寄存器地址(32 位立即数),以实现各种控制操作。从 PC到文字池的偏移量必须小于 4 KB。
2、ADR伪指令
使用格式:ADR <register>,<expr>
ADR将一个基于PC或者寄存器的相对地址装载到寄存器R0中,主要限制是对expr这个地址的寻址范围,如果expr是字对齐的,那么它的寻址范围是(+-)1024字节,如果是非对齐的地址那么寻址范围只有(+-)255字节。它主要用于在一个小范围内读取数据。
也就是说到底用那个,取决于后面的TABLE的类型和大小的。如果是从内存中读取一个数据到寄存器就用第一个,小范围读就用第二个,读取一个32位常量类型的地址用第三个。
希望对你有用。
蓝屏代码0x0000010e(0x0000001e ,0x00000000 ,0x00000000,0x00000000 )表示什么啊
你好,电脑蓝屏,主要是:“内存有错误”或“软件不兼容”引起!
这是解决方法:(作者:力王历史)
1。试试开机,出完电脑品牌后,按F8,安全模式,光标选定:最后一次正确配置,
回车,回车,按下去!【关键一步】
2。再不行,进安全模式,回车,到桌面后,杀毒软件,全盘杀毒!
“隔离区”的东西,彻底删除!
3。再使用:360安全卫士,“功能大全”里的:“360系统急救箱”,
点:开始急救!重启后,点开“文件恢复区”,全选,彻底删除文件!
系统修复,全选,立即修复!【关键一步】
网络修复,开始修复,重启电脑!
360安全卫士,扫描插件,立即清理!360安全卫士,系统修复,一键修复!
【金山急救箱】,勾选:【扩展扫描】,立即扫描,立即处理,重启电脑!
4。再不行,拔下显卡和内存条,橡皮擦擦,再用毛刷,清理插槽灰尘和风扇,
更换内存插槽等!【台式机】
5。检查是否有同类功能的,多余类似软件,如:多款播放器,多款杀毒软件
等,卸载多余的,只留一款,因为同类软件,互不兼容!【关键一步】
6。再不行,下载“驱动人生”,升级:显卡驱动!
7。如果还是不行,需要“一键还原”或“重装系统”了!
8。硬件有问题,送修!
在汇编中(如arm),R0的地址值bit[1:0],这个bit[1:0]是什么意思啊
你好 这是我帮你找的 希望对你有帮助
单寄存器传输
先看第一个,很简单:把单一的数据传入(LDR) 或传出(STR)寄存器,对内存的访问可以是DWORD(32-bit), WORD(16-bit)和BYTE(8-bit)。指令的格式如下:
DWORD:
<LDR | STR> Rd, addressing1
WORD:
<LDR | STR> H Rd, addressing2 无符号版
<LDR> SH Rd, addressing2 有符号版
BYTE:
<LDR | STR> B Rd, addressing1 无符号版
<LDR> SB Rd, addressing2 有符号版
addressing1 和addressing2 的分类下面再说,现在理解成某种寻址方式就可以了。
在单寄存器传输方面,还有以下三种变址模式,他们是:
◆ preindex
这种变址方式和x86的寻址机制是很类似的,先对寄存器进行运算,然后寻址,但是在寻之后,基址寄存器的内容并不发生改变,例如:
ldr r0, [r1, #4]
的含义就是把r1+4 这个地址处的DOWRD 加载到r0,而寻址后,r1 的内容并不改变。
◆ preindex with writeback
这种变址方式有点类似于++i的含义,寻址前先对基地址寄存器进行运算,然后寻址. 其基本的语法是在寻址符[]后面加上一个"!" 来表示.例如:
ldr r0, [r1, #4]!
就可以分解成:
add r1, r1, #4
ldr r0, [r1, #0]
◆ postindex
自然这种变址方式和i++的方式就很类似了,先利用基址寄存器进行寻址,然后对基址寄存器进行运算,其基本语法是把offset 部分放到[]外面,例如:
ldr r0, [r1], #4
就可以分解成:
ldr r0, [r1, #0]
add r1, r1, #4
如果你还记得x86 的SIB 操作的话,那么你一定想ARM是否也有,答案是有也没有。在ss上面提到的addressing1 和addressing2的区别就是比例寄存器的使用,addressing1可以使用[base, scale, 桶形移位器]来实现SB 的效果,或者通过[base,offset](这里的offset 可以是立即数或者寄存器)来实现SI 的效果,而addressing2则只能用后者了。于是每一种变址方式最多可以有3 种寻址方式,这样一来,最多可以有9种用来寻址的指令形式。例如:
ldr r0, [r1, r2, LSR #0x04]!
ldr r0, [r1, -#0x04]
ldr r0, [r1], LSR #0x04
每样找了一种,大概就是这个意思。到此,单寄存器传输就结束了,掌握这些足够应付差事了。下面来看看多寄存器传输吧。
多寄存器传输
说得很明白,意思就是通过一条指令同时把多个寄存器的内容写到内存或者从内存把数据写到寄存器中,效率高的代价是会增加系统的延迟,所以arm 提供了一个编译器选项来控制寄存器的个数。指令的格式有些复杂:
<LDM | STM> <寻址模式> Rn!, <Registers>r^
我们先来搞明白寻址模式,多寄存器传输模式有4 种:
也就是说以A开头的都是在Rn的原地开始操作,而B开头的都是以Rn的下一个位置开始操作。如果你仍然感到困惑,我们不妨看个例子。
所有的示例指令执行前:
mem32[0x1000C] = 0x04
mem32[0x10008] = 0x03
mem32[0x10004] = 0x02
mem32[0x10000] = 0x01
r0 = 0x00010010
r1 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
1) ldmia r0!, r1-r3 2) ldmib r0!, r1-r3
执行后: 执行后:
r0 = 0x0010001C r0 = 0x0010001C
r1 = 0x01 r1 = 0x02
r2 = 0x02 r2 = 0x03
r3 = 0x03 r3 = 0x04
至于DA 和DB 的模式,和IA / IB 是类似的,不多说了。
最后要说的是,使用ldm 和stm指令对进行寄存器组的保护是很常见和有效的功能。配对方案:
stmia / ldmdb
stmib / ldmda
stmda / ldmib
stmdb / ldmia
继续来看两个例子:
执行前:
r0 = 0x00001000
r1 = 0x00000003
r2 = 0x00000002
r3 = 0x00000001
执行的指令:
stmib r0!, r1-r3
mov r1, #1 ; These regs have been modified
mov r2, #2
mov r3, #3
当前寄存器状态:
r0 = 0x0000100C
r1 = 0x00000001
r2 = 0x00000002
r3 = 0x00000003
ldmia r0!, r1-r3
最后的结果:
r0 = 0x00001000
r1 = 0x00000003
r2 = 0x00000002
r3 = 0x00000001
另外,我们还可以利用这个指令对完成内存块的高效copy:
loop
ldmia r9!, r0-r7
stmia r10!, r0-r7
cmp r9, r11
bne loop
说到这里,读者应该对RISC的Load-Store体系结构有一个大概的了解了,能够正确配对使用指令,是很重要的。
如何用ARM汇编实现r0=r1/16,急需请编程高手
ldr r0, r1, LSR #4 即将r1的内容逻辑右移4位后放入r0,这里的逻辑右移4位,即可以看做是除以2的4次方即16。
(简单的ARM汇编题目)已知C=1,R1=100,R2=90,执行指令ADDC R0,R1,R2后,R0=?
因为要加上进位位CF,而C=1,所以191
初学者求教一个关于arm汇编的简单概念 MVN R1,#0 ; MVN R0, #4; 为什么0按
补码, 0在32位的储存空间取反后是0xffffffff,有符号显示就是-1了
汇编arm LDR我知道 那么LDRD是什么啊
LDR指令的格式为:
LDR条件 目的寄存器,<存储器地址>
LDR指令用亍从存储器中将一个32位的字数据传送到目的寄存器中。该指令通常用亍从存储器
中读取32位的字数据到通用寄存器,然后对数据迕行处理。当程序计数器PC作为目的寄存器时,
指令从存储器中读取的字数据被当作目的地址,从而可以实现程序流程的跳转。该指令在程序设
计中比较常用,丏寻址方式灵活多样,请读者认真掌握。
ARM汇编中的LDR/STR
在ARM架构下, 数据从内存到CPU之间的移动只能通过LDR/STR指令来完成.而MOV只能在寄存器之间移动数据,或者把立即数移动到寄存器中,并且数据的长度不能超过8位
LDR,STR 的第一操作数是目标寄存器,第二操作数是内存地址,
LDR 内存 --> 寄存器;
STR 寄存器 --> 内存
内存的表示方式有:立即数,寄存器,或寄存器加偏移,立即数:内存的物理位置,前面加个#,如0x56000050
寄存器,加个[],如[r1],偏移的话[r1,r2],或者[r1,#4],[r1,LSL
#4]等,都差不多,就是把寄存器里的数当成地址。
以下是具体的应用例子:
1. LDR r0,=label 用于加载立即数或一个地址值到指定寄存器中
1.1 如果label是立即数: LDR r0,=0X123 ;将0X123存入r0中
1.2 如果name是个标识符: LDR r0,=label_1 ;将label_1所指向的地址值存入r0中
2. LDR r0,[r1] ;将R1中的值存到r0中
3. LDR r1,[r2,#16] ;将(r2+16)地址中的内容存到r1中
4. LDR r1,[r2],#4 ;将r2地址中的内容存到r1中,同时r2=r2+4
a. STR r1,[r2] ; 将r1中的值存到r2所指定的地址中
b. STR r1,[r2,#4] ;将r1中的值存到r2+4所指定的地址中
c. STR r1,[r2],#4 ;将r1中的值存到r2所指定的地址中, 同时r2=r2+4
以上是关于arm汇编 ldr r0 =0x00000000 这个=号代表啥啊的主要内容,如果未能解决你的问题,请参考以下文章