Wie test-Zeichen in einem string [Montage]
Schreibe ich ein Programm, um die Suche für die Vokale in einem string, aber ich habe Probleme beim testen der einzelnen Zeichen innerhalb der Zeichenfolge, ich habe das grundlegende Konzept ab und ich habe dies getan, bevor mit C++ und Python, aber ich weiß nicht wie ich es code in der Assembly.
Werde ich über einen Schalter hinzufügen, und testen Sie die einzelnen Charaktere, und ich weiß, dass ich brauchen, um eine Schleife durch alle Zeichen, aber ich bin stecken und eigentlich nicht testen einzelner Zeichen. (das ist nicht das, was ich programmiert haben, pro sagen, aber ein illustratives Beispiel)
max_length dd 40
user_input resd max_length
str_len dw $ - user_input
GetStr user_input ; "I am a boy"
mov ecx, str_len
Und das ist, wo ich nicht weiterkommen. Wie würden Sie testen, wie die einzelnen Zeichen von user_input
?
In C++, Sie hätte so etwas wie if(user_input[0] = 'Y')
, aber wie übersetze ich diese Art von Anweisung zur Montage (user_input[0])
Ich verstehen, dass es nicht auf diese Weise funktionieren, in der Montage, aber hoffentlich wird dies klar einige Sachen.
str_len DW $ - user_input
max_length EQU 40
jump_table:
DD case_0
DD case_1
DD case_2
DD case_3
DD case_4
DD case_5
.UDATA
user_input resd max_length
_main:
push ebp
mov ebp, esp
switch:
xor eax,eax
xor ebx,ebx
PutStr prompt
GetStr user_input
mov ecx, [str_len]
mov esi, user_input
read:
mov al, byte [esi+ebx]
or al, 20h
cmp al, 'a'
je [jump_table]
cmp al, 'e'
je [jump_table+4]
cmp al, 'i'
je [jump_table+8]
cmp al, 'o'
je [jump_table+12]
cmp al, 'u'
je [jump_table+16]
cmp ecx, 0
je [jump_table+20]
inc ebx
jmp read
dies ist, wo ich jetzt bin, wie ich sagte weiter unten, ich erhalte eine Fehlermeldung verbunden mit str_len
Ist dies alles funktioniert, nur muss ich, um den Puffer klar, Danke!
str_len DD 40
max_length EQU 40
jump_table:
DD case_0
DD case_1
DD case_2
DD case_3
DD case_4
DD case_5
.UDATA
user_input resb max_length
.CODE
.STARTUP
switch:
xor eax,eax
xor ebx,ebx
xor esi, esi
PutStr prompt
GetStr user_input
mov ecx, [str_len]
mov esi, user_input
read:
mov al, byte [esi+ebx]
or al, 20h
;PutCh al
cmp al, 'a'
je vowel_A
cmp al, 'e'
je vowel_E
cmp al, 'i'
je vowel_I
cmp al, 'o'
je vowel_O
cmp al, 'u'
je vowel_U
cmp ecx, 0
je str_end
inc ebx
dec ecx
jmp read
- Verwenden
cmp
und überprüfen Sie dann die flags. Oder wollen Sie wissen, wie Sie die "Last" der Zeichen per se? - Ich bin mir nicht sicher, was du meinst mit "laden", ich verstehe die
cmp
Anleitung nur nicht, wie man auf die einzelnen Zeichen - Wenn Sie können den code mit diesem primitiven C++, du bist auf halbem Weg gibt; der Assembler-code kann sehr nahe an eine direkte transliteration modulo Verwendung von Registern. Wenn ich zu entscheiden, ob ein Wort contianed ein Vokal, dann würde ich wahrscheinlich schauen Sie in einer Tabelle abgebildet, dass der Charakter auf einen booleschen Wert, die Sie tun müssen Adresse Arithmetik.
- Ich muss wissen, wie man schaut direkt auf die Zeichen im string, die Zeichenfolge, enthalten mehr als einen Vokal und mehr als einem Wort, so ist dies der Weg, den ich nehmen muss.
- Also, genau wie C++, müssen Sie eine Zeichenfolge Körper irgendwo im Speicher, und entweder ein index in den string (Hinzugefügt, um seine Basis geben Sie die Adresse eines Zeichens), oder benötigen Sie einen Zeiger, der scannt die Zeichen. Warum glauben Sie, dass "if (user_input[0]=='Y')..." ist nicht die Art, wie es funktioniert?
- Okay, Sie könnte mir zeigen, wie das code? Was ich sagen wollte ist ich kann nicht "if(user_input[0] == 'Y')" direkt in mein Assembler-code, ich weiß nicht, wie zu übersetzen, dass in der Montageanleitung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
mov EAX, [user_input]
würde NICHT laden Sie die Zeichenfolge ineax
aber die ersten 4 bytes der Zeichenfolge.user_input
ist ein Zeiger.Keine Notwendigkeit zum speichern der Länge des Strings, da strings sollte NULL enden.
expression is not simple or relocatable
Was Sie zu sein scheinen, fehlt, ist der Begriff der indizierten Adressierung.
Wenn Sie diese nicht kennen, Sie wirklich brauchen, um zurück zu assembler 101 Klasse oder Sie gehen nicht
machen große Fortschritte. Ich bin sicher, du findest ein tutorial auf dem web.
Wichtigen Ideen sind a) die Register enthalten beliebige Werte, interpretiert entweder als "nur eine Zahl" oder so interpretiert eine Speicher-Adresse, b) kombinieren Sie diese Werte zu Holen/speichern, Dinge im Gedächtnis zu behalten. Gegeben, dass ein register (esi) enthält einen Zeiger auf die Basis des Strings, und das register ecx enthält einen index in den string ein, den Unterricht
holt ein 8-bit-Wert für die AL-register. Die Anweisung teilt dem computer, um die Werte in edx und ecx bilden eine Speicher-Adresse, und Holen alles, was in diesem Ort. Ein verwandter Befehl:
berechnet die gleiche Adresse, aber es bewegt sich was in AL in den Speicher.
Leider für Sie, der x86-CPU hat komplizierte Regeln darüber, was erlaubt ist bei der Bildung einer Speicher-Adresse, indizierte Adressierung, und zusätzliche Regeln, wie die Größe des Operanden (8,16,32,64) in bits angegeben wird. Dies ist nicht der Ort für eine vollständige tutorial, das ist, warum ich schlage vor, Sie tun ein bisschen mehr Hausaufgaben, bevor Sie fortfahren.
mov EAX, [user_input]
laden würde den string in das register, sondern Sie wissen, wie zu navigieren, sobald er ist in das Vereinsregister ist die Frage. Ich kann nicht verwenden, ECX, weil ich bin laden Sie mit der Schleife zu zählen. Um genauer zu sein, wie würde ich schauen, insbesondere das erste Zeichen in der Zeichenfolge? @Jongware erwähnte etwas über das "loading" - Zeichen, aber ich weiß nicht, was er/Sie sich bezieht.