1

だから私は基本的に _memcpy への呼び出しを私のジャンプに置き換えてから、ソースにあるものを保存したいコード洞窟に取り組んでいます。元のアセンブリ:

mov     [esp+8], edx    ; size
mov     [esp+4], eax    ; ptr to source
mov     eax, [ebp+arg_4]
mov     [esp], eax      ; ptr to destination
call    _memcpy

AT&T の構文に苦労しています。基本的には、[esp+8]、[esp+4]、および [esp] を独自の変数に格納したいと考えています。私はこのようにしようとしています:

void codecave_jump( void ) __attribute__ ( ( signal, naked ) );
void codecave_jump( void ){

    void *destination, *source;
    size_t size;

    // push all registers onto the stack
    __asm__("pushal\n\t");

    // get size
     __asm__ __volatile__(
            "movl 8(%ecx), %0\n\t" : "=g" (size)
            );

    // get source
    __asm__ __volatile__(
            "movl 4(%ecx), %0\n\t" : "=g" (source)
            );

    // get destination
    __asm__ __volatile__(
            "movl %%eax, %0\n\t" : "=g" (destination)
            );

    // restore all of our registers
    __asm__("popal\n\t");

    // call memcpy
    __asm__("call __memcpy\n\t");

    // do the copy
    memcpy(destination, source, size);
}

そして、次のエラーが表示されます: エラー: % 文字の後にオペランド番号がありません エラー: %文字の後にオペランド番号がありません

基本的に、「movl 8(%ecx), %0\n\t」: "=g" (サイズ)

AT&T構文でこれを適切に行う方法を知っている人はいますか? OS X の Intel 構文が本当に恋しいです :/

4

1 に答える 1

1

結果のAT&Tコードはレジスタ名にパーセント記号を使用するため、次のようなオペランドがある場合は、レジスタ名に二重パーセント記号を使用するsize必要があります。

"movl 8(%%ecx), %0\n\t" : "=g" (size)

これは、の2倍のパーセント記号が必要になる場合がある方法と似ていますprintf。あなたはそれをさらに下に持っているようです%%eax、私はその行がうまくコンパイルされると思います。


のオペコードはありませんmov mem32, mem32。最初にデータをレジスタに移動してから、メモリの場所に移動する必要があります(Intelバージョンの場合と同じようにdestination

// get size
__asm__ __volatile__(
    "movl 8(%ecx), %eax\n\t"
    );
__asm__ __volatile__(
    "movl %%eax, %0\n\t" : "=g" (size)
    );

ちなみに、AT&Tの構文は非常に紛らわしいと思います。:)

于 2011-12-06T00:33:43.793 に答える