1

ヘッダーファイル内の次のインラインアセンブリを、アセンブリなしで対応するx86-64 .asmファイルまたはcスタイル関数に変換するのを手伝ってくれる人はいますか?

extern const char hexlu[];
void _inline hextoascii(char* a_src , char* a_dest ) {
_asm {

              mov esi, a_src;
    mov edi, a_dest;
    sub ebx,ebx

    mov edx,[esi+00]
    mov bl,dl
    mov ax,word ptr [ebx*2+hexlu]
    mov [edi+00],ax
};
}
4

3 に答える 3

1

主に、次のように単純に使用することをお勧めしますitoa()

static inline void hextoasacii(char *a_src, char *a_dest)
{
    (void)itoa(*a_src, a_dest, 16);
}

しかし、これにはこれによって終了するという欠点がありa_destますNULL。つまり、3 (2 ではなく) バイトのスペースが必要なので、これは 100% 同等ではありません。

示されているインライン アセンブリ コードは、どのような場合でも、メモリ アクセスに関して特に最適というわけではありません。C/C++の raw フォーム (ただし、もちろん、255 エントリ サイズのhexlu[]配列の正確な内容に依存します。char *hexlu[] = { "00", "01", "02", ... };

static inline void hextoascii(char *a_src, char *a_dest)
{
    static const char hexdigits[16] = "0123456789abcdef";
    int src = *a_src;
    a_dest[0] = hexdigits[src >> 4];
    a_dest[1] = hexdigits[src & 15];

    // make this:
    // *(unsigned short*)a_dest =
    //     ((unsigned short)hexdigits[src & 15]) << 8 |
    //     (unsigned short)hexdigits[src >> 4]
    //
    // if it absolutely _must_ be a single store
}

サイドノート:

2 進数/16 進数の変換を実際にアセンブリ方式で行いたい場合はpshufb、16 文字のテーブル ルックアップに SSSE3 ( ) を使用して上記をコーディングする方法があります。これにより、実質的に単一の命令でと同等の処理をsprintf("%llx", tgt_string, val_uint64)実行できます。 pshufb

これを行う方法の例とその仕組みの説明は次のとおりです。

XMMSSSE3 ソリューションは、バイト単位で行うため、レジスタの 8 分の 1 しか使用されないため、一度に複数のバイトを変換するほど大きなスピードアップは提供しません。関数を (効率的に) 変換して、SSSE3 をそのまま使用することはできません。ただし、(メモリ領域の 16 進ダンプを出力するために) ループで呼び出している場合は、Wojciech のサンプル コードのような関数を使用すると、非常に大幅な速度向上が得られます。

于 2013-02-27T17:46:05.533 に答える
1
void hextoascii(char* src, char* dest)
{
    dest[0] = hexlu[  2*(unsigned)src[0]];
    dest[1] = hexlu[1+2*(unsigned)src[0]];
}
于 2013-02-27T17:17:21.260 に答える
0

32ビットポインターを64ビットポインターに変換するだけでよいと思います。

extern const char hexlu[];
void _inline hextoascii(char* a_src , char* a_dest ) {
_asm {
    mov rsi, a_src;
    mov rdi, a_dest;
    sub rbx, rbx;

    mov rdx, [rsi];
    mov bl, dl;
    mov ax, [2*rbx+hexlu];
    mov [rdi], ax;
};
}
于 2013-02-27T17:17:45.147 に答える