Assembler ?

Diskussion zum Thema Programmierung unter DOS (Intel x86)
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Assembler ?

Beitrag von freecrac »

DOSferatu hat geschrieben:Ich habe auf dem PC noch nie ein "eigenständiges" ASM-Programm geschrieben.
Ich benutze immer Pascal als "Rahmen" und dann den in Pascal integrierten Assembler. (Ja, der geht nur bis maximal 286er. Alles, was 386er betrifft, mache ich mit direkten Bytes, die ich in den Code einfüge.) D.h. es ist immer nur max. 99% Assembler und drumherum Pascal - aber auch das Pascal wird ja compiliert. Meist programmiere ich es so "Hybrid" - d.h. manche Dinge in Pascal und zeitkritische Dinge (oder Dinge, die in ASM einfacher als in Pascal sind) dann in Assembler. (Meine GameSys2 ist z.B. in 100% Assembler programmiert und ist dann als function in Pascal aufzurufen.)
Ich finde diese Vorgehensweise irgendwie praktisch - so kann ich EXE Files (oder Units für Pascal) erzeugen, ohne mir selbst über die Header etc Gedanken machen zu müssen, da der "EXE-Rahmen" ja vom Pascal-Compiler erzeugt wird.
Das hört sich verlockend an. Mit welchen Assembler wurde dein GameSys2 erzeugt?

Poste doch bitte mal ein Rohgerüst eines solchen Pascal-Listings + ein Beispiel in Assembler(z.B. Löschen des Textbildschirms), wo man eine solche (externe) Funktion aufrufen kann. Wäre das so möglich?
Natürlich kann man auf diese Weise kein eigenes Betriebssystem programmieren - aber daran hatte ich ohnehin nie wirklich Interesse. Einfach nur deshalb, weil ich nicht wüßte, was ich mit einem eigenen OS anfangen soll.
Genauso geht es mir auch. Ein einziger Kommandozeilen-Interpreter wie von DOS zum Starten vom Norton Commander(oder Clone davon) genügt mir auch.

Anstelle DOS zu booten könnte man aber auch eine selbentwickelte Anwendung zur Ausführung bringen, aber das ist dann wohl etwas zu eingleisig.
Obwohl wer zu erst kommt, der könnte ein x86er vortäuschen auf dem dann ein DOS denkt es würde gebootet werden, während im Hintergrund unser Keylogger alles auf Festplatten-Bereiche speichert und aufzeichnet, die als zerstörte Sektoren gekennzeichnete sind. Hehehe.

Dirk
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Assembler ?

Beitrag von drzeissler »

Ich hatte mal zu Euro PC Zeiten die Idee unter GW-Basic die Oberfäche des Amiga nachzubilden.
Also Quasi die Workbenchscreen mit Free Ram usw. Das habe ich auch hinbekommen, aber
leider war das ja nur "Nachbilden" ohne jegliche Funktion. Es hätte ja auch einfach ein "Bild"
sein können.

Cool wäre es, wenn man sowas ähnliches mit Dos machen könnte.

Ich konzentriere meine Anstrengungen aber auf einen Scroller mit Text, der
wirklich ruckelfrei ist. Mein Vorbild ist das Joop Intro.

http://www.google.de/url?q=http://www.y ... -p3OGYaipg

Doc
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Assembler ?

Beitrag von drzeissler »

CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Assembler ?

Beitrag von drzeissler »

bin ungeduldig und wollte mal was testen. Ich habe ein "makefile", sowie eine "asm" datei.
wenn ich jetzt tasm *.asm mache, dann läuft das durch und er baut mir ein *.obj File. Ich dachte der baut ne EXE ?

Gruß Doc
hier ist das versuchsobjekt=> http://www.intel-assembler.it/PORTALE/4 ... 100424.zip

EDIT1: ah mist, ist ja alles da; muss das dann wohl nur mit "make" zusammenbauen. Leider mault er rum "DPMI error" 4004 unrecognized hardware, run DPMIINST. Soweit mir bekannt ist das doch 386+ und ich habe nur einen 286er. kann ich somit den scroller nicht bauen ?

