首页 > 其他分享 >03-A64指令集1——加载与存储指令

03-A64指令集1——加载与存储指令

时间:2024-04-04 20:55:20浏览次数:19  
标签:03 A64 指令 指令集 寄存器 X0 X1 x0 加载

本章思考题

  1. A64指令集有什么特点?
    答:它可以处理64位宽的寄存器和数据并且使用64位的指针来访问内存。
    A64指令集有如下特点。
    1. 具有特有的指令编码格式。
    2. 只能运行在AArch64状态。
    3. 指令的宽度为32位。
  2. A64指令集支持64位宽的数据和地址寻址,为什么指令的编码宽度只有32位?
    答:因为A64指令集基于寄存器加载和存储的体系结构设计,所有的数据加载、存储以及处理都是在通用寄存器中完成的。ARM64一共有31个通用寄存器,即X0~X30,因此在指令编码中使用5位宽,这样一共可以索引32(25=32)个通用寄存器。另外,在下面的条件下,我们还可以描述第31个寄存器。
    • 当使用寄存器作为基地址时,把SP(栈指针)寄存器当作第31个通用寄存器。
    • 当用作源寄存器操作数时,把XZR当作第31个通用寄存器。
  3. 下面两条指令有什么区别?
     LDR X0, [X1]
     LDR X0, [X1, #8]
    
    答:第2行代码增加了偏移量。
     LDR X0, [X1]     // 以X1寄存器中的内容作为内存地址,加载此内存地址的内容到X0寄存器
     LDR X0, [X1, #8] // 把X1中的内容加一个偏移量8,以相加的结果作为内存地址,加载此内存地址的内容到X0寄存器
    
  4. 在加载和存储指令中,什么是前变基模式与后变基模式?
    答:变基模式主要有如下两种。
    • 前变基(pre-index)模式:先更新偏移量地址,后访问内存地址。
    • 后变基(post-index)模式:先访问内存地址,后更新偏移量地址。
  5. 在下面的代码中,X0寄存器的值是多少?
     my_data:
         .word 0x40
     ldr x0, my_data
    
    答:X0寄存器的值是0x40。
  6. 请解释下面的代码。
     #define LABEL_1 0x100000
     ldr x0, LABEL_1
    
    答:运行上面的代码后,汇编器会报错,因为0x100000的偏移量已经超过这条指令规定的范围了。
  7. 在下面的代码片段中,X1和X2寄存器的值分别是多少?
     my_data:
         .quad 0x8a
    
     ldr x5, =my_data
     ldrb x1, [x5]
     ldrsb x2, [x5]
    
    答:X1寄存器的值为0x8a,X2寄存器的值为0xffffffffffffff8a。
  8. 在加载与存储指令中,什么是可扩展(scaled)模式和不可扩展(unscaled)模式?
    答:可扩展模式和不可扩展模式的区别在于是否按照数据大小来进行扩展,扩大寻址范围。
    • 可扩展模式:LDR指令中的基地址加偏移量模式为可扩展模式,即偏移量按照数据大小来扩展并且是正数,取值范围为0~32 760。
    • 不可扩展模式:即偏移量只能按照字节来扩展,还可以是正数或负数,取值范围为-256~255,例如LDUR指令。
  9. 下面几条MOV指令中,哪些能成功执行?哪些会无法正常执行?
    mov x0, 0x1234
    mov x0, 0x1abcd
    mov x0, 0x12bc0000
    mov x0, 0xffff0000ffff
    
    答:mov x0, 0x1abcd会无法正常执行,其他都能成功执行。
  10. 要加载一个很大的立即数到通用寄存器中,该如何加载?
    答:使用LDR伪指令来实现,如下面的代码片段所示。
    #define BIG_DATA 0xffff_000_ffff_ffff
    ldr x0, =BIG_DATA
    
  11. 使用如下MOV指令来设置某个寄存器的值,有什么问题?
    mov x0, (1 << 0) | (1 << 2) | (1 << 20) | (1 << 40) | (1 << 55)
    
    答:汇编器报如下错误信息。
    test.S: Assembler messages:
    test.S:67: Error: immediate cannot be moved by a single instruction
    
  12. 在下面的实例代码中,X0和X1寄存器的值分别是多少?
    string1:
        .string "Booting at EL"
    
    ldr x0, string1
    ldr x1, =string1
    
    答:第一条LDR指令把字符串的ASCII值加载到X0寄存器中。
    第二条LDR指令是一条伪指令,它把string1的地址加载到X1寄存器中。
  13. 在下面的实例代码中,X0和X1寄存器的值分别是多少?
    my_data:
        .word 0x40
    
    ldr x0, my_data
    ldr x1, =my_data
    
    答:第一条LDR指令把my_data存储的数据读出来,即读出0x40。
    第二条LDR指令把标签my_data的地址读出来。

标签:03,A64,指令,指令集,寄存器,X0,X1,x0,加载
From: https://www.cnblogs.com/goldenretriever/p/18114589

相关文章

  • 前端学习<四>JavaScript基础——03-常量和变量
    常量(字面量):数字和字符串常量也称之为“字面量”,是固定值,不可改变。看见什么,它就是什么。常量有下面这几种:数字常量(数值常量)字符串常量布尔常量自定义常量数字常量数字常量非常简单,直接写数字就行,不需要任何其他的符号。既可以是整数,也可以是浮点数。例如: //不......
  • C++ 实验 03
    实验3.1设计一个用来表示直角坐标系的Location类,有两个double型私有数据成员x,y;主程序中,输入相应的值,创建类Location的两个对象a和b,分别采用成员函数和友元函数计算给定两个坐标点之间的距离。【提示】类Location的参考框架如下:classLocation{public:       Loc......
  • 03-Java框架FTPClient 使用rename()移动文件和文件重命名
    1需求由于业务种种原因,现在需要将ftp中已存文件移动到其它文件夹。2初始策略一开始走上弯路,直接翻看FTPClientAPI有无move方法,但没发现:于是曲线救国,想着采用先复制、再删除,伪代码:InputStreaminputStream=ftpClient.retrieveFileStream("/AAA/test.txt");ftpClient.st......
  • 算法 哈希表 day03
    哈希表当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。牺牲了空间换取了时间当我们想使用哈希法来解决问题的时候,我们一般会选择如下三种数据结构。数组set(集合)map(映射)第一题:242.有效的字母异位词-力扣(LeetCode)//暴力publicstaticboo......
  • 2024.03.31新生考核Web部分 writeup
    2024.03.31新生考核Web部分writeup1.Web1考察点:burpsuite使用、http基本信息打开实例,可以看到一个网页:查看源码、cookie后无果,发现当前网页文件为inbex.php,与平常做题时默认访问的页面index.php不同,故在网址栏访问index.php。发现无论怎么访问,页面都会回到inbex.php。此......
  • 搜索引擎-03-搜索引擎原理
    拓展阅读搜索引擎-01-概览搜索引擎-02-分词与全文索引搜索引擎-03-搜索引擎原理Crawlhtmlunit模拟浏览器动态js爬虫入门使用简介Crawljsoup爬虫使用jsoup无法抓取动态js生成的内容CrawlWebMagic爬虫入门使用简介webmagic全网搜索引擎架构与流程如何?全网搜索......
  • 【阿里淘天笔试题汇总】2024-04-03-阿里淘天春招笔试题(第一套)-三语言题解(CPP/Pytho
    ......
  • 【阿里淘天笔试题汇总】2024-04-03-阿里淘天春招笔试题(第二套)-三语言题解(CPP/Pytho
    ......
  • 2024-04-03
    2024-04-03上午去杜甫草堂了中午吃火锅了下午打球了晚上来写题了(就写了一个……)Explorationplan发现答案是有上界的并且是最小化最大值直接想到二分Floyd预处理两点之间的距离二分一个limit点拆成左右两个每次距离不超过limit的点对之间连容量为Inf的边表示......
  • P3038 [USACO11DEC] Grass Planting G
    原题链接题解树上区间修改加单点查询,虽然可以树状数组,但是线段树更通用一点然而线段树通常处理的是点权,可这里是边权,怎么办呢?我们可以把边权转换成点权,由于每个点的子边有若干个,但父边有且只有一个,这样我们就把边权变成边下方点的点权然后区间修改和单点求和的时候把lca的点权......