だから私は基本的に _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 構文が本当に恋しいです :/