Hallo, guten Tag. Ich habe eine OBJ für QBX Basic. SUB vpok(BYVAL Segment%, BYVAL ofs%, BYVAL loopwert% , Byval color%) Ich möchte dieses bitte erweitern mit einer Schleife Loop: Mov ES:[BX],al BX soll dabei immer um 1 erhöht werden so oft wie die Loop durchlaufen wird mit dem loopwert:word -------------------- .Model Medium, Basic .Code public vpok vpok Proc Uses ES, SegAddr:DWord, loopwert:word, color:word Les BX,SegAddr Mov AX,color .......? .......? do: .......? Mov ES:[BX],al loop do Ret vpok Endp End ------------------- Danke.
:
Bearbeitet durch User
mov cx,3 derloop: ;mach was inc bx dec cx jnz derloop
cppbert schrieb: > mov cx,3 > > derloop: > > ;mach was > inc bx > > dec cx > jnz derloop Oder dec cx jnz derloop durch loop derloop ersetzen
cppbert schrieb: > durch > > loop derloop > > ersetzen Time das mal euf einem echten X86, z.B. einem Pentium. Ist VIEL langsamer als dec cx jnz derloop Und ja, man hat absichtlich den loop Befehl langsamer gemacht.
1 | LES DI, SegAddr |
2 | MOV AX, color |
3 | MOV CX, loopwert |
4 | REP STOSB |
5 | RET |
Danke funktioniert wunderbar, beide Vorschläge.
:
Bearbeitet durch User
Vielleicht könnt hier auch bitte helfen. Ich habe ein QBX-Basic-Programm mit dem Mode x hergestellt. Habe jetzt dadurch 4 unabhängige Screens wo ich wechselweise drauf zeichnen kann. Nun copiere ich die Screens mit einer For-Schleife hin und her. Der Mode x hat pro Screen 16000Byte. Wie kann man jetzt bitte die beiden Screens kopieren : SegAddr nach SegAddr1 ------------------------------ .Model Medium, Basic .Code public vxcopy vxcopy Proc Uses ES, SegAddr:DWord, SegAddr1:DWord LES DI, SegAddr LES DI, SegAddr1 MOV CX, 16000 REP STOSB Ret vxcopy Endp End ----------------------------------
:
Bearbeitet durch User
Peter B. schrieb: > Vielleicht könnt hier auch bitte helfen. > > Ich habe ein QBX-Basic-Programm mit dem Mode x hergestellt. > Habe jetzt dadurch 4 unabhängige Screens wo ich wechselweise drauf > zeichnen > kann. Nun copiere ich die Screens mit einer For-Schleife hin und her. Du brauchst movsb dafuer, oder auch movsw dann aber nur 16000/2 https://www.i8086.de/asm/8086-88-asm-movsb.html
cppbert schrieb: > https://www.i8086.de/asm/8086-88-asm-movsb.html Üübrigends ist auf der Webseite alles auf deutsch d.h. da kannst du dir wirklich das meiste selbst beantworten
Danke für die Info. Leider habe ich keine Strings , es sind nur Byte und zwar 16000.
Peter B. schrieb: > Leider habe ich keine Strings Das ist für die CPU gleich. Probier einfach aus welche Variante bei dir schneller läuft.
Peter B. schrieb: > Danke für die Info. > > Leider habe ich keine Strings , es sind nur Byte und zwar 16000. In diesem Fall String = Bytes, nennt man auch so
Ist das bitte so richtig. Ich sehe keine Änderung in meinem Screen. Wenn dieses richtig ist , liegt es an meine DatenÜbergabe. Übergabe : call(segofs&,segofs1&) --------------------------- .Model Medium, Basic .Code public vxcopy vxcopy Proc Uses ES, SegAddr:DWord, SegAddr1:DWord lea sI,SegAddr Lea di,SegAddr1 mov cx,16000 derloop: movsb dec cx jnz derloop Ret vxcopy Endp End ---------------------------
Habe da mal kurz was rausgekrammt Ist zwar TASM aber so gehts
1 | ;┌──────────────────────────────────────────────────┐ |
2 | ;│ Procedure MoveB(Var Source,Target;count : Word); │ |
3 | ;├──────────────────────────────────────────────────┤ |
4 | ;│ Entspricht Pascal Move arbeitet jedoch ohne │ |
5 | ;│ Ueberlappungstest und ist etwas schneller │ |
6 | ;└──────────────────────────────────────────────────┘ |
7 | MoveB Proc Far source : DWord, target : DWord, count : Word |
8 | Public MoveB |
9 | mov dx,ds |
10 | mov cx,count |
11 | lds si,source |
12 | les di,target |
13 | CLD |
14 | REPZ MOVSB |
15 | MOV DS,DX |
16 | RET |
17 | MoveB EndP |
Es ist nicht zuviel verlangt bei source Code die entsprechenden Tags zu verwenden. Auch Kommentare sind immer hilfreich
1 | public vxcopy |
2 | vxcopy Proc Uses DS ES, SegAddr:DWord, SegAddr1:DWord |
3 | lds sI,SegAddr. ;source ds:si |
4 | les di,SegAddr1 ;dest es:di |
5 | mov cx,16000/2 ;div2 wegen movsw |
6 | repz movsw |
7 | ret |
8 | vxcopy Endp |
9 | End |
Thomas Z. schrieb: > Es ist nicht zuviel verlangt bei source Code die entsprechenden > Tags zu > verwenden. > Auch Kommentare sind immer hilfreichpublic vxcopy > vxcopy Proc Uses DS ES, SegAddr:DWord, SegAddr1:DWord > lds sI,SegAddr. ;source ds:si > les di,SegAddr1 ;dest es:di > mov cx,16000/2 ;div2 wegen movsw > repz movsw > ret > vxcopy Endp > End Rep reicht doch oder muss das ZF noch zusaetzlich zu cx geprueft werden?
Danke das funktioniert. Ich habe auch den Tasm
cppbert schrieb: > Rep reicht doch oder muss das ZF noch zusaetzlich zu cx geprueft werden? Mm ganz ehrlich ich weiß es nicht mehr aber ich glaube das rep und repz synonym sind. Hab schon eine ganze Zeit lang nichts mehr in asm gemacht. Das letzte Projekt war ein bios für den V40.
Thomas Z. schrieb: > Mm ganz ehrlich ich weiß es nicht mehr aber ich glaube das rep und repz > synonym sind. ergeben beide F3 Thomas Z. schrieb:
1 | > public vxcopy |
2 | > vxcopy Proc Uses DS ES, SegAddr:DWord, SegAddr1:DWord |
3 | > lds sI,SegAddr. ;source ds:si |
4 | > les di,SegAddr1 ;dest es:di |
5 | > mov cx,16000/2 ;div2 wegen movsw |
6 | > repz movsw |
7 | > ret |
8 | > vxcopy Endp |
Ich finde die Bezeichner SegAddr und SegAddr1 nicht gut gewählt. 1. Es sind komplette Adressen die übergeben werden. 2. Möglichst immer sollte man sprechende Bezeichner verwenden.
Einer schrieb: > Ich finde die Bezeichner SegAddr und SegAddr1 nicht gut gewählt. > 1. Es sind komplette Adressen die übergeben werden. > 2. Möglichst immer sollte man sprechende Bezeichner verwenden. stimmt ich hätte das psource und pdest genannt. Ich wollte aber bewusst die Bezeichner des TO verwenden. Es gibt noch mehr Optimierungen da die seg Adressen ja im Videoram liegen und alles in 64k liegt könnte man da noch ein paar Takte rausholen. Der Unterschied ist aber marginal.
:
Bearbeitet durch User
Thomas Z. schrieb: > Mm ganz ehrlich ich weiß es nicht mehr aber ich glaube das rep und repz > synonym sind. Die sind nicht das gleiche. REP läuft, bis CX=0 ist. REPZ läuft, bis CX=0 oder das Z-Flag nicht gesetzt ist. Das macht aber soweit ich weiß bei MOVS keinen Unterschied. Es wäre für SCAS oder CMPS relevant.
:
Bearbeitet durch User
REP(N)Z ist nur bei CMPS sinvoll, da MOVS und STOS die Flags nicht verändern. Aber auf jeden Fall muss vorher CLD (bzw. STD) aufgerufen werden, um die Laufrichtung festzulegen. Das hatte ich bei meinem Post auch vergessen.
Ja cld sollte in jedem Fall noch aufgenommen werden. Ein movsl würde die Ausführung noch mal beschleunigen. Dann muss cx halt mit 4000d initialisiert werden.
Thomas Z. schrieb: > Ja cld sollte in jedem Fall noch aufgenommen werden. Ein movsl > würde die > Ausführung noch mal beschleunigen. Dann muss cx halt mit 4000d > initialisiert werden. Bisschen zu breit für einen 8086
Rolf M. schrieb: > Thomas Z. schrieb: >> Mm ganz ehrlich ich weiß es nicht mehr aber ich glaube das rep und repz >> synonym sind. > > Die sind nicht das gleiche. Doch wie ich schon schrieb ergeben beide das Präfix F3. Mario M. schrieb: > Aber auf jeden Fall muss vorher CLD (bzw. STD) aufgerufen > werden, um die Laufrichtung festzulegen. Das hatte ich bei meinem Post > auch vergessen. Ja das ist eine schöne Falle. Besonders wenn die Bereiche sich überlappen können.
Einer schrieb: > Rolf M. schrieb: >> Thomas Z. schrieb: >>> Mm ganz ehrlich ich weiß es nicht mehr aber ich glaube das rep und repz >>> synonym sind. >> >> Die sind nicht das gleiche. > > Doch wie ich schon schrieb ergeben beide das Präfix F3. Ok, mein Buch war da etwas missverständlich. Nach genauerem Hinsehen sind laut diesem F2 oder F2 für REP gültige Werte, allerdings gibt's das dann nur in Kombination mit MOVS oder STOS. REPZ dagegen ist für CMPS und SCAS gedacht und hat auch den Wert F3, REPNZ den Wert F2. Also ja, REP und REPZ können ggf. den selben Wert haben, aber die Bedeutung ist von der eigentlichen Instruktion abhängig. Wenn man also REPZ MOVS hinschreibt, hat man in Wirklichkeit eigentlich ein REP MOVS.
Kurz getestet REP REPZ REPE ergeben immer F3 egal ob mit MOVS CMPS STOS REPNZ REPNE immer F2
Einer schrieb: > Kurz getestet > > REP REPZ REPE ergeben immer F3 > egal ob mit MOVS CMPS STOS Genau, aber bei MOVS und STOS bekommt man dann funktional ein REP, bei CMPS und SCAS ein REPZ.
Rolf M. schrieb: > Genau, aber bei MOVS und STOS bekommt man dann funktional ein REP, bei > CMPS und SCAS ein REPZ. Jetzt kapier ich es.
Ein for-Loop wird mit dem CX gemacht, der zaehlt implizit.
Joggel E. schrieb: > Ein for-Loop wird mit dem CX gemacht, der zaehlt implizit. steht auch so schon in den Post - was war die Frage?
Peter B. schrieb: > Ich habe eine OBJ für QBX Basic Ist QBXBasic das gleiche wie QBasic früher bei DOS?
PDS ist QBX-Basic. Der nächtste Type von Quickbasic unter DOS. Ist etwas für Retro-Leute. Mit PDS 7/7.1 kann man Obj einbinden von Turbo C und TASM/MASM. Also nicht mehr in Datazeilen umwandeln. Damit spiele ich jetzt sehr gern unter DOS.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.