首页 > 其他分享 >04-A64指令集2——算术与移位指令

04-A64指令集2——算术与移位指令

时间:2024-04-06 21:23:52浏览次数:15  
标签:04 A64 mov 寄存器 x2 移位指令 x0 x1 X0

本章思考题

  1. 请简述N、Z、C、V这4个条件标志位的作用。
    答:如下表所示。
    条件标志位 描述
    N 负数标志(上一次运算结果为负值)
    Z 零结果标志(上一次运算结果为零)
    C 进位标志(上一次运算结果发生了无符号数溢出)
    V 溢出标志(上一次运算结果发生了有符号数溢出)
  2. 下面两条ADD指令能否编译成功?
     add x0, x1, #4096
     add x0, x1, #1, LSL 1
    
    答:不能编译成功。汇编器会报如下错误,其中第一条语句中立即数超过了范围,第二条语句中左移的位数只能是0或者12。
     test.S: Assembler messages:
     test.S: Error: immediate out of range
     test.S: Error: shift amount must be 0 or 12 at operand 3 -- 'add x0,x1,#1,LSL 1'
    
  3. 下面的示例代码中,X0寄存器的值是多少?
     mov x1, 0xffffffffffffffff
     mov x2, #2
     adc x0, x1, x2
    
    答:ADC指令的计算过程是0xffffffffffffffff+2+C,因为0xffffffffffffffff+2的过程中已经触发了无符号数溢出,C=1,所以最终计算X0寄存器的值为2。
  4. 下面的示例代码中,SUBS指令对PSTATE寄存器有什么影响?
     mov x1, 0x3
     mov x2, 0x1
     subs x0. x1. x2
    
    答:会导致C标志位为1。第二个操作数为X2寄存器的值,对应值为1,按位取反之后为0xFFFFFFFFFFFFFFFE。根据计算公式,计算3+0xFFFFFFFFFFFFFFFE+1,这个过程会发生无符号数溢出,因此4个标志位中的C=1,最终计算结果为2。
  5. 在下面的示例代码中,X0寄存器的值是多少?
     mov x1, #3
     mov x2, #1
     sbc x0, x1, x2
    
    答:X0寄存器的值为2。
  6. 检查数组array[0, index-1]是否越界,需要判断两个条件:一是输入值是否大于或等于index,二是输入值是否小于0。如下两条指令可实现数组边界检查的功能,其中X0寄存器的值为数组的边界index,X1寄存器的值为输入值input。请解释这两条指令为什么能实现数组越界检查。
     subs xzr, x1, x0
     b.hs OutOfInex
    
    答:第一条语句是带N、Z、C、V标志位的减法指令。第二条语句中的HS表示是否发生了无符号数溢出,即判断C标志位是否为1。如果C为1,跳转到OutOfIndex标签处,说明发生了溢出。
  7. 在下面的示例代码中,W2和W3的值是多少?
    ldr w1, =0x8000008a
    asr w2, w1, 1
    lsr w3, w1, 1 
    
    答:W2的值是0xC0000045,W3的值是0x40000045。
  8. 如果想在汇编代码中使某些特定的位翻转,该如何操作?
    答:例如,想把0b10100001的第2位和第3位翻转,则可以对该数与0b00000110进行按位异或运算。
    10100001 ^ 00000110 = 10100111
    
  9. 设置某个寄存器A的Bit[7,4]为0x5。下面是C语言的伪代码,用变量val来表示寄存器A的值2,请使用BFI指令来实现。
    val &=~ (0xf << 4)
    val |=  ((u64)0x5 << 4)
    
    答:代码如下。
    mov x0, #0x2 // 寄存器A的初始值为2
    mov x1, #0x5
    
    bfi x0, x1, #4, #4 // 往寄存器A的Bit[7,4]字段设置0x5
    
    BFI指令把X1寄存器中的Bit[3,0]设置为X0寄存器中的Bit[7,4],X0寄存器的值是0x52。
  10. 下面的示例代码中,X0和X1寄存器的值分别是多少?
    mov x2, #0x8a
    ubfx x0, x2, #4, #4
    sbfx x1, x2, #4, #4
    
    答:X0寄存器的值是0x8,X1寄存器的值是0xFFFFFFFFFFFFFFF8。
  11. 下面是用C语言来读取pmcr_e10寄存器Bit[15:11]的值,请使用汇编代码来实现。
    val  = read_sysreg(pmcr_e10)
    val  = val >> 11;
    val &= 0x1f;
    
    答:使用UBFX指令来实现更简洁。
    mrs x0, pmcr_e10
    ubfx x0, x0, #11, #5
    

