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

OP #6198758
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.
OP #6199046
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
----------------------------------
Gast #6199192
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
OP #6199337
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
---------------------------
Gast #6199396
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
#6199498
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
Gast #6199524
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?
Gast #6199564
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.
#6199572
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.
Gast #6199898
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.
#6200123
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren