Autor Thema: Prob Schleife  (Gelesen 11392 mal)

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« am: 16. April 2004, 13:24 »
Hi,

Ich versuch grad irgendwie ne schleife zu machen mit cmp und je oder jne aber klappt irgendwie net ... dann hab ich da weng rumgespielt und jetzt haut die irgendwie so halber hin, wenn man 6 zeichen eingibt beendet er ... aber fragt mich nicht wieso ... könnte mir einer das mal erklären ... dachte wenn man zeichen eingeben will muss sowas wie mov ah,1 oder so stehn.

org 100h
mov cx,6
schleife:
dec cx
mov ah,9
mov ax,data
int 21h
mov dx,0
cmp cx,dx
jne schleife
mov ah,4ch
int 21h

data db 'aha',10,13,'$'

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #1 am: 16. April 2004, 15:44 »
Zuerst initialisiest du cx mit 6.
Das wird bei jedem durchgang mit dec cx um 1 ernidrigt (dekrementiert).
Am Ende überprüfst du immer ob das schon 0 ist (mov dx, 0; cmo cx, dx).
Wenn das nicht so ist, springst du an den Anfang (jne schleife ; jump not equal)
Also wird das ganze zwischen schleife: und jne schleife 6 mal ausgeführt, oder was wolltest du wissen?

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #2 am: 16. April 2004, 16:33 »
irgendwie versteh ich dein problem nich aber ma davon abgesehen würd ich loop für schleifen nehmen
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #3 am: 16. April 2004, 16:38 »
Ging mir irgendwie genau so!
Stell doch noch einmal EINE (VERSTÄNDLICHE) Frage. Dann können wir die vielleicht besser helfen.

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #4 am: 16. April 2004, 17:55 »
Also dein dosinterrupt soll ein Zeichen einlesn( jednfalls macht er das da) und du prüfst jedesmal ob cx nicht! null ist (das macht man aber lieber mit
or cx,cx  
jne schleife
)
wenn das der fall ist (also wenns nicht 0 ist) hüpfst du wieder hoch
bei jedem mal decremtierst du cx also da du vorher ne 6 da reingetan hast muss das ganze 6 mal durchgehn
wenn das nicht der fall ist (also wenn cx 0 is) dann geht er über den sprung weiter hüft also nich und dann kommt das dos ding zum beenden ganz einfach
nur eine gegenfrage: Warum definierst du den string mit aha und terminierst den dann so das dos den als string ausgeben könnte wenn du das doch sowieso überschreiben lässt?
Und is das mode irgndnen (scheinbar) sinnloses org davorzusetzen oder seh ich den sinn nur nich weil ich noch nie dosproggis in asm gemacht hab?
So falls du das alles hier nicht wissen wolltest (ich hab nur auf verdacht und aus langeweile was geschrieben) dann stell bitte ne frage :P
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #5 am: 16. April 2004, 18:04 »
Org 100 musst du für Comdateien schreiben.
Da schreibt DOS beim starten noch was in die ersten 100 Bytes. Daher darf die Com erst bei 100h beginnen :)
----------------------
Redakteur bei LowLevel

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 16. April 2004, 19:18 »
also ich wollte eigentlich ne schleife machen die 6 mal durchgeht, also 6 mal data aufn schirm bringt und dann programm beendet. aber dabei kam das oben raus ... versteh net ganz wieso. denke frage war schon klar genug...

mfg
phier

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #7 am: 16. April 2004, 19:36 »
Also dein letzter Post hat dein Problem schon besser rübergebracht.
Was meinste denn mit bricht die schleife ab aber sagt mir nicht warum?
oder dachte wenn man ein zeichen eingibt muss da mov ah,1 oder so da stehen

probiers hiermit allerdings weiss ich nicht ob du die richtigen dos funktionen benutzt.
org 100h
mov cx,6
schleife:
mov ah,9
mov ax,data
int 21h
loop schleife
mov ah,4ch
int 21h

data db 'aha',10,13,'$'
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #8 am: 16. April 2004, 19:38 »
Was soll das ?

mov ah,9
mov ax,data

erst beschreibst du ah mit 9 und dann wird das mit dem 2. befehl gleich überschrieben! (ax = ah + al)
Und warum möchtest du in AX 'ah' schreiben. sollte das so etwas, wei les sein???

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #9 am: 16. April 2004, 19:49 »
Hab grad ma geguckt also funktion 09h gibt einen String auf den DS:DX zeigt. Der String muss dabei mit einem $ terminiert sein.

funktion 01h gibt ein einzelnes Zeichen aus das in al steht.  

Also entweder so:
org 100h
mov ah,9
mov dx,data
int 21h

mov ah,4ch
int 21h

data db 'aha',10,13,'$'
--------------------------------------------------------------------------
oder so:
org 100h

mov cx,6
lea  si,data
cld

schleife:
lods data
mov ah,1
int 21h
loop schleife

mov ah,4ch
int 21h

data db 'aha',10,13,'$'

gibt natürlich noch andere Möglichkeiten nur was war jetz dein Problem die Schleife an sich oder die benutzte Dos Funktion
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #10 am: 16. April 2004, 19:49 »
herllich der hat aus : dx nen smilie gemacht
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 16. April 2004, 19:53 »
allgemein:
muss man das mit den counts unbedingt in den cx-register machen oder kann man net auch sagen mov dx,6 z.b. ??

@chr15
http://www.electronic-security.de/archiv/coding/asm/tutor2.html
da steht das irgendwie  so ich habs dann versucht ohne dass zu machen, weil bei mir loop net geht und ich auch nicht verstehe was lea macht.

