大型网站如何开发,广西地矿建设集团网站,住建部网站2015年城市建设统计,阿里云上做网站文章目录 一、ldr1.地址偏移模式2.变基模式3.标签3.1 访问宏定义3.2 访问一个字符串3.3 访问一个data 二、ldp和stp1.双字节加载2.双字节存储3.双字节存储的后变基模式 三、位操作1. 移位2. 按位操作3. 位段插入4.位段提取5.零计数指令 四、跳转指令1. cmp比较两个数2. cmn负向… 文章目录 一、ldr1.地址偏移模式2.变基模式3.标签3.1 访问宏定义3.2 访问一个字符串3.3 访问一个data 二、ldp和stp1.双字节加载2.双字节存储3.双字节存储的后变基模式 三、位操作1. 移位2. 按位操作3. 位段插入4.位段提取5.零计数指令 四、跳转指令1. cmp比较两个数2. cmn负向比较 五、 条件选择指令1. csel条件选择指令2. cset条件置位指令3. csinc条件选择并增加指令 一、ldr
1.地址偏移模式
/* 读取0x80000地址的值到x0寄存器*/
ldr x0, [x1]/* 读取0x80008地址的值*/
ldr x2, [x1, #8]/* 读取x1x3 地址的值*/
ldr x4, [x1, x3]/* 读取(x1 x33) 地址的值*/
ldr x5, [x1, x3, lsl #3]2.变基模式
/* 前变基模式先更新偏移地址再访问内存 */
/* 先更新x1的值为X18然后以新的X1值为地址加载内存的值到x0 */
ldr x6, [x1, #8]!/* 后变基模式先访问内存地址再更新偏移地址 */
/* 以X1的值为地址加载该内存地址的值到X0然后再更新X1寄存器为X18*/
ldr x7, [x1], #83.标签
3.1 访问宏定义
#define my_label 0x30
ldr x0, my_label /*把宏的值加载到x0寄存器*/
ldr x1, my_label /* PC值 宏的值然后加载这个地址的值到x1寄存器*/3.2 访问一个字符串
.globl string1
string1:.string Boot at ELldr x0, string1 /*加载string1的ASCII码的值到x0加载8个字节的数据*/
ldr x1, string1 /*加载string1的地址到x1寄存器。若读取地址的值可以得到string1的ascii*/3.3 访问一个data
.align 3
.globl my_data
my_data:.word 0x44ldr x0, my_data /*加载mydata的值到x0*/
ldr x1, my_data /*加载mydata的地址到x1*/二、ldp和stp
1.双字节加载
//以X0的值为地址加载此地址的值到x3寄存器以x08为地址加载此地址的值到X7寄存器
ldp x3,x7,[x0] 2.双字节存储
//存储X1的值到地址为X4的内存中然后存储x2的值到地址为X48的内存中。
STP X1,X2,[X4]3.双字节存储的后变基模式
将寄存器 x1 的值存储到由 x0 指向的内存地址开始的位置。紧接着将寄存器 x2 的值存储到紧接着 x1 存储位置之后的内存地址。存储完成后更新 x0 寄存器的值使其增加 16 个字节。
stp x1, x2, [x0], #16三、位操作
1. 移位
指令名字含义lsl逻辑左移将寄存器中的每一位向左移动指定的位数左边空出的位用 0 填充。lsr逻辑右移将寄存器中的每一位向右移动指定的位数右边空出的位用 0 填充。asr算术右移将寄存器中的每一位向右移动但会保留被移出的最高位符号位并用它来填充空出的位ror循环右移将寄存器中的每一位向右移动右边移出的数据用来回填最左边的空位 逻辑右移和算术右移的区别
2. 按位操作
AND: 执行逻辑与操作。and destination, source1, source2EOR (Exclusive OR): 执行逻辑异或操作。eor destination, source1, source2ORR (Bitwise OR): 执行逻辑或操作。orr destination, source1, source2BIC (Bit Clear): 执行逻辑非操作后与另一个操作数进行与操作用于清除特定位。bic destination, source1, source23. 位段插入 BFI Xd,Xn,#lsb,#widthBFI位段插入指令。用Xn中的bit[0:width-1]替换Xd中从lsb开始的width位Xd其他位不变。 例子使用bfi指令把0x345中的低4位插入到x0寄存器的第八位开始的4位中
mov x1, 0x345
mov x0, 0
bfi x0, x1, 8, 44.位段提取 UBFX Xd,Xn,#lsb,#widthSBFX Xd,Xn,#lsb,#widthUBFX无符号数的位段提取指令 SBFX有符号数的位段提取指令 从Xn寄存器提取位段位段从第lsb位开始位宽为width然后结果写入到Xd寄存器的最低比特位中。UBFX指令不做符号位的扩展其他比特位是填充0SBFX会对有符号位进行扩展即当提取的位段中最高位为1时那么其他比特位会填充为1。 例子
/*提取x2从第4个bit开始提取8bit。x3其他位都是0最终0xbc*/
ldr x2, 0x5678abcd
ubfx x3, x2, #4, #8/*提取x2从第4个bit开始提取8bit。x4的其他比特位都是f 最终0xffffffffffffffbc*/
sbfx x4, x2, #4, #85.零计数指令
clz Xd,XnCLZ指令会扫描Xn寄存器中的位从最高位开始计数直到遇到第一个非零位。计数的结果即零的数量会被存储在Xd寄存器中。如果在最高位就遇到非零位CLZ 指令会返回 0因为没有任何零位。
例子
ldr x1, 0x0fffffffffffffff
clz x2, x1x2的结果为4
四、跳转指令
1. cmp比较两个数
/*相当于x1-x2*/
cmp x1,x22. cmn负向比较
/*相当于x1x2*/
cmn x1,x2然后查看NZCV位判断结果
条件后缀含义标志条件码EQ相等Z10b0000NE不相等Z00b0001CS/HS无符号数大于或者等于C10b0010CC/LO无符号数小于C00b0011MI负数N10b0100PL正数或零N00b0101VS溢出V10b0110VC未溢出V00b0111HI无符号数大于(C1)(Z0)0b1000LS无符号数小于或等于(C0)||(Z1)0b1001GE带符号数大手或等于NV0b1010LT带符号数小于N!V0b1011GT带符号数大于(Z0)(NV)0b1100LE带符号数小于或等千(Z1)||(N!V)0b1101AL无条件执行-0b1110NV无条件执行-0b1111
例子
1:cmn x1, x2add x2, x2, 1/*查看NZCV操作后缀*/mrs x0, nzcv/*mi 负数*/b.mi 1b/*测试CMP指令*/mov x2, 3
2:cmp x2, x1add x1, x1, 1/*查看NZCV操作后缀*/mrs x0, nzcv/*cs: 无符号数大于等于*/b.cs 2b五、 条件选择指令
1. csel条件选择指令
csel Xd,Xn,Xm,cond如果cond为真XdXn否则XdXm。
2. cset条件置位指令
cset Xd,cond如果cond为真Xd1否则Xd0。
3. csinc条件选择并增加指令
csinc Xd,Xn,Xm,cond如果cond为真XdXn否则XdXm1。