【问题标题】:Interpreting basic ARM instructions解释基本的 ARM 指令
【发布时间】:2019-04-26 00:23:12
【问题描述】:

我已经设置了几个问题,其中一个是:

哪些 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,如果在全部?

【问题讨论】:

    标签: linux arm assembly


    【解决方案1】:

    第一部分:

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

    全部!

    and r5, r5, #0
    

    这相当于r5 = r5 & 0,将所有位与零进行与运算将清除寄存器。

    eor r5, r5, r5
    

    这是r5 = r5 ^ r5,“异或”运算。与自身进行异或运算也会得到零,因为 1 ^ 1 也是 0

    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 中。

    cmp 指令只是将 r0 与常量 0 进行比较并设置标志,以便ble(如果小于或等于分支)可以对其进行操作。 cmp 指令不会修改其操作数。两条指令一起可以读作:

    if (r0 <= 0)
        goto end;
    

    【讨论】:

    • 谢谢!我现在有点明白了! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2011-04-02
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多