EDIT2: Am P3 geht es ganz einfach den Scroller zu bauen. Ein einfaches "make" erstellt die EXE. Am 286er geht es nicht. Die Software ist absolut gleich. Somit ist es entweder ein CPU-Problem, oder ein RAM-Problem. Ich habe die HIMEM.SYS mehrfach getauscht was auch nichts genutzt hat. Von daher denke ich, dass ich mehr RAM am 286er brauche.
DOS/32A fatal (4004): not enough extended memory to load fixups for %s
- DOS/32 Advanced could not load fixups for file "%s" because of extended memory shortage. This problem often arises when a DOS/32 Advanced application was spawned from non-compatible DOS Extender. Try to replace the DOS Extender for the program that spawned DOS/32 Advanced, make sure you have enough extended memory.
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Assembler ?

Beitrag von freecrac »

drzeissler hat geschrieben:bin ungeduldig und wollte mal was testen. Ich habe ein "makefile", sowie eine "asm" datei.
wenn ich jetzt tasm *.asm mache, dann läuft das durch und er baut mir ein *.obj File. Ich dachte der baut ne EXE ?

Gruß Doc
hier ist das versuchsobjekt=> http://www.intel-assembler.it/PORTALE/4 ... 100424.zip

EDIT1: ah mist, ist ja alles da; muss das dann wohl nur mit "make" zusammenbauen. Leider mault er rum "DPMI error" 4004 unrecognized hardware, run DPMIINST. Soweit mir bekannt ist das doch 386+ und ich habe nur einen 286er. kann ich somit den scroller nicht bauen ?
EDIT2: Am P3 geht es ganz einfach den Scroller zu bauen. Ein einfaches "make" erstellt die EXE. Am 286er geht es nicht. Die Software ist absolut gleich. Somit ist es entweder ein CPU-Problem, oder ein RAM-Problem. Ich habe die HIMEM.SYS mehrfach getauscht was auch nichts genutzt hat. Von daher denke ich, dass ich mehr RAM am 286er brauche.
DOS/32A fatal (4004): not enough extended memory to load fixups for %s
- DOS/32 Advanced could not load fixups for file "%s" because of extended memory shortage. This problem often arises when a DOS/32 Advanced application was spawned from non-compatible DOS Extender. Try to replace the DOS Extender for the program that spawned DOS/32 Advanced, make sure you have enough extended memory.
Es sieht ganz so aus als wenn es ein TASM-Problem ist. Die bereits erstellte Scrl.exe sollte aber auf einem 80286er lauffähig sein, denn dort konnte ich nichts finden was einen 80386 benötigen würde.

Ich benutze selber keine Makefiles, sondern ich benutze nur eine einzige Batchdatei(*) die den Assembler aufruft, der dann aus dem übergebenen Namen des *.asm ein *.obj erzeugt und danach den Linker aufruft, der dann aus dem *.obj eine *.exe erzeugt.
So eine "Scrl.fnt"-Datei in eine Scrl.obj zu wandeln, um diese ebenfalls mit zu linken habe ich noch nie versucht.

TASM habe ich selber allerdings auch noch nie benutzt und so weiss ich nicht wie man dort die Parameter übergibt. Bei einem kurzen Blick in die Tasm.exe(5.0) habe ich dieses hier gefunden: Syntax: TASM [options] source [,object] [,listing] [,xref]
In der Tlink.exe habe ich folgenden Text gefunden: insufficient memory for initialization$memory manager does not support DPMI or VCPI$must be run on a 386 processor$unrecognized hardware, run DPMIINST$

...

(*) Für Masm 5.1 benutze ich folgende Batchdatei(M.bat) zum (Editieren+) Assemblieren+Linken+Starten der *.exe (eines einzigen asm-Listings):

Code: Alles auswählen

