Seite 1 von 2

Assembler... INT 21H geht nicht?

Verfasst: 17.04.2009 20:15
von Max_der_Held
Hallo..
ich bin wirklich kein Assembler-freak.. wollte aber doch mal in das Gebiet hineinhorchen.
Am Anfang lernt man bei meinem genialen Buch von diversen interrrupts etc..

kurz: folgendes löst bei mir beim int 21h invalid memory access aus:

(obacht, inline asm anschalten)

Code: Alles auswählen

MOV ah, 08h
INT 21h
MOV DL,AL   ; zeichen einlesen nach AL und gleich in DL verschieben
MOV ah, 02h
INT 21h       ; Zeichen von DL anzeigen. (wenn ich mich nicht irre)
end
woran liegt das? im disassembler kann ich zwar den code und alles lesen.. (z.b. muss ich somit ja nicht mehr .model small angeben etc..)
aber verstehen ist ne andre sache..

hilfe?^^

-mfg ;)

Verfasst: 17.04.2009 20:42
von Kaeru Gaman
ermn... da bist du wohl ein paar Jahre zu spät dran.
die Interrupts waren eine DOS-Geschichte.

ich hab selber noch textausgabe im Textmodus und Grafik-Ansteuerung im Mode13 über die Interrupts programmiert...

> muss ich somit ja nicht mehr .model small angeben etc..

ja das buch scheint wirklich etwas älter zu sein, nicht?
so um die 15 Jährchen?

Verfasst: 17.04.2009 21:53
von Moskito
Da könnt ich auch was beisteuern;
(Hab ich mir von Danilo abgeschaut und an meine Bedürfnisse angepasst)
Vorausgesetzt wird ein mit openscreen geöffneter Bildschirm nebst Beiwerk.
Die Routine GetScanLine gibt nun die aktuelle Rasterzeile zurück.
(fast wie zu Amiga-Zeiten, herrlich)



scanline=0

getscanline:
!extrn _PB_DDrawBase
!MOV Eax,[_PB_DDrawBase]
!PUSH v_scanline
!PUSH Eax
!MOV Eax,[Eax]
!CALL dword [Eax+64]
Return


bis denne

Thomas

Verfasst: 18.04.2009 03:59
von Max_der_Held
@Kaeru
ohh. und ich hab mich schon gefreut, endlich so richtig in assembler einzusteigen ^^.
Naja.. im buch redet er noch von 80386 prozessoren und dem neuen Pentium (nix 2, III oder vier) ^^.
Ahm.. Wo kriegt man denn derzeit ein aktuelles (gutes?^^) buch/Referenz über assembler her?.. ^^
[es sollte ja eigentlich so ne Art Schwerpunkt-> Standalone programme programmieren haben.. sprich programme ohne OS.. eins meiner Ziele ;) )

@Moskito
Xd sauber hehe :D
ist mir zwar schon fast zu hoch, aber sieht gut aus ^^ ;)

(Anmerkung: zu Amigazeiten war ich noch nichtmal auf der WELT! o_O ^^ XD ;) )

ps: kann ich die INT-befehle jetzt noch hernehmen, oder ist dass irgendwie veraltet, oder so..?

Verfasst: 18.04.2009 10:38
von ZeHa
INT 21H ist sozusagen die "WinAPI des DOS" :mrgreen:

Anstatt z.B. sowas wie TimeGetTime_() aufzurufen, tut man eben eine bestimmte Nummer in ein bestimmtes Register, plus die Parameter, und ruft dann INT 21H auf, um damit eine bestimmte Funktion auszulösen (z.B. Dateien öffnen, Text ausgeben, etc).

Wenn Du was standalone machen willst, also komplett ohne OS, dann kannst Du logischerweise keine DOS-Funktionen aufrufen, sondern mußt Dir alles selber machen. Was natürlich etwas umständlich ist ;)
Du kannst Dir aber für den Anfang ja auch eine etwas einfachere Maschine suchen. Ich hab z.B. ein Spiel für den C64 geschrieben (gibt hier auch einen Thread), natürlich hat der keinen x86-Prozessor, aber die Assembler-Denkweise ist grob gesagt die gleiche. Und da hab ich alles ohne OS-Funktionen gemacht (obwohl auch das möglich gewesen wäre, weil ja auch der C64 ein (fest integriertes) OS hat).

---

Mich wundert aber allgemein warum bei Dir INT 21H nicht funktioniert, weil aus Kompatibilitätsgründen müßte das unter Windows doch eigentlich immer noch laufen...

