| Autor |
Nachricht |
BunterVogel
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
|
BunterVogel Mitglied
19:12:55 21.06.2012 Titel: |
Länge eines Strings (db) erfahren, wie? |
Zitieren |
Hallo, ich habe z.B.
Satz db "Das ist ein Satz"
Wie kann ich die Anzahl der Elemente in dem "Satz" herausfinden?
Was ich konkret vor habe, bzw. was meine Aufgabe ist:
Ich soll ein Wort Rückwärts ausgeben.
Ich will zunächst herausfinden, wie lang der ganze Satz überhaupt ist,
also wieviele Elemente vorhanden sind.
Über die Index-Adressierung kann ich momentan gezielt auf Elemente zugreifen, aber ich selbst, will die Grenze selbst durch abzählen der Elemente am Bildschirm nicht selbst festlegen^^ Das Programm soll die Anzahl der Elemente selbst herausfinden in dem Satz, damit ich dann bis zu diesem n-ten Element die Elemente abrufen kann.
Diese hatte ich dann vor durch push und pop, umgekehrt anzuzeigen. |
Zuletzt bearbeitet von BunterVogel am 19:19:35 21.06.2012, insgesamt 1-mal bearbeitet |
|
 |
supernicky2
Unregistrierter
|
supernicky2 Unregistrierter
19:37:47 21.06.2012 Titel: |
zählen |
Zitieren |
Hallo,
Windows verwendet überlicherweise einen Null-terminierten String
text db "supernicky",0
DOS das "$" Zeichen als Ende.
Du brauchst nur den String byteweise von vorn einlesen (bis zum NULL-Zeichen)
und mitzählen.
Nicky |
|
|
|
 |
nachtfeuer
Moderator
Benutzerprofil
Anmeldungsdatum: 08.04.2010
Beiträge: 1432
|
nachtfeuer Moderator
22:21:47 21.06.2012 Titel: |
|
Zitieren |
Satzlänge merken, beim Einlesen irgendwo ablegen(geht alles auch per Interrupt), oder es geht bei den meisten Assemblern auch mit
push und pop sind nicht unbedingt für die Aufgabe geeignet, weil diese Befehle mit Registerbreite arbeiten.
Sinnvoller wäre es, das ganze über Stringbefehle über ES:Di und DS:Si und "rep stringbefehl" abzuarbeiten oder eben über den Akkumulator bzw das AL Register und einem Zeigeregister wie BX. |
_________________ HhxV9rU5D8o236dZF7bMQ4Dys1_TuUmI4mZM.d2qD15ERi_0dgcHP0UViL3e-4WUi0nXXNwDYqA10sLEgjBVtdhE
tpehI7qHRZESiO_7LhPZFMQWNoiVrJDsEGD26n.H0lV8wOwYAe8UsbUJe5m65NyPaghnSoMzROo2gJ6nTeVSkxLk
a6hvNe11r9U7xddV9mq6NEi_V0C9k4augEKVSW3PV8LgCYum7KaXc9Ijq_ZT7zhspI.=-
|
|
 |
BunterVogel
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
|
BunterVogel Mitglied
00:48:44 22.06.2012 Titel: |
Re: zählen |
Zitieren |
| supernicky2 schrieb: | Hallo,
Windows verwendet überlicherweise einen Null-terminierten String
text db "supernicky",0
DOS das "$" Zeichen als Ende.
Du brauchst nur den String byteweise von vorn einlesen (bis zum NULL-Zeichen)
und mitzählen.
Nicky |
jo, die einzelnen elemente heraus gelesen bis er eine 0 gelesen hat.
Habe jedes Element einzeln gelesen, mit der Index-Adressierung (müsste das heißen). Dann habe ich das sofort gepushed. Dann den nächsten, ebenfalls gepushed. Das ganze solange bis er eine 0 gelesen hat.
Dann habe ich ihn solange poppen lassen, wieviele Elemente der am Anfang gelesen hat. Und dann habe ich das ganze Rückwärts^^
Irgendwie ist das erste Zeichen was ausgegeben wird irgendwie ein Sonderzeichen, muss schauen warum das so ist :S |
|
|
|
 |
BunterVogel
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
|
BunterVogel Mitglied
00:59:01 22.06.2012 Titel: |
|
Zitieren |
Es klappt.
Aber zwei Probleme:
1) wenn ich start_txt mit hineinnehme, nimmt er den Text auch mit. Also reversed er eben auch, warum? ich habe doch nur "palin" unten reversen lassen. Warum wird er auch reversed ^^ Momentan ist ein ; vor start_txt - aber wenn ihr das mal weglässt, dann seht ihr das.
2) bei der ausgabe gibts janz vorne ein sonderzeichen - weshalb kann das sein?
(ich glaub ich weiß warum, fällt mir gerade eben so ein^^)
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | ;****************************
;Verfasser: BunterVogel
;Aufgabe:
;****************************
.model small
.stack 100h
.data
palin db "Juhu, der Code klappt!",0
; start_txt db "Palindrom wird gestartet",0
i dw 0 ; Anzahl der Elemente im Satz
include macros.mac
JUMPS
.code
start:
mov ax,@data
mov ds,ax
again:
mov di,i ; i wird in di-Reg. geschrieben
mov ah,palin3[di] ; ah, bekommt den i.ten Wert von di
cmp ah,0 ; wenn ah 0 ist, also der Satz zu Ende ist
je ende2 ; dann ist sense, i soll NICHT mehr +1 werden!
add i,1 ; wenn das aber nicht der Fall ist, also das letzte Elemen
; also das letzte Element nicht erreicht ist
push ax ; dann i+1 und pushe ax
jmp again ; gehe zu again
ende2:
;Ausgabe
mov cx,i ; cx bekommt i-Wert (Dient für Anzahl der Wiederholung des Poppens)
xor bx,bx ; bx = 0
loopstart:
mov bx,ax ; bx bekommt ax (sicherung von ax)
pop ax ; ax wird gepoppt
mov dl,ah ; dl bekommt ah
mov ah,2h ; Ausgabe (ah-Wert wird manipuliert)
int 21h
mov ax,bx ; ax wird wiederhergestellt
loop loopstart
ende:
mov ax, 04c00h
int 21h
end start | | |
|
|
|
 |