标签:04,A64,mov,寄存器,x2,移位指令,x0,x1,X0
From: https://www.cnblogs.com/goldenretriever/p/18117951

相关文章

  • 2024-04-06 闲话
    同学朋友圈改了一首诗,原作是:曾巩写得实在是有水平。其实太久不读诗之后,看看这种状物诗,触动还是蛮强的。今天晚上做实验的时候突然融会贯通了很多事情,之前看到的很多事情有了motivation,这种感觉实在是太幸福了。但是还是有更多的事情我没有想明白,所以非常自闭,去相亲相爱一家爷......
  • 牛客面经(2024-04-07)
    美团一面4.2 基本全程八股1.双亲委派,类加载,每种类加载器加载什么?双亲委派:启动类加载器、拓展类、应用程序..打破双亲委派机制类加载过程:加载、链接(验证准备解析)、初始化、使用、卸载 2.spring AOP,bean 基于动态代理实现,jdk代理和cglibjdk代理因为是要继承pr......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......
  • ubuntu20.04.6将虚拟机用户目录映射为磁盘Z
    文章目录linux虚拟机设置为NAT模式安装sshd服务映射目录到windows磁盘安装samba套件修改配置文件smb.conf重启smbd并设置用户名和密码windows映射遇到的问题1、设置好之后映射不成功2、smbd下载失败3、smbd密码配置问题4、当有改动时候,最好重启一下smbd服务linux虚......
  • lambda演算入门 (软件工程与计算 理论部分2)20240406
    此文章来源于网络,是学习lambda演算过程的总结与复习,着重于探讨“为什么(Why)”与“怎么做(How)”,也希望能对看到它的人学习了解这个形式系统有些微帮助。由于之前看了不少wiki、tutorial、introduction之流,绝大多数读过之后仅知其然而不知其所以然,我不知道为什么它们都不解释为什......
  • Ubuntu20.04安装DeepStream6.1
    https://blog.csdn.net/m0_73702795/article/details/127940733    目录   前言   1.更新显卡驱动   2.下载CUDA   3.下载CUDNN   4.安装TensorRT   5.安装librdkafka   6.安装GStreamer   7.正式安装DeepStream前言本人亲自安装了十多遍......
  • ubuntu20.04 deepstream 6.3安装
    https://blog.csdn.net/zhoutianyou/article/details/135528185?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-13-135528185-blog-127940733.235%5Ev43%5Epc_blog_bottom_relevance_base7&depth_1-utm......
  • Rancher-rke: E0404 14:22:44.616099 5841 memcache.go:287] couldn‘t get resource
    一、根因    1、非正常关闭了主机。    2、导致docker上的metrics容器进程挂掉。二、解决办法    1、重启docker        systemctlrestartdocker    2、清理处于Exited状态的pod        dockerrm`dockerps-a|......
  • 16天【代码随想录算法训练营34期】第六章 二叉树part03(● 104.二叉树的最大深度 559
    104.二叉树的最大深度#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defmaxDepth(self,root:O......
  • 2024-04-06:用go语言,给你两个非负整数数组 rowSum 和 colSum, 其中 rowSum[i] 是二维矩
    2024-04-06:用go语言,给你两个非负整数数组rowSum和colSum,其中rowSum[i]是二维矩阵中第i行元素的和,colSum[j]是第j列元素的和,换言之你不知道矩阵里的每个元素,但是你知道每一行和每一列的和。请找到大小为rowSum.lengthxcolSum.length的任意非负整数矩阵。且该......