ARM汇编-LDR指令学习

更新时间:2023-05-17 12:19:37 阅读: 评论:0

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

本文发布于:2023-05-17 12:19:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/667555.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:指令   地址   存储器   数据   寄存器   完成   图片   变量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图