@ECHO OFF
REM EDIT /H %1.asm
MASM /Z %1.asm,%1.obj,%1.lst,%1.crf
if ERRORLEVEL 1 goto ENDE
CREF %1.crf,%1.ref
if ERRORLEVEL 1 goto ENDE
LINK /CP:1 %1.obj,%1.exe,%1.map,,
if ERRORLEVEL 1 goto ENDE
if exist *.crf del *.crf
if exist *.obj del *.obj
%1.exe
:ENDE
NC5 "Nc.ext" -Datei-Eintrag:

Code: Alles auswählen

ASM: M !
(Pfad der M.bat muss bekannt sein.)

MASM 5.1 braucht weder ein Himem.sys noch ein Emm386.exe (wenn das *.asm nicht zu gross ist, was vermutlich nicht der Fall ist). Ich weiss allerdings nicht ob MASM 5.1 auf einem 80286 schon lauffahig ist.
Damit man das "scrl.asm" mit MASM 5.1 assemblieren kann müssten dort nur ein paar wenige Änderungen vorgenommen werden.
http://microprocessados.lesc.ufc.br/dow ... masm51.zip

Dirk
Zuletzt geändert von freecrac am Do 8. Dez 2011, 09:07, insgesamt 1-mal geändert.
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Assembler ?

Beitrag von drzeissler »

Ok, danke.

Wenn ich Dich richtig verstehe, interpretierst Du das DPMI-Problem ähnlich.
TASM (5.0) geht nur mit 386er, obwohl er auch 16Bittige 286er EXE's bauen kann.

Deine Vermutung ist korrekt; die am P3 gebaute Datei (Scroller) funktioniert auch
am 286er, sie lässt sich nur nicht dort erstellen. Ich will aber am 286er erstellen.

Ich muss mich somit nach einem anderen Toolkit zum Bauen umsehen.

EDIT: Ich habe in den Quellen mal gespielt und die Scrollerposition und den Text
verändert. Kann man auch die Geschwindigkeit verändern ?
Ich habe im I-Net nach einer schönen FNT (BitmapFont) gesucht die ich gegen
diese lieblose weisse Schrift tauschen kann, aber überall gibt es nur TTF.
Muss ich wohl selbst eine *.FNT erstellen.
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Assembler ?

Beitrag von freecrac »

drzeissler hat geschrieben:Ok, danke.

Wenn ich Dich richtig verstehe, interpretierst Du das DPMI-Problem ähnlich.
TASM (5.0) geht nur mit 386er, obwohl er auch 16Bittige 286er EXE's bauen kann.
Ja genau.
Deine Vermutung ist korrekt; die am P3 gebaute Datei (Scroller) funktioniert auch
am 286er, sie lässt sich nur nicht dort erstellen.
Das ist aber sehr umständlich.
Ich will aber am 286er erstellen.

Ich muss mich somit nach einem anderen Toolkit zum Bauen umsehen.
Es sieht ganz so aus.
EDIT: Ich habe in den Quellen mal gespielt und die Scrollerposition und den Text
verändert. Kann man auch die Geschwindigkeit verändern ?
Ich kann dort keine Verzögerungsschleife finden dessen Parameter man verringern/erhöhen könnte.
Zum Verzögern könnte man "call WaitVR" (unten im Listing zu finden) öfter als nur einmal ausführen lassen.

Code: Alles auswählen

DemoLoop:
mov   cx, Anzahl
BLURB:
call    WaitVR
dec    cx
jnz  BLURB
Falls es doch schon zu sehr verzögert könnte man eine Schleife einfach davor setzen.

Code: Alles auswählen

DemoLoop:
mov   cx, Anzahl
BLURB:
dec    cx
jnz  BLURB

call    WaitVR
Oder man nimmt nur einen Teil der Rasterstrahlabfrage zum Verzögern:

Code: Alles auswählen

DemoLoop:
mov   cx, Anzahl
mov   dx, 3DAh
BLURB:
call  WaitEndVR
dec    cx
jnz  BLURB

