Forum: PC-Programmierung Eine Loop im 8086 rein bringen, dabei BX immer um 1 erhöhen,


von Peter B. (funkheld)


Lesenswert?

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
von cppbert (Gast)


Lesenswert?

mov cx,3

derloop:

;mach was
inc bx

dec cx
jnz derloop

von cppbert (Gast)


Lesenswert?

cppbert schrieb:
> mov cx,3
>
> derloop:
>
> ;mach was
> inc bx
>
> dec cx
> jnz derloop

Oder

dec cx
jnz derloop

durch

loop derloop

ersetzen

von Jim M. (turboj)


Lesenswert?

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.

von Mario M. (thelonging)


Lesenswert?

1
LES  DI, SegAddr
2
MOV  AX, color
3
MOV  CX, loopwert
4
REP  STOSB
5
RET

von Peter B. (funkheld)


Lesenswert?

Danke funktioniert wunderbar, beide Vorschläge.

: Bearbeitet durch User
von Peter B. (funkheld)


Lesenswert?

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
von cppbert (Gast)


Lesenswert?

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

von cppbert (Gast)


Lesenswert?

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

von Peter B. (funkheld)


Lesenswert?

Danke für die Info.

Leider habe ich keine Strings , es sind nur Byte und zwar 16000.

von Einer (Gast)


Lesenswert?

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.

von cppbert (Gast)


Lesenswert?

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

von Peter B. (funkheld)


Lesenswert?

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
---------------------------

von Einer (Gast)


Lesenswert?

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

von Thomas Z. (usbman)


Lesenswert?

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

von cppbert (Gast)


Lesenswert?

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?

von Peter B. (funkheld)


Lesenswert?

Danke das funktioniert.
Ich habe auch den Tasm

von Thomas Z. (usbman)


Lesenswert?

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.

von Einer (Gast)


Lesenswert?

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.

von Thomas Z. (usbman)


Lesenswert?

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
von Rolf M. (rmagnus)


Lesenswert?

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
von Mario M. (thelonging)


Lesenswert?

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.

von Thomas Z. (usbman)


Lesenswert?

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.

von cppbert (Gast)


Lesenswert?

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

von Einer (Gast)


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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.

von Einer (Gast)


Lesenswert?

Kurz getestet

REP REPZ REPE ergeben immer F3
egal ob mit MOVS CMPS STOS
REPNZ REPNE immer F2

von Rolf M. (rmagnus)


Lesenswert?

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.

von Einer (Gast)


Lesenswert?

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.

von Pandur S. (jetztnicht)


Lesenswert?

Ein for-Loop wird mit dem CX gemacht, der zaehlt implizit.

von cppbert (Gast)


Lesenswert?

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?

von Jan Eckermann (Gast)


Lesenswert?

Peter B. schrieb:
> Ich habe eine OBJ für QBX Basic

Ist QBXBasic das gleiche wie QBasic früher bei DOS?

von Peter B. (funkheld)


Lesenswert?

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
Noch kein Account? Hier anmelden.