Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleine Buchstaben in große umwandeln
Moin,
Ich selber bin PHP Programmierer und grade wollte ich einfach mal schauen wie ich folgendes problem in Assembler lösen könnte..
Ich gebe eine Text ein und nach dem Enter wandelt er mir alle kleinen Buchstabe in große um...
Würd ich toll finden wenn mir da einer mal was posten könnte...
Gruss Sebastian
coder_freddy
11.04.2005, 15:56
du könntest jedes Zeichen überprüfen zB.:
start_ : CMP SI, MAX_Zeichen
JE ende_
MOV AX,Quelle[SI]
add si, 1 bzw 2 wenn word
anschließend vergleichen: CMP AX, 60 h
springen :
JG minus_
jmp start_
JG minus_: SUB AX, 20h
JMP start_
ende_ : MOV AX,4C00h
INT 21h
so sollte das funzen. (Hexzahlen)
Gruß Freddy
coder_freddy
11.04.2005, 20:22
habs mal mit dem MASM gebaut... :
;die Buchstaben werden in Große umgewandelt
uppercase PROC
MOV BX,1
nextChar_: INC BX
MOV DL,eingabe[BX];in DL=aktueller Char
;kleinbuchstabe?
CMP DL,60h
;ja, mach groß
JG mkUpper_
CMP DL,13;enter?
JE ende_
JMP nextChar_
mkUpper_:
SUB DL,20h
MOV eingabe[BX],DL
JMP nextChar_
ende_: ;text ende
MOV eingabe[BX],'$'
RET
uppercase ENDP
vorher in 'eingabe' einlesen und die dann Zeichenweise bis zum '$' ausgeben
Gruß Freddy
habs mal mit dem MASM gebaut... :
;die Buchstaben werden in Große umgewandelt
uppercase PROC
MOV BX,1
nextChar_: INC BX
MOV DL,eingabe[BX];in DL=aktueller Char
;kleinbuchstabe?
CMP DL,60h
;ja, mach groß
JG mkUpper_
CMP DL,13;enter?
JE ende_
JMP nextChar_
mkUpper_:
SUB DL,20h
MOV eingabe[BX],DL
JMP nextChar_
ende_: ;text ende
MOV eingabe[BX],'$'
RET
uppercase ENDP
vorher in 'eingabe' einlesen und die dann Zeichenweise bis zum '$' ausgeben
Gruß Freddy
Also ich hab nicht soviel ahnung davon Assembler komme ich grade noch drauf klar aber das obere Programm bekomm ich nicht zum laufen <img>
Und das neue, was ist das für ne Sprache ;)
Gruss Sebastian
Das nennt sich Assembler. :p
Das Programm macht folgendes:
Das Programm prueft einfach nur, ob eingegebener Buchstabe > ASCII-Wert 96 ist (bei 97 faengt das kleine a an).
Wenn ja, dann ziehe 32 (Hex 20) davon ab, damit Du als Resultat einen Kleinbuchstaben erhaelst.
Im Falle eines kleinen a's (ASCII 97) - 32 = 65, was einem grossen A entspricht.
Gruß z3r0x
Wie bekommt man das aber zu einer .COM datei ? :)
ES kommt immer ein Fehler,
ende_: MOV eingabe[BX],'$'
~ ^
#ERROR 45: Is It Byte Or Word? @@@@#
hoffe kannst mir helfen.
butterkeks
11.04.2005, 21:05
Welcher Assembler?
Probier mal
mov byte ptr eingabe [bx], '$'
Es handelt sich dabei um:
A86 assembler package V4.05
, wenn ich deinen Befehlt benutze kommt wieder eine Meldung, diesmal eine Andere:
Undefinied Symbols are listened in TEST.UND
EINGABE in TEST.ASM
:(
ES kommt immer ein Fehler,
ende_: MOV eingabe[BX],'$'
~ ^
#ERROR 45: Is It Byte Or Word? @@@@#
hoffe kannst mir helfen.
MOV eingabe[BX] B, '$'
passt hoffentlich. bewegt ein Byte. Wenn es ein Word sein soll nimm W.
Gleicher Fehler, Egal ob mit B oder W :(
vieleicht liegt der Fehler ja woanders.
uppercase PROC
MOV BX,1
nextCHAR_: INC BX
MOV DL,eingabe[BX]
CMP DL,60h
CMP DL,13
JMP nextCHAR_
mkUPPER_: SUB DL,20h
MOV eingabe[BX],DL
JMP nextCHAR_
ende_: MOV eingabe[BX] W, '$'
RET
Uppercase ENDP
Der Fehler kommt immer wenn versuche die Datei in .COM zu Compilieren (A86 TEST.ASM)
EDIT:
scheint wohl ein Hoffnungsloser Fall zu sein :(:(
Mit einer Tabelle aus 256 Bytes könnte man das Ganze auch
lösen. Vorteil wäre halt, daß man z.B. Umlaute (Zeichen
>=128) auch mit "upcasen" könnte.
Dürfte meiner Schätzung nach auch schneller sein.
Da stimme ich zu. Dann baut man die Codepage Sachen gleich mit ein. Auch DOS bietet Funktionen, um Strings/Zeichen in Großbuchstaben zu konvertieren, aber eine Tabelle ist einfacher und man weiß was man konvertiert.
tabelle db 0,1,2,3,4,5,6,7, ... 'A', 'B', 'C', ... 'Ä' ..., 255
Die ASCII-Tabelle liegt sowieso im Speicher (Adresse weiß ich jetzt nüch auswendig), die braucht man also nicht erst defineiren.
Die ASCII-Tabelle liegt sowieso im Speicher (Adresse weiß ich jetzt nüch auswendig), die braucht man also nicht erst defineiren.
wie genau muss ich mir das vorstellen?
db 0, 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, 63, 64, 65, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127
pretty useless ... :p verwechselst du das evtl. mit den ROM BIOS font tables? ;)
Die Tabelle sieht etwa so aus:
0,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,63
64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95
96,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,123,124,125,126,127
und so weiter.
d.h. Für die Kleinbuchstaben (96 bis 122) setzt man die
Großbuchstaben (65 bis 90) ein.
Ebenso verfährt man mit Zeichen über 127. Da hängt es dann
natürlich vom jeweiligen Zeichensatz ab, wo die Umlaute
und ihre "großen" Entsprechungen sind. Klar sind ein
Haufen Zeichen dann unverändert in der Tabelle - trotzdem
spart man imo Speicher, weil die asm-Routine dafür sehr
klein (und schnell) wird. Im Gegensatz dazu müßte man ja
sonst jeden Umlaut (äöü) oder Buchstaben wie é, í usw.
einzeln abfragen, was langsamer wäre - und am Ende
wahrscheinlich genausoviel Speicher brauchen würde.
Weiterer Vorteil einer Tabelle: Ändert sich der
Zeichensatz, kann man automatisch ne neue Tabelle für den
neuen Zeichensatz mitladen - was bei nem starren Programm
nicht möglich wäre.
(Anmerkung: Ich bin z.B. DOS-User, arbeite daher natürlich
mit dem "Standard" Zeichensatz aka "Codepage 437". Der in
Windows benutzte Zeichensatz entspricht in DOS "Codepage 852".
Umlaute sind selbstredend dann woanders.)
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.