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私はObjective Cを使用しており、アセンブリからいくつかのコードを理解する必要があります。そのため、このコードを理解するのは難しいです。

4

3 に答える 3

5

符号付き16ビット乗算によって符号付き32ビットを実行し、48ビット結果の上位32ビットを返します。bは、第3オペランドの下位16ビットを使用するように指定します。

したがって、それを擬似コードに変換します。

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

ARM SMULおよびSMULW命令の説明については、ここを参照してください。

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

于 2012-07-11T12:22:41.137 に答える
4

を使用asmすることにより、アセンブラコマンドを与えることができます。

volatileと理由のために使用して、

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

理解を深めるには、このリンクを参照してください

ask命令内のコマンドは次のことを意味します:

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 に答える