ARM组装中的SMMUL指令

时间:2014-03-31 13:25:19

标签: assembly arm

请参阅:http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0553a/CHDHGFEF.html

Writes the most significant signed 32 bits of the result in Rd.

SMMUL意味着可以一起增加到可修复但我不明白它是如何计算“最重要的有效32位结果”

提前致谢

1 个答案:

答案 0 :(得分:2)

当您将2个32位值相乘时,您将获得64位值,并且必须将结果保存在两个寄存器中,因为寄存器为32位。但是,您可能对最低32位和最高32位不感兴趣。

SMULL指令为您提供。首先计算64位结果然后它可以简单地丢弃/截断低32位,或者它可以将它们舍入到更高的32位(SMULLR)。

$ cat smmul.c 
int smull(int a, int b, int c, int d) {
    asm volatile("smmul r0, r2, r3");
}

int main() {
    int a, b, c;
    a = 0x00000001;
    b = 0x00000001;
    c = smull(0, 0, a, b);
    printf("%x(%d) %x(%d) %x(%d)\n", a, a, b, b, c, c);
    a = 0x40000000;
    b = 0x00000004;
    c = smull(0, 0, a, b);
    printf("%x(%d) %x(%d) %x(%d)\n", a, a, b, b, c, c); 
    return 0;
}

$ smmul
1(1) 1(1) 0(0)
40000000(1073741824) 4(4) 1(1)