2016-04-26 21 views
0

これまでのところ、私はこのASM無限ループ

org 100h 


.data 
Input db "Enter size of the triangle between 2 to 9: $" 
Size dw ?    


.code 
Main proc 
Start: 
Mov ah, 09h 
Mov dx, offset input 
int 21h 

mov ah, 01h 
int 21h; 

sub al, '0' 

mov ah, 0 

mov size, ax 
mov cx, ax  

mov bx, 1      

call newline 


lines:     
push cx 
mov cx, bx 
lines2:     ; outer loop for number of lines 
push cx 
sub ax,bx 

stars:     

mov ah, 02h 
mov dl, '*' 
int 21h 


loop stars 

inc bx 

call newline 
pop cx 



loop lines 
loop lines2 
exit: 
mov ax, 4C00H 
int 21h  




main endp 


proc newline 
mov ah, 02h   
mov dl, 13 
int 21h 
mov dl, 10 
int 21h 

ret 


newline endp 

end main 

すべてが正常に動作して通ってループ持っています。私は3を入力した場合たとえば、私は

* 
** 
*** 

を取得し、プログラムは、しかし、私は私にこのような何かを与えて起動した直後に別のループを取得しようとしている停止します

* 
** 
*** 

*** 
** 
* 

を私が入る保ちます無限ループと私はこの問題を解決する方法を解決することはできません。誰かが私が間違っていることについていくつかの洞察を持っていますか?星 -

+1

は、作業または非作業1投稿コードですか?それが前者の場合は、動作していないコードを投稿するか、それとも何が問題なのかを伝えることはできません。インデントしてコメントすることができれば、それは超甘いでしょう。 –

+0

あなたは「MOVのCX、BX」とラインの「MOV CXを、[サイズ]」と「サブCX、BX」あなたは – Tommylee2k

+0

ラウンドピラミッドに他の方法が表示されます、私はあなたのコードを実行し、素晴らしい作品、ない無限ループを、交換する場合おめでとう! –

答えて

0

あなたのループが成長しているので、ピラミッドのために0にダウン[サイズ]からCXを実行している、あなたは(CX [サイズ] +1)を表示する必要があります。 1つの縮小のために、これは

Start: 
    Mov ah, 09h    ; prompt 
    Mov dx, offset input 
    int 21h 

    mov ah, 01h    ; input size 
    int 21h 
    sub al, '0' 
    mov ah, 0 
    mov size, ax 
    mov cx, ax  
    mov bx, 1      
    call newline 

up:     
    mov bx, [size]  ; number of stars: 
    inc bx    ; [size]+1 
    sub bx, cx   ; -CX 
    call stars 
    loop up 

    call newline 

down:  
    mov cx,[size] 
d2:     
    mov bx, cx   ; number of stars: CX 
    call stars 
    loop d2 


exit: 
    mov ax, 4C00H 
    int 21h 

とサブ機能を読み取るために非常に簡単にそれを作る、

iは、サブルーチンへの「プリントアウトBXの星を」移動した(CX)単純です:

; display BX number of '*' followed by newline 
; uses CX internally, so it's saved and restored before ret 
proc stars 
    push cx 
    mov cx,bx 
s2: 
    mov ah, 02h 
    mov dl, '*' 
    int 21h 
    loop s2 

    call newline 
    pop cx 
    ret 
stars endp