Eine Loop im 8086 rein bringen, dabei BX immer um 1 erhöhen,

OP #6198758
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.
OP
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
----------------------------------
Gast
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
OP
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
---------------------------
Gast
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
Gast
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?
Gast
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.
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.
Gast
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.
OP
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.