call    WaitVR
So wie in allen drei Beispielen zu sehen ist kann man auf diese Weise es noch am wahrscheinlichsten vermeiden das es zu Rucklern kommt, wenn man eine Verzögerung unmittelbar vor der Rasterstrahl-Abfrage plaziert (oder mit dieser es macht) und nicht wo anders.
Ich habe im I-Net nach einer schönen FNT (BitmapFont) gesucht die ich gegen
diese lieblose weisse Schrift tauschen kann, aber überall gibt es nur TTF.
Muss ich wohl selbst eine *.FNT erstellen.
Beides habe ich noch nie verwendet.

Dirk
drzeissler
DOS-Gott
Beiträge: 3336
Registriert: Mo 8. Feb 2010, 16:59

Re: Assembler ?

Beitrag von drzeissler »

Die Gefahr besteht ja, dass durch "Verzögerungen" RUCKLER entstehen.
Das will ich um jeden Preis verhindern. Ich kenne Demos da verändern
die Scroller die Geschweingdigkeit und ruckeln dennoch nicht.

Wie muss ich die Scrollgeschwindigkeit interpretieren, bzw, welcher
Takt ist hier ma0geblich ? reden wir hier von dem Hardware-Interrupt
der Grafikkarte ? besteht dort eine Abhängigkeit zur Bildschrimdarstellung
(in meinem Fall 60 Hz TFT)

Ich plane diverse Scroller mit unterschiedlichen Texten, Schriftwaren
in unterschiedlichen Richtungen gleichzeitig ruckelfrei darzustellen.
Als Zeithorizont habe ich mir 31.12.2012 vorgemerkt.

Ich denke der Einstieg über Try/Error ist gar nicht so schlecht.
Zumindest macht das mehr Spass, als einige hundert Seiten im
Selbststudium durchzuackern, ohne Erfolge dabei zu haben.

Doc

EDIT:
Könnte man jetzt einfach die Quellen editieren und eine andere Schriftart verwenden,
die dann eventuell auch in TTF vorliegt. Ich denke dass das nicht so einfach geht,
bzw. ein völlig neue asm-datei erforderlich macht. ich kann derzeit aber nur
funktionierende sachen "editieren".
CPU: 486 DX2/66 MOBO: SNI-D882 RAM: 3x16MB - FDD: 3,5" 1,44MB HDD: 6,4GB Seagate ISA(1): Audican32Plus PCI(1): 3com TX 905 OS: MsDos622 - Win95a - WinNT 3.51
freecrac
DOS-Guru
Beiträge: 861
Registriert: Mi 21. Apr 2010, 11:44
Wohnort: Hamburg Horn

Re: Assembler ?

Beitrag von freecrac »

drzeissler hat geschrieben:Die Gefahr besteht ja, dass durch "Verzögerungen" RUCKLER entstehen.
Das will ich um jeden Preis verhindern. Ich kenne Demos da verändern
die Scroller die Geschweingdigkeit und ruckeln dennoch nicht.

Wie muss ich die Scrollgeschwindigkeit interpretieren, bzw, welcher
Takt ist hier ma0geblich ? reden wir hier von dem Hardware-Interrupt
der Grafikkarte ? besteht dort eine Abhängigkeit zur Bildschrimdarstellung
(in meinem Fall 60 Hz TFT)
Die eigentliche Scrollroutine benutz nur Portzugriffe und der Vorgang wird durch den Rasterstrahl syncrhronisiert und ich meine es ist damit relativ stark abhängig von der Darstellungsfrequenz die verwendet wird.

Beispielweise läuft meine Vesa-Triplebuffering-Routine(welche mit den Rasterstrahl sybcronisert wird) auf einem 19 Zoll-CRT-Monitor(96khz) mit eingeschalteten 100 hz Bildfrequenz in 800x600 sichbar schneller,
als auf einem LCD in 60hz, obwohl der dort daran angeschlossen Rechner+Ram sogar um Einiges schneller ist weil neuere Architektur + mehr Mhz. Eine schnellere CPUs warten dann ggf. einfach nur länger und bei der niedriegeren Wiederholfrequeunz von 60hz dann wohl noch länger.
Aus diesen Grund habe ich auch schon überlegt mir einen LCD mit 120 hz zu besorgen.
Ich weiss aber noch nicht ob man diese 120 hz beim LCD dann von DOS aus erst anschalten muss, oder nicht und automagisch sofort da weil so ein 120hz-LCD nur diese Wiederholfrequenz kennt, rätselrat?