BunterVogel
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
|
BunterVogel Mitglied
01:23:08 22.06.2012 Titel: |
|
Zitieren |
Zu meiner Frage:
"2) bei der ausgabe gibts janz vorne ein sonderzeichen - weshalb kann das sein?
(ich glaub ich weiß warum, fällt mir gerade eben so ein^^) "
Hab den Fehler jetzt umgangen. Jedoch frage ich mich warum der am Ende des Strings einen andren Zeichen abließt.
Er übersetzt Quasi Haus_ -> _Haus Obwohl da kein _ ist^^
Bei anderen Sätzen und Worten sind andere Sonderzeichen da |
|
|
|
 |
freecrac
Unregistrierter
|
freecrac Unregistrierter
10:28:01 22.06.2012 Titel: |
|
Zitieren |
So wie "Nachtfeuer" es schon geschrieben hat ist die Methode mit dem aktuellen Programmcounter "$" am einfachsten umzusetzen.
Hier ein Beispiel zur Verwendung:
| Code: | 1 2 3 4 5 6 7 8 9 10 11 | Satz db "Das ist ein Satz"
SLen = ($-Satz)
mov bx, Satz
mov di, SLen
mov ah, 2
P1:
mov dl, [bx+di]
int 21h
dec di
jnz P1 | |
Dirk |
|
|
|
 |
freecrac
Unregistrierter
|
freecrac Unregistrierter
10:40:15 22.06.2012 Titel: |
|
Zitieren |
Huch, es hat sich ein kleiner Fehler eingeschlichen.
Satz db "Das ist ein Satz"
SLen = ($-Satz)
mov bx, Satz
mov di, SLen
mov ah, 2
P1:
mov dl, [bx+di]
int 21h
dec di
<--- Hier fehlt noch ein "cmp di,-1"
jnz P1
Dirk |
|
|
|
 |
rkhb
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.09.2010
Beiträge: 204
|
rkhb Mitglied
18:57:36 22.06.2012 Titel: |
|
Zitieren |
| BunterVogel schrieb: | Es klappt.
Aber zwei Probleme:
1) wenn ich start_txt mit hineinnehme, nimmt er den Text auch mit. Also reversed er eben auch, warum? ich habe doch nur "palin" unten reversen lassen. Warum wird er auch reversed ^^ Momentan ist ein ; vor start_txt - aber wenn ihr das mal weglässt, dann seht ihr das.
2) bei der ausgabe gibts janz vorne ein sonderzeichen - weshalb kann das sein?
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | ;****************************
;Verfasser: BunterVogel
;Aufgabe:
;****************************
.model small
.stack 100h
.data
palin db "Juhu, der Code klappt!",0
; start_txt db "Palindrom wird gestartet",0
i dw 0 ; Anzahl der Elemente im Satz
include macros.mac
JUMPS
.code
start:
mov ax,@data
mov ds,ax
again:
mov di,i ; i wird in di-Reg. geschrieben
mov ah,palin3[di] ; ah, bekommt den i.ten Wert von di
... | |
|
Der Code funktioniert, wenn man in Zeile 29 aus "palin3" ein "palin" macht. Bei mir wird auch start_txt nicht mitgenommen und es gibt auch keine Sonderzeichen am Anfang.
Drei Tipps:
1) ".stack 100h" ist ein bisschen klein, insbesondere wenn Du intensiv mit dem Stack arbeitest. Eventuell haben Deine Sonderzeichen mit einem Stacküberlauf zu tun. ".stack 8000h" tut keinem weh.
2) "include macros.mac" kannst Du weglassen, weil Du in diesem Programm keine Makros benutzt. Es verwirrt nur den geneigten Leser.
3) "JUMPS" verändert Dir unter Umständen Deinen Sprung und verändert das Laufzeitverhalten. Lasse es weg. Wenn Du einen Fehler bekommst, dass die Sprungadresse nicht erreichbar ist, kannst Du Dir immer noch überlegen, ob Du mit JUMPS den Assembler einen Workaround basteln lässt, oder die Programmlogik verbesserst.
viele grüße
ralph |
|
|
|
 |
BunterVogel
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
|
BunterVogel Mitglied
15:35:47 24.06.2012 Titel: |
|
Zitieren |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|