2016-11-07 67 views
2

我想用匯編語言編寫一個程序,其中我想在屏幕上移動文本或字符,就像屏幕保護程序一樣,即首先它應該向前或向下移動方向。當它達到屏幕的下限時,它應該開始向前和向上的方向移動,反之亦然。以彙編語言移動文本程序

我已經嘗試過自己,我已經能夠同時向前和向下的方向移動角色。當角色達到屏幕下限時,我希望它向上和向前移動,但我似乎無法想象如何去做。

我使用emu8086彙編

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp DH,23   ;conditional jump 
    jz label2 
    loop label1 

    label2: 

    ; mov AH,2H 
    ; mov BH,0   ;goto-XY 
    ; mov DH,BL 
    ; mov DL,BL 
    ; INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 

在第一循環的每次迭代結束時,我檢查如果「DH」 = 23,因爲我的屏幕的y軸的下限是23。如果下屏幕的限制已達到,它應該跳轉到'label2',但它不會跳轉到'label2',這顯然是因爲我沒有正確使用'cmp'語句。 任何人都可以幫我解決這個問題嗎?

我想幫忙的主要事情是我應該檢查'label1'以跳到'label2'。

PS。只是彙編語言的初學者,所以如果您提出解決方案,請保持簡單易懂。 這是我到目前爲止嘗試過的。

+1

什麼版本的組件您使用的是? –

+0

我不確定你的裝配版本是什麼意思。你能詳細說明嗎? – Yousaf

+0

根據您的架構,有許多不同版本的彙編語言。 nasm中最受歡迎的彙編程序之一。 –

回答

1

兩個問題:

  • 你比較DH23知道,如果屏幕的底部達到,但是當你清除屏幕DH丟失。你應該比較BL
  • 取消該塊的定位光標的註釋。

這裏是你的代碼固定:

.model small 
.data 
st1 db "O",13,10,'$' 
.code 
main proc 
    mov AX,@data 
    mov DS,AX 

    mov BL,0 
    label1: 
    mov AH,2H 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    ADD BL,1 

    cmp BL,23   ;◄■■■ COMPARE BL, NOT DH, BECAUSE 
    jz label2   ;  YOU LOST DH WHEN CLEARED SCREEN. 
    loop label1 

    label2: 

    mov AH,2H   ;◄■■■ UNCOMMENT THIS BLOCK !!! 
    mov BH,0   ;goto-XY 
    mov DH,BL 
    mov DL,BL 
    INT 10H 

    mov AH,9H 
    mov DX,offset st1  ;print 
    INT 21H 

    mov AH, 6H 
    mov AL, 0  
    mov BH, 7   ;clear screen 
    mov CX, 0 
    mov DL, 79 
    mov DH, 24 
    int 10H 

    SUB BL,1 
    cmp BL,1   ;◄■■■ PERSONAL CHANGE : DETECT WHEN 
    jz label1  ;  CURSOR REACHES THE TOP ☻ 
    loop label2 

    mov AH,4CH 
    INT 21H 
end main 
+1

分秒,你剛纔回答幾秒鐘:-) – nopasara

+1

問題解決了。感謝您的幫助。 – Yousaf

1
mov DL, 79 
mov DH, 24  <-- here Dh = 24 
int 10H 

ADD BL,1 

cmp DH,23  <- so here condition never true 
jz label2 
+0

問題解決。感謝您的幫助 – Yousaf