코드 점 (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"
);
}
인라인 어셈블리는 엉덩이에 통증이 있습니다. 실제 어셈블리 파일에 실제 어셈블리 루틴을 작성하지 않는 이유는 무엇입니까? –
인텔 매뉴얼을 읽어서 immediates 대신 레지스터로 인코딩 할 수 있습니까? 나는 여전히 그 것을 디코딩 할 수 없다 :-) –