Verfasst: 18.04.2009 11:48
von Little John
ZeHa hat geschrieben:INT 21H ist sozusagen die "WinAPI des DOS" :mrgreen:
WinAPI nicht, aber API ja.
ZeHa hat geschrieben:Mich wundert aber allgemein warum bei Dir INT 21H nicht funktioniert, weil aus Kompatibilitätsgründen müßte das unter Windows doch eigentlich immer noch laufen...
Windows läuft ja im Protected Mode. Kann man da denn überhaupt Real Mode Interrupts aufrufen?

Gruß, Little John

Verfasst: 18.04.2009 12:41
von ZeHa
Little John hat geschrieben:
ZeHa hat geschrieben:INT 21H ist sozusagen die "WinAPI des DOS" :mrgreen:
WinAPI nicht, aber API ja.
Ist mir schon klar, sollte nur beispielhaft sein, weil mit dem Begriff "WinAPI" normalerweise jeder sofort was anfangen kann. Daher die Anführungszeichen und der Smiley ;)
Little John hat geschrieben:
ZeHa hat geschrieben:Mich wundert aber allgemein warum bei Dir INT 21H nicht funktioniert, weil aus Kompatibilitätsgründen müßte das unter Windows doch eigentlich immer noch laufen...
Windows läuft ja im Protected Mode. Kann man da denn überhaupt Real Mode Interrupts aufrufen?
Naja wenn es nicht mehr funzen würde, dann würde auch kein einziges DOS-Programm mehr laufen, weil wahrscheinlich alle mit DOS-Funktionen arbeiten (allein schon Dateizugriff usw.). Windows 95 war das erste Windows im Protected Mode, und damals lief eigentlich noch ziemlich viel DOS-Zeug. Auch heute unter XP gibt's noch einiges was man laufen lassen kann. Vermutlich simuliert Windows dem DOS-Programm dann einfach eine gewisse Real-Mode-Umgebung oder so (brauchen ja eh nur 640K zu sein).

Verfasst: 18.04.2009 13:05
von Little John
ZeHa hat geschrieben:
Little John hat geschrieben:
ZeHa hat geschrieben:INT 21H ist sozusagen die "WinAPI des DOS" :mrgreen:
WinAPI nicht, aber API ja.
Ist mir schon klar, sollte nur beispielhaft sein, weil mit dem Begriff "WinAPI" normalerweise jeder sofort was anfangen kann. Daher die Anführungszeichen und der Smiley ;)
Das hab ich mir gedacht, ich wollte nur die Variante ohne Anführungszeichen und Smiley noch dazuschreiben. ;-)
ZeHa hat geschrieben:
Little John hat geschrieben:
ZeHa hat geschrieben:Mich wundert aber allgemein warum bei Dir INT 21H nicht funktioniert, weil aus Kompatibilitätsgründen müßte das unter Windows doch eigentlich immer noch laufen...
Windows läuft ja im Protected Mode. Kann man da denn überhaupt Real Mode Interrupts aufrufen?
Naja wenn es nicht mehr funzen würde, dann würde auch kein einziges DOS-Programm mehr laufen, weil wahrscheinlich alle mit DOS-Funktionen arbeiten (allein schon Dateizugriff usw.). Windows 95 war das erste Windows im Protected Mode, und damals lief eigentlich noch ziemlich viel DOS-Zeug. Auch heute unter XP gibt's noch einiges was man laufen lassen kann. Vermutlich simuliert Windows dem DOS-Programm dann einfach eine gewisse Real-Mode-Umgebung oder so (brauchen ja eh nur 640K zu sein).
Sorry, das hatte ich schlecht ausgedrückt. Die alten DOS-Programme, die jetzt noch unter Windows laufen, wurden ja mit einem DOS-Compiler compiliert. Und PB ist ein Windows-Compiler. Ich hätte besser geschrieben:
Kann ein Programm, das mit einem Windows-Compiler übersetzt wurde, überhaupt Real Mode Interrupts aufrufen?

Gruß, Little John

Verfasst: 18.04.2009 13:07
von ZeHa
Ahhh okay, ja das könnte natürlich ein Grund sein.

Verfasst: 20.04.2009 21:47
von fsw
Max_der_Held hat geschrieben:Ahm.. Wo kriegt man denn derzeit ein aktuelles (gutes?^^) buch/Referenz über assembler her?.. ^^
Die meisten sind total veraltet, hier ist ein brauchbares (IMHO):

http://drpaulcarter.com/pcasm/

Wenn du runter scrollst dann siehst du auch eine Deutsche version.

Da sind auch noch die examples die man fuer verschiedene assemblers downloaden kann...

Hope this helps
fsw