zoukankan      html  css  js  c++  java
  • ARM寄存器的8种寻址方式01

    一、立即数寻址

    操作数由指令本身给出

    MOV r0,#0x0F //是所有寻址方式里面速度最快的,但是受到合法立即数的限制

    立即数要求以#和$开头

    十六进制,#后跟0x;十进制,#后直接加;八进制,#后跟0;二进制,#后跟0b

    什么是合法立即数?ARM中要求立即数是一个8位的常数循环左移偶数位得到的数值。也就是说只要是在0x00~0xFF中的一个数,或者是在这个区间中的一个数循环左移偶数位的数值,都是合法立即数。

    给大家一个快速判断方法:

    1、如果该数在0x00~0xFF之间,它是一个合法立即数;

    2、如果该数>0xFF,先把它换算成十进制数,如果能被4整除,它就是一个合法立即数,否则是一个非法立即数。

    二、寄存器寻址

    利用寄存器中的数值作为操作数进行操作

    ADD r0,r1,r2

    MOV r0,r1

    是速度仅次于立即数寻址的操作。

    三、寄存器移位寻址

    操作数由寄存器中的数值移位得到,移位的方式由助记符的形式给出,移位数可以是一个立即数也可以是一个寄存器数值

    MOV r1,#7

    MOV r2,#1

    MOV r0,r1,r2,LSL #2

    四、寄存器间接寻址

    把寄存器中的值当做是被操作的数值在存储器中的地址,操作数本身放在寄存器中。

    LDR r0,[r1]

    STR r0,[r1]

    实验验证:

    clip_image002

    执行第一条指令(MOV r1,0x35000)后寄存器的状态值

    clip_image004

    当前内存状态

    clip_image006

    执行第二条指令(LDR r0,[r1])后寄存器状态

    clip_image008

    可以看到r0寄存器的值已经变成上面内存地址为0x35000处内存的内容了。由于内存中数据的存储是有大小端问题的,所以看上去不一样实际是一样的值。

    clip_image010

    此时寄存器状态

    clip_image012

    r0保存着地址为0x35000的存储器中的数值,r1立即数赋值0x35000,r2立即数赋值0x34000。

    此时内存状态

    clip_image014

    clip_image016

    STR r0,[r2]指令执行完之后,0x34000处状态

    clip_image018

    该处值已经修改为寄存器r0的值。

    LDR和STR指令说明:

    LDR 目的寄存器,【存储器地址】

    用于从存储器地址处获取一个32位的数据送至目的寄存器,当程序计数器PC被当做目的寄存器时,存储器中取到的数据被当做跳转的目的地址来使用,从而实现程序的跳转。

    STR 源寄存器,【存储器地址】

    用于将源寄存器中的数据送入存储器地址处。

  • 相关阅读:
    Ubuntu MP4转MP3 软件:soundconverter
    Jupyter 中添加conda环境
    Pandas 比较两个 DataFrames 是否相同
    苹果ID不能登陆:The action could not be completed. Try again
    awsome node.js
    Cygwin
    library dep
    process
    MSCV version
    cmake_host_system_information
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3358950.html
Copyright © 2011-2022 走看看