2011-12-05 15 views
1

所以我正在代码洞里,我基本上用我的跳转替换_memcpy的调用,然后我想保存源代码中的内容。原装配:行内组装 - AT&T语法 - 如何移动到一个变量

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); 
} 

而且我发现了以下错误: 错误:%后数编号失踪-letter 错误:数编号%后失踪-letter

基本上它的大喊大叫我为我: “MOVL 8(%ECX),%0 \ n \ t” 的: “= G”(大小)

有谁知道我应该如何正确地在& T为这样句法?我真的很想念在OS X的英特尔的语法:/

+0

立即值使用$不喜欢%$ 0 –

回答

1

由于导致AT & T代码使用百分号为注册名,你必须use double percent signs的寄存器名称时,有操作数,如size

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

这与您有时需要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语法令人难以置信的混乱。 :)

+0

我认为还有:/但我得到更多的错误: /var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:585:too许多'mov'的内存引用 /var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:590:too'mov'的许多内存引用 – Geesu

+0

是的,没有'mov mem32,mem32'的操作码,所以你会需要使用注册表进行移动。我添加了关于此的一个注释。 – Martin

相关问题