第21部分- Linux ARM汇编adrp指令 ADR指令作用:小范围的地址读取指令。ADR 指令将基于PC 相对偏移的地址值读取到寄存器中。 原理:将有符号的21位的偏移,加上PC, 结果写入到通用寄存器,可用来计算+/-1MB范围的任意字节的有效地址。 ADRP作用:以页为单位的大范围的地址读取指令,这里的P就是page的意思。 原理:符号...
static voidadrp_test() {printf("g_val1 addr0x%lx, adrp_val10x%lx, adrp_test addr0x%lx\n", (uint64_t)g_val1,ADRP(g_val1), (uint64_t)adrp_test);printf("g_val2 addr0x%lx, adrp_val20x%lx, adrp_test addr0x%lx\n", (uint64_t)g_val2,ADRP(g_val2), (uint64_t)adrp_te...
ADR: 加载PC相对地址的label地址,范围+/- 1MB; ADRP: 加载PC相对地址,label地址,并且4KB对齐,范围+/- 4GB; /* others inst */ .align3 .global my_test_data my_test_data: .dword 0x12345678abcdeeff .global adrp_test adrp_test: adr x0, my_test_data adrp x1, my_test_data //4KB align add...
3.将将1 和 2 的结果相加 给 X0 寄存器!! 注:地址为pc寄存器左边的地址,adrp是找出要获取参数的地址范围,然后下个pc寄存器执行的代码会定位到准确的物理地址。 指令区域 由于adrp的为范围寻址并不会精确到具体地址所以地址的最后三位,即12bit位为0是需要系统下一步执行的时候补上的。 根据cpu总线的计算规则1...
adrp指令(address page) 它是一条地址读取指令,是用于计算指定的数据地址到当前PC值的相对偏移。 下面是它具体的用法及解释 得到一个大小为4KB的页的基址,而且在该页中有全局变量g的地址;ADRP就是讲该页的基址存到寄存器X6中; ADD指令会算出g的地址,X6+#_g@PAGEOFF,#_g@PAGEOFF是一个偏移量;这样就得到了...
adrp adrp是计算数据指定地址到当前PC值的相对偏移,计算方法为基地址加偏移地址 举例: 假如当前PC寄存器的地址为 0x1002e6888,寻址汇编代码为: adrp x01addx0 x0 #0xf28 寻址过程为 将1左移12位 1 0000 0000 0000 == 0x1000 将PC寄存器的低12位清零 0x1002e6888 ==> 0x1002e6000 ...
将 常量 放在 最近处的 literal pool 里面,然后 使用一条 ldr 语句 从 literal pool 里面加载 常量。 adr 指令 arm 中是伪指令 adr <register> aarch64 中是 标准指令 ADR <Xd>, ADRP 指令 AArch64 中的 标准指令 ADRP <Xd>,
adrp通过基地址 + 偏移 获得一个字符串(全局变量) cbz比较,为零则跳转; cbnz: 比较,为非零则跳转。 cmp: 比较功能例如 :cmp OPR1 , OPR2. = (OPR1)-(OPR2) ccmp: 双重比较.ccmp x13, x12, #0x0, ne判断x13 和 x12 同时存在 16位数据操作指令 ...
mov w0,3str w0,[sp,28]mov w1,2ldr w0,[sp,28]bladd(int,int)str w0,[sp,28]ldr w1,[sp,28]adrp x0,.LC0 add x0,x0,:lo12:.LC0 bl printf mov w0,1ldp x29,x30,[sp],32ret 第2 ~ 11行:函数add()的实体 第2行:将栈指针(stack pointer)寄存器sp的值减去32,结果仍存储到sp中。
stp x29, x30, [sp, #16] ; 保存调用该函数前的栈顶寄存器的值和该函数结束返回后下一将执行指令地址值 add x29, sp, #16 ; 更新栈底寄存器的值,(可以看出:还剩余 16 字节空间给该函数用) adrp x0, l_.str@PAGE ; 获取 ‘l_.str’ 标签所在的页的地址 ...