Asembler 64 - porty (IN/OUT)

0

Próbuję sobie napisać program w 64bit. assemblerze, ale napotkałem pewien problem związany z IN/OUT i nie potrafię sobie za bardzo poradzić :/

Nie mam żadnego debbugera i nie chce mi się bawić z szukaniem, więc korzystam z pierwotnej metody jaką każdy chyba (albo podobną) kiedyś stosował:

Konkretnie początek wygląda tak:

Main proc
	mov al, 04h
	out 70h, al
	out 0edh, al
	in	al, 71h

Dokładnie tak samo wygląda to w kursie, tyle że jeszcze chyba 16 bitowym :) http://rudy.mif.pg.gda.pl/~bogdro/dos/a_kurs06.htm.

Wywala się już na pierwszym out. Skąd wiem?

	mov al, 04h
	call ExitProcess
	out 70h, al

działa, a

	mov al, 04h
	out 70h, al
	call ExitProcess

już nie :>

Proszę o jakąś pomoc, bo jakoś w internecie nie widzę rozwiązania (a może za słabo szukam...), a chciałbym się wreszcie nauczyć tego &% assemblera.

0

Chłopcze, naprawdę myślisz, że Windows da Ci dostęp do przerwań i portów? Asm dla trybu rzeczywistego, pod DOS, nie ma nic wspólnego z pisaniem pod Windows.

0

Skoro assembler 64b więc zakładam że odpalasz to pod Windows/Linux. Sprawa jest prosta: procesor w trybie chronionym lub długim (64b) nie pozwala procesom użytkownika (DPL=3) na bezpośredni dostęp do portów I/O. W Linuksie załatwia się to przez wywołanie systemowej funkcji ioperm(). W Windows zapewne trzeba skorzystać z zewnętrznych sterowników/bibliotek...

//EDIT: Za późno ;)

0

Ach. To miło... Mam rozumieć że powinienem użyć jakiejś biblioteki typu user32 czy kernel32.dll (pierwsze nazwy jakie mi przyszły do głowy)?

Asm dla trybu rzeczywistego, pod DOS, nie ma nic wspólnego z pisaniem pod Windows.

To już zauważyłem. Brakuje mi cię, INT 21h ;(

No nic, spróbuję to jakoś obejść.

0

Możesz msvcrt używać - runtime C czyli printf, scanf i takie tam...

0

poz windows odradzam uzywanie msvcrt.dll.
to jest syf, windows ma zupelnie inne api.

Ach. To miło... Mam rozumieć że powinienem użyć jakiejś biblioteki typu user32 czy kernel32.dll (pierwsze nazwy jakie mi przyszły do głowy)?

dokladnie tak. user32.dll - GUI (+ wszsytko co ma zwiazek z desktopami, oknami, winstationame), kernel32.dll - IO.

Jak chcesz uzywac in/out to musisz ustawic iopl (rflags) na 11, czyli cpl = 3 zezwala na instrukcje iopl sensitive.
najprosciej napisac driver ktory po odebraniu irp to zrobi, dziala w kontexcie obecnego procesu. mysle ze takie drivery sa dostepne, a nawet jak nie to raptem 1 funkcja + ustawienie irp dispatch.

a moze da sie to ustawic przez jakis wbudowany program? nie zdziwilbym sie jak by sie dalo.

niestety jesli cpu jest w long mode, nie ma v8086, wiec nie mozesz pisac instrukcji 16 bitowych (i tak, one sie roznia od analogicznych 32 bitowych, szczegolnie te z modrm, wiec CS.D nie zalatwi sprawy)

0

Oho, znowu h3x pieprzy od rzeczy... Słuchaj, zmień forum bo przypomnisz sobie co oznacza §4.8.

0

poz windows odradzam uzywanie msvcrt.dll.
to jest syf, windows ma zupelnie inne api.

msvcrt.dll to nie jest syf, tylko C-runtime z którego korzystają aplikacje samego systemu (ot, notepad.exe na przykład). Biblioteka jednak nie jest przez Microsoft rekomendowana "do własnego użytku". Ale można ich się nie posłuchać ;-)

0

Pisanie drivera nie jest konieczne, wystarczy skorzystac z instrukcji i kodu zawartych w tym materiale - http://wookey.org/usermodehardwareportio.html.

lord_zero

0

Dzięki wszystkim za pomoc, może kiedyś wreszcie zrozumiem tego assemblera ;)

@lord_zero: 404 :/

0

http://wookey.org/usermodehardwareportio.html - z przyzwyczajenie wstawiłem kropkę na końcu wypowiedzi.

lord_zero

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