2009-11-06 3 views
4

코드 점 (CS) 레지스터를 설정하기 위해 먼 점프를 사용하려고 생각했습니다. 내가 이것을하고 왜 내가 세분화를 전혀 다루지 않는지에 관해서는 시간이 좀 걸릴 것이므로 나와 함께 견뎌내고 그것을 학문적 인 운동으로 생각해보십시오. 나는 문법을 올바르게 생각하지 못한다.gcc 인라인 어셈블리의 ljmp 구문

Error: suffix or operands invalid for 'ljmp'

나는 그것이 다른 레지스터에 cs을 넣어 어리석은 알고,하지만 작동하지 않는 %0를 사용하여 이후합니다 (ax 레지스터 중 하나가 작동하지 않습니다) 그것을 시도 거라고 생각.

나는 잘 컴파일 일부 코드를 찾고 있어요 내가 ljmp가 같은 것이라고 생각하기 때문에이 나를 ​​미치게된다 __asm volatile ("lcall $0x8, $far_call");

나는 물론 CS 레지스터에 영향을 미치는 다른 해키 방법을 환영합니다. 이것은 더 많은 코드를 생성하고 분명 특히 안전하지 않습니다 동안 그것은 LJMP를 나타납니다

void set_cs(u16 cs) { 
    __asm__ volatile (
     "mov %0, %%ax \n\t" 
     "ljmp %%ax, $fake_label \n\t" 
     "fake_label: \n\t" 
     : 
     : "r" (cs) 
     : "ax" 
    ); 
} 
+0

인라인 어셈블리는 엉덩이에 통증이 있습니다. 실제 어셈블리 파일에 실제 어셈블리 루틴을 작성하지 않는 이유는 무엇입니까? –

+0

인텔 매뉴얼을 읽어서 immediates 대신 레지스터로 인코딩 할 수 있습니까? 나는 여전히 그 것을 디코딩 할 수 없다 :-) –

답변

2

이 내가 현재 CS 값, 응용 프로그램이 충돌하지 않는 값을 입력 할 때와 같이 일을 표시, 작업 상수가 필요합니다. 대신 즉시 값을 사용합니다 :

#define set_cs(cs) asm volatile ("ljmp %0, $fake_label \n\t fake_label: \n\t" :: "i"(cs))

그것은 내가 당신이되고 싶어 생각만큼 우아하지, 그리고 당신이 뭘하려는 건지에 전적으로 의존한다. linux/windows에서 컴파일 할 때 유용하거나 심지어 작동한다고 상상할 수는 없습니다.

+2

원거리 점프는 프리젠 테이션 코드 (예 : 운영 체제 코드)에서 코드 세그먼트 선택기를 지정하는 데 사용됩니다 (x86_64에서도 커널/사용자 공간 등의 권한 수준을 지정하는 데 사용됨). 나는 동의한다. 이것은 사용자 공간 코드에서별로 의미가 없다. – vyudh

관련 문제