解释基本的ARM指令

时间:2018-11-23 06:07:12

标签: linux arm assembly

我遇到了几个问题,其中一个是:

  

其中哪些ARM指令清除寄存器r5,以便将其所有位都设置为“ 0”?

and r5, r5, #0
eor r5, r5, r5
lsr r5, #32
sub r5, r5, r5

据我了解,sub r5, r5, r5清除了寄存器,因为它从自身中减去了数字。 andeor显然看起来是错误的。

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, #0ble end的作用以及它如何影响寄存器r0,如果有的话?

1 个答案:

答案 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;