2012-04-06 5 views
0

Ich schreibe ein Programm in Assembly, das ein Array von Strings sprudeln wird. Eine Null-Länge-Zeichenfolge beendet das Array. Ich ging darauf zu, indem ich ein DWORD-Array deklarierte, in dem die String-Var., Die eine Byte-Größe ist, gespeichert werden soll. Mein Hauptproblem ist nicht die Bubble-Sortierung selbst, sondern dass die im Array gespeicherten Strings nicht vollständig ausgegeben wurden.Drucken eines in einem Array von DWORDS gespeicherten Strings

hoffentlich Um deutlich zu machen, hier ist mein Code:

.586 
.MODEL FLAT 

INCLUDE io.h ; header file for input/output 

space   equ  0 
cr    equ  0dh 

.STACK 4096 

.DATA   
myStrings    byte "Delts",0 
         byte "Abs",0 
         byte "Biceps",0 
         byte 0 

labelStrOut    byte "Output is: ", 0 

stringOut    dword 11 dup (?) 

stringNum    dword 0 
stringArray    dword 20 dup (?)    


.CODE 

_MainProc PROC 

      mov edi, offset myStrings 
      mov esi, offset stringArray 


popltLp:  
      cmp BYTE PTR [edi], 0 
      jz popltDone 
      mov ebx, [edi] 
      mov DWORD PTR [esi], ebx    
      add esi, 4 
      inc stringNum 
      xor ecx, ecx 
      not ecx 
      xor al, al 
      repne scasb 
      jmp popltLp 

popltDone: 
      xor edx, edx 


      lea esi, stringArray 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 
      add esi, 4 
      mov ebx, DWORD PTR [esi] 
      mov stringOut, ebx 
      output labelStrOut, stringOut 


outptDone: 

      mov eax, 0      ;  exit with return code 0 
      ret 
_MainProc ENDP 


END        ; end of source code 

Wie man sehen kann, Sortierung keine Blase noch ...

Die Linien unter ‚popltDone‘ getan wird, ist mir einfach herumspielen, um zu sehen, ob die Strings in das Array übernommen wurden. Beim Ausdruck auf dem Bildschirm erschienen jedoch nur 4 Zeichen! Die gesamte Saitenlinie wurde gerade nicht ausgedruckt, was mich derzeit in den Wahnsinn treibt. Kann mir bitte jemand sagen, was ich falsch mache?

Danke an alle, die sich die Zeit nehmen, dies zu lesen.

+0

Ist das Hausaufgaben? Können Sie die Ausgabe hinzufügen, die Sie sehen? – wallyk

+0

Auf dem Bildschirm ist die Ausgabe ziemlich viel: "Delt", "Abs" bzw. "Bice". Immer 4 Zeichen ... weiß nicht warum, muss die falschen Anweisungen verwenden, um Strings in Array zu speichern. –

Antwort

0

Das Problem ist, Sie verwenden Stringzeiger nicht korrekt. Insbesondere hier ist der Code Ich beziehe mich auf:

mov ebx, [edi] 
mov DWORD PTR [esi], ebx 

Wenn Sie diese ins Englische zu übersetzen, wäre es so etwas wie dieses:

Move the 4 byte value pointed to by edi into ebx. 
Move the value in ebx into the memory address pointed to by esi. 

Diese vollkommen legal und kann tatsächlich sein, was Sie wollen in einigen Fällen, aber ich denke, das ist keiner von ihnen. Der Grund, warum Sie nur die ersten 4 Zeichen sehen, wenn Sie Ihr Array von Zeichenfolgen ausgeben, ist, weil Sie die literale Zeichenfolge in Ihr Array kopiert haben. Ein DWORD ist 4 Bytes, also erhalten Sie die ersten 4 Zeichen. Hier ist, was würde ich schreiben:

mov DWORD PTR [esi], edi 

die in übersetzt:

Move the pointer value edi into the memory address pointed to by esi. 

Jetzt haben Sie nicht ein Array von Strings, aber eine Reihe von String-Zeiger. Wenn Sie Ihren Code in C schreiben würden, dekompilieren Sie ihn, das ist wahrscheinlich das, was Sie sehen würden. Schreiben Sie Ihre Vergleichs- und Ausgabefunktionen so um, dass sie mit dem Zeiger auf eine Zeichenfolge anstelle der Literalzeichen in der Zeichenfolge arbeiten, und Sie werden Ihr Problem beheben.

+0

Danke für Ihre Hilfe, Sparafusile. Obwohl ich nun mit einem neuen Rätsel konfrontiert bin: Wenn ich eines der Elemente innerhalb des Arrays von String-Zeigern ausspreche, ist alles, was ich bekomme, leer! ; Unten ist die Anweisung I bin mit, um es auszugeben –

+0

** Argh, mein Kommentar oben außer Acht lassen ... Ich bin auf dieser Seite noch neu, und alle seine Knicke ... Vielen Dank für Ihre Hilfe, Sparafusile. Obwohl ich nun mit einem neuen Rätsel konfrontiert bin: Wenn ich eines der Elemente innerhalb des Arrays von String-Zeigern ausspreche, ist alles, was ich bekomme, leer! Unterhalb der Befehl Ich habe es mit auszudrucken: lea esi, sagte string Ausgang labelStrOut, DWORD PTR [esi] Wie ist mein Ausgabefenster leer, zur Zeit einen Weg herauszufinden, zu umgehen es. –

+0

Sie versuchen, den Zeiger auf einen Zeiger zu drucken. Versuchen Sie stattdessen: "output labelStrOut, esi".Um zur nächsten Zeichenfolge zu wechseln, füge 4 zu esi hinzu. – Sparafusile

Verwandte Themen