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.

InformationsquelleAutor BKreger | 2013-11-17
Schreibe einen Kommentar