smulwb汇编指令

时间:2012-07-11 12:18:13

标签: objective-c c assembly arm inline-assembly

我正在尝试理解这段代码:

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

有人知道这个汇编指令的作用吗?

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

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

所以,将其翻译成伪代码:

int_48 temp;
temp = i32*i16;
result = temp >> 16;

答案 2 :(得分:4)

使用asm可以给出汇编程序命令。

并使用volatile作为原因,

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

请参阅此link以获得更好的理解

命令内部询问指令意味着:

SMULWB       R4, R5, R3       ; Multiplies R5 with the bottom halfword of R3,
                              ; extracts top 32 bits and writes to R4.