2009-09-03 4 views
6

다음 GCC 인라인 asm은 LuaJit의 코코 라이브러리에서 가져온 것입니다. 누군가가하는 일에 대해 한 줄씩 설명 할 수 있습니까?Asm 코드 설명

static inline void coco_switch(coco_ctx from, coco_ctx to) 
{ 
    __asm__ __volatile__ (
    "movl $1f, (%0)\n\t" 
    "movl %%esp, 4(%0)\n\t" 
    "movl %%ebp, 8(%0)\n\t" 
    "movl 8(%1), %%ebp\n\t" 
    "movl 4(%1), %%esp\n\t" 
    "jmp *(%1)\n" "1:\n" 
    : "+S" (from), "+D" (to) : : "eax", "ebx", "ecx", "edx", "memory", "cc"); 
} 

감사

답변

10

내 ASM은 세부 사항에 대해 조금 흐릿하지만 난 당신에게 일반적인 아이디어를 줄 수 있다고 생각합니다.

ESP : 스택 포인터, EBP : 기본 포인터.

movl $1f, (%0) 

값 0x1f를 매개 변수 0 (에서)로 이동하십시오.

movl %%esp, 4(%0) 

레지스터 ESP의 내용을 (에서 + 4)로 이동하십시오.

movl %%ebp, 8(%0) 

레지스터 EBP의 내용을 (+ 8)로 이동하십시오.

movl 8(%1), %%ebp 

(+8)의 내용을 EBP로 이동하십시오.

movl 4(%1), %%esp 

(+4)의 내용을 레지스터 ESP로 이동하십시오.

jmp *(%1) 

(~)에 포함 된 주소로 점프합니다.

"1 :"은 점프 레이블입니다.

"+ S"는 "원본"(읽기) 매개 변수를 선언하고 "+ D"는 대상 (쓰기) 매개 변수를 선언합니다. 명령문 끝에있는 레지스터 목록은 "clobber"목록이며 ASM 코드에 의해 수정 될 수있는 레지스터 목록이므로 컴파일러는 일관성을 유지하기위한 조치를 취할 수 있습니다 (예 : ECX가 여전히 동일한 값 이전과).

나는 coco_ctx가 "coco context"를 의미한다고 생각합니다. So : 함수는 현재 스택 프레임을 "from"구조체에 저장하고 스택 프레임을 "to"구조체에 저장된 것에 설정합니다. 기본적으로 현재 함수에서 다른 함수로 이동합니다.

+2

을 위해 무엇에 대해 좀 더 배울 수있는 추가합니다. 그것은 하나의 기능에서 다른 기능으로 점프하는 것이 아닙니다. 하나의 전체 호출 스택에서 다른 호출 스택으로 점프하고 있습니다. 그것은 실행 컨텍스트를 완전히 바꾸고 있습니다. (또한 gosh이지만 GCC 인라인 어셈블리 구문은 이상합니다.) – Crashworks

+2

C 함수 호출 문법으로 싸인 AT & T 구문 (http://wiki.osdev.org/Opcode_syntax)입니다 (http://wiki.osdev.org/Inline_Assembly). 당신은 그것을 믿지 않을 것이지만 실제로 "표준"인텔 구문보다 선호합니다. ;-) – DevSolar

+0

컨텍스트 스위치는 C++에서도 작동합니까? 아니면 thiscall에 대해 다른 것을 작성해야합니까? – jameszhao00

2

DevSolar는 정답이있다 - 난 그냥 당신이 EBP와 ESP가 정확히 맞아 here.