1

我试图理解这段代码:

inline SInt32 smul32by16(SInt32 i32, SInt16 i16)
{
    register SInt32 r;
    asm volatile("smulwb %0, %1, %2" : "=r"(r) : "r"(i32), "r"(i16));
    return r;
}

有人知道这个汇编指令是做什么的吗?

更新: PS我使用目标C。我应该理解一些汇编代码。这就是为什么我很难理解这段代码。

4

3 回答 3

5

它通过带符号的 16 位乘法执行带符号的 32 位,并返回 48 位结果的前 32 位。b 指定使用第三个操作数的低 16 位。

因此,将其翻译成伪代码:

int_48 temp;
temp = i32*i16;
result = temp >> 16;
于 2012-07-11T12:23:55.687 回答
4

通过使用asm,您可以提供汇编程序命令。

并使用volatile的原因,

volatile for the asm construct,  to prevent GCC from deleting the asm statement as unused

请参阅此链接以更好地理解

询问指令中的命令意味着:

SMULWB       R4, R5, R3       ; Multiplies R5 with the bottom halfword of R3,
                              ; extracts top 32 bits and writes to R4.
于 2012-07-11T12:25:11.350 回答
4

有关 ARM SMUL 和 SMULW 指令的说明,请参见此处:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/CHDIABBH.html

于 2012-07-11T12:22:41.137 回答