@lobman  
dein post macht das gleiche wie meiner das ja auch gut aber ich will dass er das data "aha" 6 mal auf bildschirm printed.

@roshl
soviel ich weiss bedeuted das org 100h dass ms-dos sich angesprochen fühlt oder so ähnlich ( bei nasm ). und was meinst mit determinieren ?
mov ah,9
mov ax,data
dachte dass sich die 9 und das aha nicht in die quere kommen, oder tun sie das ?
also wie ich das so aus paar tuts mitbekommen hab ist das mov ah,9 dafür da dass es auf dem schirm ausgegeben wird.

und dann noch was allgemeines. manchmal passiert es auch dass bei nem code wo ich mich dran versuche nur so gecryptedes zeugs kommt wenn ich z.b. falschen register benutze. spricht das gegen das 1. allgemein oben ? und wenn ja warum ...

big THX
Phier

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #12 am: 16. April 2004, 20:04 »
Na jetz haste dein Problem mal auf den Punkt gebracht also lea lädt den offset von data in si und lods erhöht den wert in si immer um ein byte weil data mit db deklariert ist. determinieren bedeutet das du ein string mit einem zeichen abschließt um das ende zu markieren. printf bei C erwartet z.B. 0 und die Dos Funktion halt $

und hier der Quellcode:
mit loop
org 100h
mov cx,6

schleife:
mov ah,9
mov dx,data
int 21h
loop schleife

mov ah,4ch
int 21h

data db 'aha',10,13,'$'
;-------------------------------------------------------------------------
ohne loop:
org 100h
mov cx,6

schleife:
mov ah,9
mov dx,data
int 21h
dec cx
or   cx,cx
jnz schleife

mov ah,4ch
int 21h

data db 'aha',10,13,'$'

Ach ja wenn du das ganze ohne loop machst kannste natürlich (fast) jedes Register benutzen da du ja auch jedes Register mit cmp benutzen und dekrementieren. cx is halt für so befehle wie loop weils da automatisch runtergezählt wird
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #13 am: 16. April 2004, 20:12 »
Sorry hab mich vertan ersetz ma mov ah,1 durch mov ah,2
und das Zeichen muss in dl stehen
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 16. April 2004, 20:13 »
thx lobmann hab alles bis aufs neue verstanden:

also lea lädt den offset von data in si und lods erhöht den wert in si immer um ein byte weil data mit db deklariert ist <<-- was bedeutet das ? also mal langsam damit ichs aufn punkt bringe ;-)

1. offset hab ich in den codes die ich mir angeschaut hab nie verstanden

2. hab mich mal in schlaufe gemacht si ( source index ) gehört zu den zeiger und indexregister aber für was sind die gut und was machen die und wie unterscheiden die sich ?

3. in meinem schlaufen buch steht für lea folgendes woraus ich nie schlau werde:
"Liegen Quell- Zielbereich im aktuellen Datensegment, dann können die Anfangsadressen sehr bequem mit dem Befehl LEA in die als Zeiger fungierenden Register eingesetzt werden."
gehört irgendwie noch zu 1. ;D

mfg
phier

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #15 am: 16. April 2004, 20:39 »
Der letzte Post Bezog sich auf das Beispiel was ich oben geschrieben hab. is auch egal.

also zu lods:
Hab vergessen noch zu sagen das gleichzeitig noch das Zeichen auf das DS:SI zeigt gleichzeitig in ax ( bei word ) oder in al ( bei byte) kopiert wird.
So weiter lods gibts auch als lodsb ( für byte ) oder lodsw (für word ) nur da du ja deinen String mit db (define byte) deklariert hast erkennt der Compiler automatisch welches lods gemeint ist.

zu 1:
Am besten liest du dir mal das Kapitel über die Organisations des Speichers im RMODE durch. Der Speicher ist genau 1 MB gross aber mit einem 16 BIT Register kann man nur Zahlen bis 65536 darstellen. Aber da man ja die ganzen 1MB ansprechen gibts folgenden Trick. Das Register wird intern mit 16 multipliziert, würde man jetz nur dieses 16-BIT Register benutzen könnte man ja nur jedes 16. Byte ansprechen, deshalb gibt es noch einen offset der einzelnde Bytes adressiert. Bsp:
du hast in DS 1000 stehen damit wird physikalisch das byte nr 16000 adressiert (16*1000). und der offset kann jetz ganz einfach 65536 Bytes ab 16000 adressieren.

zu 2:
SI is halt vereinfacht nen Zeiger bzw. offset im DS und DI im ES.
und diese 2 Register sind halt dafür gedacht Zeichenketten zu verarbeiten.
Mit den Registern ists halt einfacher weil es für die spezielle Befehle wie lods und lea und so gibt.

zu 3:
hoffe wird aus 1 klar
bei com dateien die du ja schreibst is halt DS automatisch gleich CS deshalb kannst du das hier ohne bedenken verwenden.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Phier

  • Beiträge: 26
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 16. April 2004, 20:44 »
ach is ne .com ? ich compile aber über nasm -o blubb.exe blubb.asm

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #17 am: 16. April 2004, 20:46 »
Jo wird trotz dem exe von dos als com verarbeitet
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #18 am: 17. April 2004, 14:41 »
Also mit terminieren meine ich das bei dos die Strings mit einem $ terminiert (nicht determiniern) werden müssen(also damit enden) damit dos weiss das der string da zuende ist
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

 

Einloggen