02arm指令集(一)——LDR,MOV,STR的使用

1.armV8的寄存器

AArch64 执行状态支持 31 个 64 位的通用寄存器,分别是 X0~X30 寄存器,而 AArch32

状态支持 16 个 32 位的通用寄存器

2.习题

  • 之前提到mov指令主要是用在寄存器与寄存器之间,和寄存器与立即数之间的数据传递所以(1)(2)就是简单的使用mov就好
  • 对于(3)(4),涉及到内存与寄存器之间的数据传递显然用ldr,但为什么不是简单的ldr x2,[0x80000],这是因为arm的指令集长度都是32位,而留给寻址地址的位数一般只有12bit,对于0x80000这样的大数据是存不下的所以CPU 的设计者规定:[] 里面必须是一个寄存器。(但是x86为什么可以这样写主要原因就是x86的指令集大小是可变长的)
  • 对于(5)LDR X5, [X1, X3], 在编程中,数组的下标(Index)通常是一个变量(比如放在 X3 里),而不是写死的常数,所以在底层就设计了这样的汇编语言
  • 对于(6)LDR X6, [X1, X3, LSL #3] ,主要还是为了灵活的变换变量的宽度,将64bit转位32bit之类的运算


  • 前变基就是先加上,再寻址
  • 后变基就是先寻址,再加上

  • 这里ldr x6, =0x1234abce是个伪代码,刚刚提过指令集的位数有限,是不能处理大数字的,所以这个=是只有编译器才能看懂的,反汇编之后是这样

    /* 假设当前 PC 地址是 0x1000 /
    ldr x6, [pc, #偏移量] /
    真正的指令:去读下面那个藏好的数 /
    ...
    ...
    /
    藏在代码段某个角落(文字池)的数据: */
    .word 0x1234abce

  • 但是刚刚mov x1,0x80000是怎么实现的呢,其实是这样的MOVZ X1, #0x8, LSL #16他是进行了一个缩放,所以使用mov有个局限性就是他后面必须跟很多0才行

  • 剩下的题就很简单了,(1)是先赋值再寻址,使用str到0x400008,0x400000不变都是0

  • (2)是先寻址,使用0x50000是x6的值


  • 对于第一行 就是获取0x20的地址
  • 对于第二行,=伪指令,之于宏定义来说就是取他的值,就是0x20

复制代码
/* test.S */
.global _start
_start:
    mov x0,0x80000
    mov x1,0x200000
    mov x2,32
loop:
    cmp x2,#0
    b.eq end
    ldr x3,[x0],#8
    str x3,[x1],#8
    sub x2, x2, #8

    b loop

end:
    b .               /* 死循环 (跳转到当前地址) */
相关推荐
小成202303202655 小时前
Linux高级02
linux·开发语言
mounter6255 小时前
【硬核前沿】CXL 深度解析:重塑数据中心架构的“高速公路”,Linux 内核如何应对挑战?-- CXL 协议详解与 LSF/MM 最新动态
linux·服务器·网络·架构·kernel
++==6 小时前
Linux 进程间通信与线程同步技术详解:IPC 机制、线程 API、同步工具与经典同步问题
linux
LCMICRO-133108477466 小时前
长芯微LPS123完全P2P替代ADP123,高性能、低压差的线性稳压器
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·线性稳压器
特长腿特长6 小时前
centos、ubantu系列机的用户和用户组的结构是什么?具体怎么配置?用户组权限怎么使用?这篇文章持续更新,帮助你复习linux的基础知识
linux·运维·centos
zzzyyy5386 小时前
Linux环境变量
linux·运维·服务器
pluvium276 小时前
记对 xonsh shell 的使用, 脚本编写, 迁移及调优
linux·python·shell·xonsh
无级程序员6 小时前
centos7 安装 llvm-toolset-7-clang出错的问题解决
linux·centos
守护安静星空7 小时前
esp32开发笔记-工程搭建
笔记·单片机·嵌入式硬件·物联网·visual studio code
CHHC18807 小时前
NetCore树莓派桌面应用程序
linux·运维·服务器