Das Bit für Vesa-Bildmode mit eigenen CRT-Parameter zum Umschalten auf 100 Hz (für den CRT-Monitor gedacht) hat der LCD(60hz) einfach ignoriert und hat die 800x600 VESAMODE auf 60 hz. angezeigt.
Ich hoffe doch das man mit einem LCD mit 120 hz diese auch in DOS mit 120hz nutzen kann.
Ich plane diverse Scroller mit unterschiedlichen Texten, Schriftwaren
in unterschiedlichen Richtungen gleichzeitig ruckelfrei darzustellen.
Als Zeithorizont habe ich mir 31.12.2012 vorgemerkt.
Ok.
Ich denke der Einstieg über Try/Error ist gar nicht so schlecht.
Zumindest macht das mehr Spass, als einige hundert Seiten im
Selbststudium durchzuackern, ohne Erfolge dabei zu haben.
Später wenn man Debug nicht mehr verwendet, dann sucht man gelegentlich auch einmal einen Fehler in seiner eigenen Anwendung.
Fehler kann man auf verschieden Weise machen. Es gibt Fehler durch eine falsche schreibweise des Befehls. Dann meckert der Assembler und gibt eine Fehlermeldung aus.
Oder man hat etwas falsch adressiert. Dafür wäre es sinnvoll die Adressen sich auch mal am Bildschirm ausgeben zu lassen, ggf am Ende, oder vor zeitkritischen Routinen.
Doc

EDIT:
Könnte man jetzt einfach die Quellen editieren und eine andere Schriftart verwenden,
die dann eventuell auch in TTF vorliegt.
Technisch gesehen gibt es keine Probleme die Quellen zu editieren. Den Assembler-Teil kann man mit jedem Editor modifizieren.
Da ich aber beide Schriftarten nicht im Detail kenne, kann ich nicht mal im entferntesten es abschätzen wie lange es dauert sich das Wissen darüber anzueignen.
Ich denke dass das nicht so einfach geht,
bzw. ein völlig neue asm-datei erforderlich macht. ich kann derzeit aber nur
funktionierende sachen "editieren".
Ein paar kleine Dinge lassen sich doch schnell noch ausprobieren:

debug

Code: Alles auswählen

-a
xxxx:0100 mov ax, b800
xxxx:0103 mov es, ax
xxxx:0105 mov si, 0200
xxxx:0108 mov cx, A
xxxx:010B rep movsw
xxxx:010D org 0200
xxxx:0200 db "H",1B,"a",1B,"l",1B,"l",1B,"o",1B
xxxx:020A
-g=cs:0100 010D
Hier ein kleines Rätsel: Warum verändert sich auch das DI-Register das am Ende ausgegeben wird, wenn man mit "g=cs:0100 010D" die Befehle ausführt?
Kleiner Hinweis: Beim erneuten Ausführen der Befehle(F3-Taste) verändert sich auch das DI-Register erneut.

Dirk
Brueggi

Re: Assembler ?

Beitrag von Brueggi »

:-) Geht mir auch oft so - die Lösungen fallen mir meistens garnicht am Computer ein - und dann muss ich so schnell wie möglich loslegen, damit ich auch ja nix vergesse. :-)

Z80 ist ganz lustig, aber wie der 8086 ein wahrer Taktfresser, verglichen mit dem 6510 vom C64 (mit dem ich auch gelegentlich einige Dinge anstelle, damit mein C128D nicht einrostet). Allerdings würde ich - wenn ich die Wahl hätte - dem Z80 gegenüber einem 6510 immer vorziehen ;-)
Antworten