2011-12-05 41 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

相關問題