ARM学习1

 边界检查的简便方法:

        将有符号数作为无符号数来处理【1】,是一种检验0 ≤ x < y 的开销较低的方法,并与数组索引的边界检查(是否越界)匹配。问题的关键在于,负数的二进制补码表示看起来像一个很大的无符号数表示。因为最高有效位在有符号数中是符号位,而在无符号位中是具有最大权重的位。所以以无符号数比较x<y,可以在检查x是否小于y的同时,检查x是否是负数。 

例题:
用以下方法检查索引是否越界:如果X20 ≥ X11 或X20是负数,则跳转 IndexOutOfBounds【2】。
【只需使用一条无符号数大于或等于指令即可以完成两种检查】
SUBS XZR,X20,X11  
B.HS IndexOutOfBounds

【1】:计算机采用二进制补码,符号位参与运算,因此计算机本身是不区分有符号数和无符号数的。——译者注。

【2】:为何可以判断X20位负数?XZR寄存器始终为0,因此只能影响标志位,不能影响结果。——译者注。

代码分析:

        1、对于XZR(零寄存器),它的值始终为0。

        2、对于题目 “检查索引是否越界” ,这里的索引越界指的是数字超出了数组的最大长度。比如:有数组arr[4],学过数组的都知道,数组是从0开始的,所以这里只有0,1,2,3是不越界的,大于等于4或者小于0都是越界的(正如题目所说)。

        3、X11代表的是数组长度。

        4、B.HS表示条件分支指令,HS表示用无符号数的 “≥” ,条件码检测为C=1。

        5、SUBS,这里参考百度百科上的举例:

        SUBS R0, R1, R2(R0 = R1 - R2 并设置 CPSR 寄存器的 C 标志位)

对于本题代码,XZR一直为0,所以只影响标志位。

比如:X11=0000 0100(+4),若X20=0000 1000(+8),那相减之后,因为没有最高位借位,所以C=1(为什么C=1可以参考下面的补充学习);若X20=1111 1000(-8),若当成无符号数,相减也是大于等于0的,没有最高位借位,C=1。二者都符合B.HS的条件,所以第二条代码都可以执行。

PS:欢迎阅读,本文章只是个人学习遇到问题解决后的笔记,如果能对您有所帮助的话,甚是荣幸。如果您发现文中有误或有更好的解决方法,欢迎批评指正,谢谢!

补充学习:ARM的 N、Z、C、V 标志位的解释_xiaobai00014的专栏-CSDN博客_nzcv标志位含义 

参考书目:《计算机组成与设计 硬件/软件接口 ARM版》 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值