ARM汇编-LDR指令学习
1,ldr加载指令
LDR指令的格式为:
遥远近义词
LDR{条件} ⽬的寄存器,<;存储器地址>
LDR指令⽤亍从存储器中将⼀个 32位的字数据传送到⽬的寄存器中。该指令通常⽤亍从存储器中读取32位的字数据到通⽤寄存器,
然后对数据进⾏处理。当程序计数器PC作为⽬的寄存器时,指令从存储器中读取的字数据被当作⽬的地址,从⽽可以实现程序流程的跳转。该指令在程序设计中⽐较常⽤,因寻址⽅式灵活多样,请读者认真掌握。指令⽰例:
LDR R0,[R1] ;将存储器地址为R1的字数据读⼊寄存器R0。
LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读⼊寄存器R0。
LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读⼊寄存器R0。
LDR R0,[R1,R2]!;将存储器地址为R1+R2的字数据读⼊寄存器R0,幵将新地址R1+R2写⼊R1。
LDR R0,[R1,#8]!;将存储器地址为R1+8的字数据读⼊寄存器R0,幵将新地址R1+8写⼊R1。
LDR R0,[R1],R2 ;将存储器地址为R1的字数据读⼊寄存器R0,幵将新地址R1+R2写⼊R1。
LDR R0,[R1,R2,LSL#2]!;将存储器地址为R1+R2×4的字数据读⼊寄存器R0,并将新地址R1+R2×4写⼊R1。
LDR R0,[R1],R2,LSL#2 ;将存储器地址为R1的字数据读⼊寄存器R0,幵将新地址R1+R2×4写⼊R1。”
ARM是RISC结构,数据从内存到CPU之间的移劢只能通过L/S指令来完成,也就是ldr/str指令。⽐如想把数据从内存中某处读取到寄存器中,叧能使⽤ldr ⽐如:
ldr r0, 0x12345678
就是把0x12345678这个地址中的值存放到r0中。
2,ldr伪指令
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。LDR伪指令的形式是“LDR Rn,=expr”。例⼦:
COUNT EQU 0x40003100
……
LDR R1,=COUNT
MOV R0,#0
STR R0,[R1]
COUNT是我们定义的⼀个变量,地址为0x40003100。这中定义⽅法在汇编语⾔中是很常见的,如果使⽤过单⽚机的话,应该都熟悉这种⽤法。
LDR R1,=COUNT ;是将COUNT这个变量的地址,也就是0x40003100放到R1中。
MOV R0,#0 ;是将⽴即数0放到R0中。
STR R0,[R1] ;是⼀个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就
是将0放到地址为0x40003100的存储单元中去。可见这三条指令是为了完成对变量COUNT赋值。⽤三条指令来完成对⼀个变量的赋值,看起来有点不太舒服。这可能跟ARM的采⽤RISC有关。
下⾯还有⼀个例⼦
;将COUNT的值赋给R0
LDR R1,=COUNT
LDR R0,[R1]
LDR R1,=COUNT ;这条伪指令,是怎样完成将COUNT的地址赋给R1,有兴趣的可以看它编译后的结果。这条指令实际上会编译成⼀条LDR指令和⼀条DCD伪指令。
2,LDR 的两种⽤法
1)LDR pc, =MyHandleIRQ 表⽰将MyHandleIRQ符号放⼊pc寄存器中
动漫男生帅气图片2)LDR PC,MyHandleIRQ 表⽰将读取存储器中MyHandleIRQ符号所表⽰的地址中的值,及需要多读⼀次存储器。
在代码中:
start:
ldr pc,=MyHandleRet @jump to HandleRet
ldr pc,=MyHandleUndef @jump to HandleUndef
ldr pc,=MyHandleSWI @jump to HandleSWI篮球场的尺寸
ldr pc,=MyHandleIabort @jump to HandleIabort
ldr pc,=MyHandleDabort @jump to HandleDabort
nop
ldr pc,=MyHandleIRQ @jump to HandleIRQ <=之前出错的⼀⾏
ldr pc,=MyHandleFIQ @jump to HandleFIQ
@MyHandleIRQ: .word OS_CPU_IRQ_ISR
MyHandleIRQ:
sub lr, lr, #4 @ to calculate the return address
提拉米苏蛋糕图片stmdb sp!, {r0-r12,lr}
ldr lr, =int_return @ restore the return address
表白情话ldr pc, =int_handle @ call for the interrupt handler
在“之前出错的⼀⾏”处,如果改成“ldr pc,MyHandleIRQ”当中断来临时,⽆法进⾏中断处理。
另⼀种情况是正确的,注意体会:
start:
ldr pc,=MyHandleRet @jump to HandleRet
ldr pc,=MyHandleUndef @jump to HandleUndef
ldr pc,=MyHandleSWI @jump to HandleSWI
ysl口红
ldr pc,=MyHandleIabort @jump to HandleIabort
ldr pc,=MyHandleDabort @jump to HandleDabort
nop
ldr pc,MyHandleIRQ @jump to HandleIRQ <=之前出错的⼀⾏
ldr pc,=MyHandleFIQ @jump to HandleFIQ
MyHandleIRQ: .word OS_CPU_IRQ_ISR
作文怎么列提纲@MyHandleIRQ:
@ sub lr, lr, #4 @ to calculate the return address
@ stmdb sp!, {r0-r12,lr}
@ ldr lr, =int_return @ restore the return address
关于志向的名言警句
@ ldr pc, =int_handle @ call for the interrupt handler
因为当中断来临时,还需要去MyHandleIRQ处把OS_CPU_IRQ_ISR取出,即多取⼀次存储器。本⽂转⾃:/uid-28458801-id-4084264.html