我遇到了几个问题,其中一个是:
其中哪些ARM指令清除寄存器r5,以便将其所有位都设置为“ 0”?
and r5, r5, #0 eor r5, r5, r5 lsr r5, #32 sub r5, r5, r5
据我了解,sub r5, r5, r5
清除了寄存器,因为它从自身中减去了数字。 and
和eor
显然看起来是错误的。
lsr r5, #32
是否也清除寄存器?它将r5寄存器移位32位,对吗?因此,该指令也可以清除该寄存器。
与此相关,我还需要解释以下代码:
当执行以下ARM指令序列时,寄存器r0和寄存器r1的内容之间是什么关系?
mov r0, #12 mov r1, #1 start: cmp r0, #0 ble end mul r1, r0, r1 sub r0, r0, #1 b start end:
我不确定cmp r0, #0
的作用以及它是否最终改变r0的值。我知道它会比较值。
因此,据我了解,运行此代码后,mul r1, r0, r1
意味着r1等于12 * 1 * 12 = 12(如果cmp r0,#0不会影响r0的值,我不知道。)
因此,r1设置为12-1 = 11。
在运行此代码后,谁能澄清我是否得到r0(12)和r1(11)的正确值,以及cmp r0, #0
和ble end
的作用以及它如何影响寄存器r0,如果有的话?
答案 0 :(得分:1)
第一部分:
这些ARM指令中的哪一个清除寄存器r5,以便将其所有位都设置为“ 0”?
所有人!
and r5, r5, #0
这相当于r5 = r5 & 0
,将所有位与零进行“与”运算将清除寄存器。
eor r5, r5, r5
这是r5 = r5 ^ r5
,“异或”操作。由于1 ^ 1
也是0
,因此与自身进行XOR运算也为零。
lsr r5, #32
正如您提到的,将所有32位右移会将它们全部清零。 ARM specification甚至表示LSR:
如果移位为32,则清除Rd,最后移出的位保留在C标志中
sub r5, r5, r5
同样,r5 = r5 - r5
会将其归零。
第二部分中的代码正在执行此操作(在C代码中):
int r0 = 12;
int r1 = 1;
while (r0 > 0)
r1 *= r0--;
因此,在循环结束时,r1的数字乘积为12、11、10 ...降至1。换句话说,这是在计算r0的阶乘并将其存储在r1中。 / p>
cmp
指令只是将r0与常量0进行比较并设置标志,以便ble
(如果小于或等于则分支,可以对其进行操作)。 cmp
指令不会修改其操作数。两条指令可以一起阅读为:
if (r0 <= 0)
goto end;