2012-05-07 21 views
1

私は画面の周りにアスタリスクを移動する必要があるこの小さなプログラムを作っています。問題は、境界線に当たるたびにアスタリスクが追加されることです。その余分なアスタリスクを取り除く方法の助け?それは本当にシンプルなプログラムです。ここで画面の境界線でテキストを止めるには?

は、これまでの私のコードです:

.model small 
.stack 256 

.data 
row db 10      ;Save the initial cursor coordinates in 
col db 40      ;col and row. 
msg1 db "*",'$'     ;Asterisk to be used by the program. 
msg2 db " ",'$' 

mSetCursor macro     ;Macro for placing the cursor in the screen. 
;pre-conditions 
; 
; None 
; 
;post-conditions 
; 
; Asterisks will be printed on the screen, 
; depending on the location of the cursor. 

push ax      
push bx 
push dx 

mov bh,0 
mov ah,2 
mov dh,row 
mov dl,col 
int 10h 

pop dx 
pop bx 
pop ax 
endm 

.code 
main proc 
mov ax,@data 
mov ds,ax 

mov ax,03      ;Clean the screen. 
int 10h 

start: 
mSetCursor     ;Call the macro in charge of placing 
           ;the asterisk on the screen. 
mov ah,10h 
int 16h 

cmp ah,2dh     ;Using the scan code of the letter X, we end 
je exit      ;the program once the "X" key is pressed. 

cmp ah,0bh    ;Using the scan code of the number 0, we clean 
je clear      ;the screen once the "0" key is pressed. 

cmp ah,4bh     ;Using the scan code of the left arrow, 
je left      ;we use the left arrow key to move the asterisk left. 

cmp ah,48h     ;Using the scan code of the up arrow, 
je up       ;we use the up arrow key to move the asterisk up. 

cmp ah,4Dh     ;Using the scan code of the right arrow, 
je right      ;we use the right arrow key to move the asterisk right. 

cmp ah,50h     ;Using the scan code of the down arrow, 
je down      ;we use the down arrow key to move the asterisk down. 

mov ah,9     ;Code in charge of receiving the fifth message 
mov dx, offset msg2   ;This code ensures that nothing happens while 
int 21h      ;keys that aren't arrow keys, 0, or X (quit) are pressed. 
jmp start 

left:       ;We receive the asterisk, and decrease the value of col 
mov ah,9      ;This starts the leftward movement of the asterisk. 
mov dx, offset msg1   ;Finally, we skip to the Start label. 
int 21h       
dec col 

cmp col,00    ;Disallow that the asterisk move past the 
je right     ;left side of the screen. 

jmp start      

right:      ;Receive the asterisk, and increase the value of col. 
mov ah,9      ;This starts the rightward movement of the asterisk. 
mov dx, offset msg1   ;Finally, we skip to the Start label. 
int 21h 
inc col 

cmp col,79     ;Disallow that the asterisk move past the 
je left     ;right side of the screen. 

jmp start 

down:       ;We receive the asterisk and increase the value of row. 
mov ah,9      ;This starts the downward movement of the asterisk. 
mov dx, offset msg1   ;Finally, we jump to the Start label. 
int 21h 
inc row 

cmp row,24    ;Disallow that the asterisk move past the 
je up      ;bottom of the screen. 

jmp start 

up:       ;We receive the asterisk, and decrease the value of row. 
mov ah,9      ;This starts the upward movement of the asterisk. 
mov dx, offset msg1   ;Finally, we jump to the Start label. 
int 21h 
dec row 

cmp row,-1    ;Disallow that the asterisk move past the 
je down     ;top of the screen. 

jmp start 

clear: 
mov ax,03      ;Clean the screen. 
int 10h 
jmp start 

exit:       ;Label that lets us end the program. 
mov ah,4ch 
int 21h 

main endp 
end main 

答えて

1

それがエッジに達すると、それはアスタリスクを配置するために、2つの割り込みを受信したときにあなたのコードに問題があります。具体的には、カーソルが右端にあるとします。右キーを押す。今度はラベルrightにジャンプします。現在のカーソル位置にアスタリスクを置きます。次にcolを増やし、ラベルleftにジャンプします。そこで、エッジを越えるのを防ぐために、colを減らします。しかし、左のラベルには、アスタリスクを配置するための割り込みも含まれているため、2つの*が生成されます。

これを防ぐには、最初のインクリメントの代わりにデクリメントして、エッジに達するとinc colをスキップしてください。たとえば、あなたのrightラベルが

right:      ;Receive the asterisk, and increase the value of col. 
mov ah,9      ;This starts the rightward movement of the asterisk. 
mov dx, offset msg1   
int 21h 

cmp col,78     ;Disallow that the asterisk move past the 
je start      ;right side of the screen. 

inc col 

jmp start      ;Finally, we skip to the Start label. 

に変更されますが、他の3のためにこれを行う必要があるでしょう。停止する場所に応じて比較値cmp col, 78を変更します。

あなたのコードをデバッグしただけで面白かったです。 :)

関連する問題