[ASM] Skok do selektora

0

Witam. mam taki kawałek kodu:

GLOBAL _timer_handler
_timer_handler:
        cli
        push gs
        push fs
        push es
        push ds
        pusha
        mov ax,0x10
        mov ds,ax
        mov es,ax
        mov al,0x60
        out 0x20,al
EXTERN _do_irq0
        call _do_irq0 ;teraz w ax mamy selektor do skoku
        cmp ax, 0
        je timer_handler_end
        ;jmp ax:0 ;Chce coś takiego uzyskać
timer_handler_end:
        popa
        pop ds
        pop es
        pop fs
        pop gs
        sti
        iret

procedura zwraca w ax numer selektora do którego chce skoczyć.
moje pytanie jak zrobić coś żeby było równoważne z tym:

jmp ax:0

bo czegoś takiego kompilator nie przyjmie ;P

0

No tak masz rację, kompilator raczej tego nie przetrawi. Więc trzeba zakombinować troszkę. Proponuje 2 rozwiązania.

I. <ort>Kożystając </ort>ze stosu.

		push	ax
	push	dword 0
	retf

II. Jeżeli nie możesz używać stosu bo np. go nie ma albo z jakiegoś innego powodu to mozna jeszcze wpisać bezpośrednio z rejestru ax selektor do instrukcj JMP

		mov	[tu+5],	ax
tu:	jmp	0:0

Tylko, że w tym przypadku musisz mieć selektor (w tym przypadku w ds) do segmentu danych o adresie i rozmiarze takim samym jak segment kodu. Bo segmmenty typu CODE mogą być tylko do odczytu więc nie da sie <ort>skożystać </ort>z cs.

0

Mam jeszcze jedno pytanie do rozwiązania nr. I:
dlaczego kładziesz na stos rejestr 16-bitowy (ax) i dword'a który jest 32-bitowy??
Czy nie powinno być:

push eax
push dword 0
retf

????

0
jmp [ax]:0
0

Już działa. Użyłem II wersji Nevar'a.
Dzięki wszystkim, zo pomoc :) :) :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1