Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: Assembler ::  Länge eines Strings (db) erfahren, wie?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
BunterVogel
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.01.2012
Beiträge: 79
Beitrag 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




Beitrag 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
Beitrag 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

Assembler:
$-Satz



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
Beitrag 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
Beitrag 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
Beitrag 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




Beitrag 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




Beitrag 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
Beitrag 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
Beitrag BunterVogel Mitglied 15:35:47 24.06.2012   Titel:              Zitieren

Vielen Dank!
c++.de :: Assembler ::  Länge eines Strings (db) erfahren, wie?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.