2016-04-27 13 views
3

Nach jeweils 5 Elementen sollte das nächste Element in der nächsten Zeile gedruckt werden. Ich darf keine Leerstelle für den Abstand zwischen den Elementen verwenden. Ich habe versucht, GoToXy zu verwenden, aber ich habe Probleme. Alle Elemente in der ersten Reihe haben 5 Abstände zwischen ihnen, beginnend von der zweiten Reihe müssen alle Elemente zu dem darüber liegenden ausgerichtet werden.Wie alle Elemente in einem Array in der folgenden Ausgabe ausgeben?

gewünschte Ausgabe:

94  2  67  57  7 
40  58 48  73  94 
16  77 88  16 

Ausgabe von meinem Code: (Alles auf der gleichen Linie mit 5 Räume zwischen ihnen gedruckt wird.)

94  2  67  57  7  40  58 48  73  94  16 77 88  16 

Mein Code ist:

INCLUDE Irvine32.inc 

.data 
count = 14 
array WORD count DUP(?) 

.code 
main PROC 

    push OFFSET array 
    push COUNT 
    call ArrayFill 
    call DisplayArray 

    exit 

main ENDP 

;----------------------------------------------------------------------------------------- 
ArrayFill PROC 
    push ebp 
    mov ebp,esp 
    pushad    ; save registers 
    mov esi,[ebp+12] ; offset of array 
    mov ecx,[ebp+8]  ; array size 
    cmp ecx,0   ; ECX == 0? 
    je L2    ; yes: skip over loop 

L1: 
    mov eax, 100    
    call RandomRange ; from the link library 
    mov [esi],ax 
    add esi,TYPE WORD 
    loop L1 

L2: popad    ; restore registers 
    pop ebp 
    ret 8    ; clean up the stack 
ArrayFill ENDP 

;--------------------------------------------------------------------------------------- 
DisplayArray PROC 

mov eax, 0 
mov esi, 0 
mov ecx, COUNT 
mov dh, 0 
call GoToXy 
mov dl, 5 

L1: 
    mov ax, array[esi * TYPE array] 
    call WriteDec 
    call GoToXy 
    add dl, 5 
    inc esi 
    loop L1 
    call CrlF 
ret 
DisplayArray ENDP 
END main 
+0

Welchen Compiler benutzen Sie? –

+0

MASM in Visual Studio 2015. –

+1

Sie sind nicht berechtigt, eine Zeichenfolge von leeren Leerzeichen zu verwenden? Was ist mit Tabs (ASCII 9) und Zeilenumbrüche (ASCII 13 + ASCII 10)? –

Antwort

4

Registerkarten werden auf den meisten Konsolen automatisch ausgerichtet, sodass das Drucken eines Tabulatorzeichens (ASCII 9) automatisch auf ein 8-stelliges Spaltenformat ausgerichtet wird.

Ein Tabulatorzeichen sollte gedruckt werden, bevor der nächste Dezimalwert aus dem Array gedruckt wird, wenn dl 1, 2 oder 3 innerhalb Ihrer L1-Schleife entspricht. Wenn dl 0 nicht gedruckt wird, bleibt die erste Spalte linksbündig.

Wenn dl 4 in Ihrer L1 Schleife (4 stellt den fünften Wert für jede Zeile), Ausgabe eine neue Zeile (CRLF) nach dem Drucken und dann dl-0 zurückgesetzt für die nächsten 5 Zurücksetzen dl können Sie einfache Vergleiche verwenden , da Sie nur 5 mögliche Werte überprüfen können.

GoToXy scheint Ihre CrlF stören, obwohl ohne den Code für beide von denen kann ich nicht sagen, auf welche Weise. Mit dem Ansatz, den ich skizziert habe, brauchst du überhaupt nicht GoToXy, aber du brauchst immer noch CrlF, also schlage ich vor, dass du verifizierst, dass es tatsächlich funktioniert.