首页 > 解决方案 > 使用(MLA 指令)将 C++ 转换为 ARM 程序集

问题描述

我正在尝试翻译此 C++ 代码:

y = y+ x*32;
z = y+ x*x;

对于 ARM 汇编假设(x 是 R1 寄存器,y 是 R2,z 在 R3 中),我应该为每种情况只使用一个汇编指令 所以,我建议使用 (MLA) 但我不知道如何,可以你请帮帮我!!

标签: c++arm

解决方案


首先,将您的代码片段放在一个函数中并创建一个完整的代码。

void x(void){
    volatile int x = 1, y = 2, z = 3;
    y = y+ x*32;
    z = y+ x*x;
}

然后,在Compiler Explorer上编译它。

结果是:

x:
        mov     r1, #1
        mov     r2, #2
        mov     r3, #3
        sub     sp, sp, #16
        str     r1, [sp, #4]
        str     r2, [sp, #8]
        str     r3, [sp, #12]
        ldr     r2, [sp, #4]
        ldr     r3, [sp, #8]
        add     r3, r3, r2, lsl #5
        str     r3, [sp, #8]
        ldr     r0, [sp, #4]
        ldr     r1, [sp, #4]
        ldr     r2, [sp, #8]
        mla     r3, r1, r0, r2
        str     r3, [sp, #12]
        add     sp, sp, #16
        bx      lr

之后,从值中获取变量的赋值。看起来[sp, #4]x[sp, #8]y[sp, #12]z

最后,使用这个关系,构造结果。

答案是:

add r2, r2, r1, lsl #5
mla r3, r1, r1, r2

推荐阅读