arm64汇编之寻址

批处理
• 阅读 1821

[addr]表示寻址,包含在[]号之内的必然有一个寄存器,这个寄存器的值是一个内存地址,称之为Base Register,可以理解为c语言里面的一个指针,Base Register在寻址之前或者之后都可以进行一些运算操作,操作结果可以更新到Base Register,也可以不更新到Base Register,寻址方式分为四种:
1.最简单形式:Base Register模式,可类比于: *(ptr)<->value,下面的x1不会变

ldr表示将内存中的值读取到寄存器中,ldr的右操作数一定是内存地址的
ldr x0, [x1]  /* [x1] -> x0 */
取x1的值为地址,取该内存地址的值,赋值给x0寄存器

2.尾部带感叹号!带形式,称之为Pre-Index寻址模式,可类比于:*(++ptr)<->value
下面的x1会先更新,然后用来寻址取值

str表示将寄存器中的值存放到内存地址
str x2, [x1,x2,LSL#2]!
/* x1 = x1 + x2 << 2; x2->[x1]; */
先计算出x1,用来寻址,会改变x1,然后将x2的值存储在内存地址为x1的地址

3.单纯的[REG]的形式:Post-Index寻址模式,可类比于:*(ptr++)<->value
下面的x1先寻址,在更新x1

ldr x3, [x1],x2,LSL#2
这有点类似于base register的变种
先取地址为x1的值赋值给寄存器x3,然后在修改x1=x1+x2 << 2

4.其他的形式:Offset寻址模式,可类比于*(ptr +xxx) <-> value
下面的x1不会更新

str x2,[x1,x2,LSL#2]
将寄存器x2的值存放到 地址为x1+x2 << 2的内存

总结:[]宗括号里面表示地址运算,最终得到一个地址, ldr 寄存器(例如x1),[] 表示取[]内存地址的值赋给寄存器
str 寄存器(例如x2) , [] 表示将x2的值存到[]的内存地址

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Peter20 Peter20
4年前
mysql中like用法
like的通配符有两种%(百分号):代表零个、一个或者多个字符。\(下划线):代表一个数字或者字符。1\.name以"李"开头wherenamelike'李%'2\.name中包含"云",“云”可以在任何位置wherenamelike'%云%'3\.第二个和第三个字符是0的值wheresalarylike'\00%'4\
Wesley13 Wesley13
3年前
PIC中档单片机汇编指令详解(5)
位操作指令详述BCF数据寄存器指定位清0语法形式:BCFf,b操作数:f为数据寄存器的低7位地址(0x00~0x7F)B为数据位编号(0~7)执行时间:一个指令周期执行过程:使数据寄存器f的的b位清0状态标志影响:无说明:该指令可对任何数据寄存器的任意一个位置清0,常用于标志位的设定和清除,或者把某一管脚置成低电平。指
Wesley13 Wesley13
3年前
mysql中时间比较的实现
MySql中时间比较的实现unix\_timestamp()unix\_timestamp函数可以接受一个参数,也可以不使用参数。它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数,如果使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970010100:00:0
Wesley13 Wesley13
3年前
1 汇编实现简单的算数运算
1汇编实现简单的四则运算1.1加法inta\30;intb\20;intc;//cab;asm("mov%1,%0\\n\\t"//mov操作数写入寄存器"add%2,%0"//a
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
小万哥 小万哥
1年前
C 语言指针完全指南:创建、解除引用、指针与数组关系解析
C语言中的指针创建指针我们可以使用引用运算符&获取变量的内存地址:cintmyAge43;//一个int变量printf("%d",myAge);//输出myAge的值(43)printf("%p",&myAge);//输出myAge的内存地址(0x7ff
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这