Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Phier 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,'$'
-
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?
-
irgendwie versteh ich dein problem nich aber ma davon abgesehen würd ich loop für schleifen nehmen
-
Ging mir irgendwie genau so!
Stell doch noch einmal EINE (VERSTÃNDLICHE) Frage. Dann können wir die vielleicht besser helfen.
-
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
-
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 :)
-
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
-
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,'$'
-
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???
-
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
-
herllich der hat aus : dx nen smilie gemacht
-
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
-
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
-
Sorry hab mich vertan ersetz ma mov ah,1 durch mov ah,2
und das Zeichen muss in dl stehen
-
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
-
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.
-
ach is ne .com ? ich compile aber über nasm -o blubb.exe blubb.asm
-
Jo wird trotz dem exe von dos als com verarbeitet
-
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