2013-04-15 3 views
0

xxxx : yyyyyyyy 주소가 보호 모드에서 32 비트이기 때문에 48 비트 주소를 메모리에두고 간접적 인 jmp을주고 싶습니다. 여기에 내가 작성한 내용이 있습니다.보호 모드의 간접 jmp에 대한 질문

mov eax,s1 
mov [address],eax 
mov ax,SelectorCode32 
mov [address+4],ax 
jmp fword [address] 

address:dd 0 
     dw 0 

그러나 nasm은 jmp fword [address]이 잘못되었음을 보여 주며, this과 같은 몇 가지 제안을 읽었지만 도움이되지 않았으므로 어떻게해야합니까?

+0

[이] (http://en.wikipedia.org/wiki/FWord)를 참조하십시오. 제 상황에서는 올바른 tss를 jmp로 선택하기 때문에 주소가 알려지지 않은 상태로 실행되기 때문에 jmp xxxx : yyyyyyyy는 쓸모가 없다. – reavenisadesk

+0

@AkiSuihkonen 틀렸어. 당신이 말하는 것은'JMP ptr16 : 32' 형식이지만'JMP m16 : 32'도 있습니다. 인텔 또는 AMD 설명서를 참조하십시오. –

+0

Nasm은 멋진 제품군 어셈블러이며 fword를 알지 못합니다. :) 그냥'jmp far [주소]'가해야합니다. 32 비트 코드가 아닌 경우 'jmp far dword [address]'일 수 있습니다. –

답변

2

near 및 far 호출에 대한 NASM의 구문은 TASM 및 MASM의 구문과 다릅니다. 여기

간접 점프에 대한 두 가지 옵션이 있습니다 :

jmp [fptr] ; jump to CS:0x12345678 
jmp far [fptr] ; jump to 0xABCD:0x12345678 

fptr dd 0x12345678 
    dw 0xABCD 

또한 항상 스택에 훨씬 주소를 밀어 retf을 할 수 있습니다.

+0

프로그램을 실행하기 전에 점프 할 위치를 이미 알고 있다는 뜻입니까? 실행 후 주소를 변경하면 어떻게됩니까? – reavenisadesk

+0

나는 그 질문을 이해하지 못한다. –

+0

죄송합니다. 내 영어가 가난합니다.이 방법으로 묻습니다. 실행 후 [fptr]을 변경하면 프로그램에서 새 주소로 이동하게됩니까? 내 목적은 프로그램이 실행될 때, 나는 다른 tss2를 변경하는 것보다 tss2에 jmp가 될 것인가? – reavenisadesk