2011-12-05 6 views
1

그래서 나는 기본적으로 _memcpy에 대한 호출을 내 점프로 바꾸고 소스에 저장하려고하는 코드 동굴에서 작업하고 있습니다. 원래 조립 : 나는 & T AT, 기본적으로 내가 저장하려면이 구문 승/사투를 벌인거야인라인 어셈블리 - 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 

[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 '(크기)

사람이 내가 제대로 AT & T에서이 일을하는 방법을 알고 있나요 통사론? 정말 OS X에서 인텔 문법 그리워 : 피연산자가있을 때 코드가 레지스터 이름을 퍼센트 기호를 사용하여 결과 & T에서, 당신은 레지스터 이름을 use double percent signs에 이후/

+0

즉시 값이 아닌 $를 사용 %는 $ 0 –

답변

1

을 같은 size 등 :

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

printf에 대해 이중 비율 기호가 필요한 경우와 비슷합니다. %%eax에 대해 더 자세히 설명 했으므로 그 줄이 잘 컴파일 된 것 같습니다.


mov mem32, mem32에 대한 opcode가 없습니다. 먼저 다음, 레지스터에 데이터를 이동 기록을 위해 메모리 위치 (인텔 버전은 destination의 경우와 마찬가지로)

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

로 이동해야합니다 : 나는 또한 & T의 구문을 찾을 수 엄청난 혼란. :)

+0

처럼 그뿐만 아니라 생각했다/그러나 나는 더 많은 오류를 얻을 : 많은 /var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:585:too을 'mov '에 대한 메모리 참조 /var/folders/b1/rl112vqd3c79nymwj8vnzv180000gn/T//cc1Lrc0i.s:590:'mov '에 대한 많은 메모리 참조 – Geesu

+0

예,'mov mem32, mem32'에 대한 opcode가 없습니다. 이동을 위해 등록부를 사용해야합니다. 나는 이것에 관한 메모를 추가했다. – Martin