arm64汇编学习-(2)加载存储指令2
本篇博客是基于对苯叔的第三季视频的学习整理而得,大家如果想深入学习可以购买《arm64体系结构编程与实践》以及购买苯叔出品的第三季视频。
1 simple memcpy test
1.1 测试程序示例
该示例的用意就是将0x80000开始的32个字节拷贝到0x200000内存处。
/*
lab5: 拷贝0x80000地址的内容到0x2000000地址,拷贝32字节
*/
.global my_memcpy_test
my_memcpy_test:
mov x1, 0x80000
mov x2, 0x200000
add x3, x1, 32
1:
ldr x4, [x1], #8
str x4, [x2], #8
cmp x1, x3
b.cc 1b
ret
1.2 测试之前的状态
1.2.1 寄存器的状态值
1.2.2 0x80000内存的内容
1.2.3 0x200000内存的内容
1.3 测试完成之后的状态
2 memset with stp
stp和ldp每次处理会操作16 Byte的数据。
2.1 测试程序示例
.global __memset_16bytes
__memset_16bytes:
mov x4, #0
1:
stp x1, x1, [x0], #16
add x4, x4, #16
cmp x4, x2
bne 1b
ret
2.2 测试之前
2.3 测试之后
由此可以看出该程序是要将0x200008开始,长度为0x60的内存都设置为0x55
stp每次执行会操作16个byte的数据
3 label access test
3.1 测试程序示例
/*lab7 : label access test*/
#define my_label 0x30
.globl string1
string1:
.string "Boot at EL"
.align 3
.globl my_data
my_data:
.word 0x44
.align 3
.global access_label_test
access_label_test:
/*1. 加载一个很大的数*/
ldr x1, =0xffff0000ffff0000
/*2. 初始化寄存器的值,比特位操作*/
ldr x2, =(1<<0) | (1<<2) | (1<<20) | (1<<40) | (1<<55)
//这是错误的访问方式,mov指令只能访问16bit数据
//mov x2, (1<<0) | (1<<2) | (1<<20) | (1<<40) | (1<<55)
/*3. 访问一个宏定义 */
ldr x0, =my_label /*把宏的值加载到x0寄存器*/
ldr x1, my_label /* PC值 + 宏的值,然后加载这个地址的值到x1寄存器*/
/*4. 访问一个字符串*/
ldr x0, string1 /*加载string1的ASCII码的值到x0,加载8个字节的数据*/
ldr x1, =string1 /*加载string1的地址到x1寄存器。
若读取地址的值,可以得到string1的ascii*/
/*5. 访问一个data*/
ldr x0, my_data /*加载mydata的值到x0*/
ldr x1, =my_data /*加载mydata的地址到x1*/
ret
3.2 测试之前
3.3 测试之后
3.3.1 加载立即数label
3.3.2 加载label
3.3.3 加载string label
3.3.4 加载data label
- 由此可以看出,ldr x0, my_data是加载my_data的数据到x0寄存器中,由于ldr操作的时候是按照8 Byte去处理的,所以会把临近的4 Byte拷贝到x0寄存器中。
- Ldr x1, =my_data则是把my_data的地址加载到x1寄存器中。