如何在以下输出中输出数组中的所有元素?

时间:2016-04-27 18:47:07

标签: assembly x86 masm masm32 irvine32

在每5个元素之后,下一个元素应该打印在下一行。我不允许在元素之间的空格中使用一串空格。我尝试使用GoToXy,但我遇到了麻烦。第一行中的所有元素之间都有5个空格,从第二行开始,所有元素都需要与其上方的元素对齐。

期望输出:

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

我的代码输出: (所有东西都印在同一条线上,它们之间有5个空格。)

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

我的代码是:

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

1 个答案:

答案 0 :(得分:4)

选项卡字符在大多数控制台上自动对齐,因此打印制表符(ascii 9)将自动对齐为8个字符的列格式。

dl循环中L1等于1,2或3时,应在打印数组中的下一个十进制值之前打印制表符。通过在dl为0时不打印选项卡,第一列将保持左对齐。

dl循环中L1为4时(4代表每行的第五个值),打印后输出换行符(crlf),然后将dl重置为0 next 5.重置dl允许您使用简单的比较,因为您只有5个可能的值要检查。

GoToXy似乎在干扰您的CrlF,尽管没有任何代码的代码,我无法用什么方式来判断。使用我概述的方法,您根本不需要GoToXy,但您仍然需要CrlF,因此我建议您确认它确实有效。