【问题标题】:ASM code implementation for multiplying integer整数相乘的 ASM 代码实现
【发布时间】:2019-10-09 05:00:21
【问题描述】:

以下 ASM 代码用于通过询问用户的输入来查找两个整数的乘积。

实现以下这些代码行的目的是什么?

MOVNE R2, R2, LSL #1 
MOVNE R4, R4, LSL #1
TST R1, R4

完整代码:

.global multiply

.text

multiply:
    MOV R2, R0 
    MOV R0, #0 
    MOV R3, #0 
    MOV R4, #1
loop:
    CMP R3, #0 
    MOVNE R2, R2, LSL #1 
    MOVNE R4, R4, LSL #1
    TST R1, R4
    BEQ iterate
    ADD R0, R0, R2

iterate:
    ADD R3, R3, #1
    CMP R3, #31
    BLE loop

exit:
    BX LR

【问题讨论】:

  • 来自assembly 标签:“请务必同时标记您正在使用的处理器和/或指令集,以及汇编程序。”另外,请通过缩进四个空格(或选择代码并按 Ctrl-K 或 Command-K)来修复格式。

标签: assembly arm


【解决方案1】:

我假设您已经意识到这一点,例如3 * 11 可以改写为3 * 1 + 3 * 2 + 3 * 8。后一种形式基本上是您发布的代码计算结果的方式。

R0R1 中有被乘数和乘数;我们称它们为XY,以及R3 中的位号(0..31);让我们称之为N

所以对于N 的每个值,您计算X << N,即X * 2^N。这实际上就是 CMP R3, #0 / MOVNE R2, R2, LSL #1 所做的。移位只是向左的一次移位,即当前值的两倍,但是由于除了第一次迭代之外,您每次迭代都这样做,您最终会得到X << N

然后你检查YNth位是否设置:

(CMP R3, #0 )
MOVNE R4, R4, LSL #1     @ R4 = 1 << N == 1 * 2^N
TST R1, R4               @ Set flags based on Y & (1 * 2^N)

如果YNth 位已设置,则将X &lt;&lt; N 添加到结果中。然后重复N等下一个值。

3 * 11(二进制0011 * 1011)的情况下,Y 中设置了位 0、1 和 3,因此您得到结果 (3 &lt;&lt; 0) + (3 &lt;&lt; 1) + (3 &lt;&lt; 3) == 3*1 + 3*2 + 3*8 == @ 987654350@ == 33.

【讨论】:

    猜你喜欢
    • 2011-04-26
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多