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寄存器中。
    在这里插入图片描述
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值