2017-02-21 15 views
3

私はアスタリスク(*)で作られたVをランダムな前景色と背景色を持つ*で作成します。ここに私のコードです...私はいくつかの休憩を入れ、プログラムをトレースし、それが何を問題にしているかを幾分考え出しました。ループカウンタ(ECXレジスタ)を上書きし、カーソル位置の移動に使用されるDH/DLレジスタを上書きするcolorプロシージャをバックスラッシュPROCが呼び出しているため、無限ループになります。私は組み立ての初心者であり、将来これらの問題を避けて修正するためのヒントやヒントを使用することができます。どんな助けもありがとうございます、事前に感謝します!組み立て時に無意味なループが発生する

割り当てガイドライン - 問題が何であるかを決定する上https://docs.google.com/document/d/1iPqfTd0qNOQo_xubVvsZLqfeNDog8mK6kzGGrR6s-OY/edit?usp=sharing

; main.asm - Assembly language source file 
; Author:  Dekota Brown 
; Date:    2/21/2017 
; Description: Colorful V-Pattern 

INCLUDE Irvine32.inc     ; Irvine's assembly library 
ExitProcess PROTO,dwExitCode:DWORD  ; MS Windows ExitProcess function 

.data 
    nullVar DWORD ? 
    msgEnd BYTE "Is the program running as you thought?",0 
    msgEndCaption BYTE "Program Exit...",0 
    symbol BYTE '*',0 
.code 
main PROC        ; main procedure, entry point 

mov EAX, nullVar 
mov EBX, nullVar 
mov ECX, nullVar 
mov EDX, nullVar 

call backslash 

mov EDX,OFFSET msgEnd 
mov EBX,OFFSET msgEndCaption 
call MsgBoxAsk 


mov EAX,07 
call SetTextColor 
call CrLf 
call WaitMsg 

INVOKE ExitProcess,0    ; end the program 

main ENDP 

color PROC 

    call Randomize ; Seed the RNG 
    mov ECX,20 ; Set up loop counter 
L1: 
    mov EAX, 256 
    call RandomRange 
    call SetTextColor 
    mov EDX,OFFSET symbol 
    call WriteString 
loop L1 

    ret 
color ENDP 

backslash PROC 

    mov dl, 2 ; Row 2 
    mov dh, 4 ; Column 4 
    mov ECX,20 ; Sets up loop counter 
L2: 
    call color 
    call CrLf 
    add dh,1 ; Increments column or shifts right by 1 position 
loop L2 

    ret 
backslash ENDP 

forwardslash PROC 

    ret 
forwardslash ENDP 

END 

答えて

3

良い仕事。この問題に直面すると(ECXレジスタが1つしかないため)、前の値を保存して使用し、以前の値を復元するには、カラーprocが必要です。あなたはpushpop命令でこれを行うことができます:私は*****で追加されたコードをマークしている

color PROC 
    push ecx ; ***** save previous value 
    call Randomize ; Seed the RNG 
    mov ECX,20 ; Set up loop counter 
L1: 
    mov EAX, 256 
    call RandomRange 
    call SetTextColor 
    mov EDX,OFFSET symbol 
    call WriteString 
loop L1 
    pop ecx ; ***** restore previous value 
    ret 
color ENDP 

特定のプラットフォームとオペレーティングシステムには、ABIと呼ばれるものがあります。この中には、他の機能によって保存され復元されることが予想されるものがあります。これらは、レジスタ値を上書きすることなく、異なるコンパイラと言語間でコードを呼び出すことができるように、誰もが従うルールとして書き留められます。

関連する問題