2017-04-24 22 views
2

我需要一些幫助才能使用emu8086在屏幕上反射字符。 屏幕尺寸是(80x25字符)。我已經設法沿對角方向移動它,但它並沒有反彈回來。相反,它在到達邊界(即第24行)後直接沿x軸移動。這是我迄今爲止所做的。如何在程序集中反彈字符

enter code here 
Data_seg segment 'data' 
char db 'A' 
char2 db ' ' 
x1 db (1) 
y1 db (1) 
Data_seg ends 

Code_seg segment 'code' 
assume CS:Code_seg,DS:Data_seg 

main PROC far 
    mov ax,Data_seg 
    mov ds,ax 


    mov cx,40 
    loop1: 
    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H 

    ;print a 
    mov al,char 
    mov dl,al 
    mov ah,02H 
    int 21H 

    ;gotoxy 
    mov ah,02 
    mov dl,x1 
    mov dh,y1 
    mov bh,0 
    int 10H  

    ;print " "  
    mov dl,char2 
    mov ah,02H 
    int 21H  

    inc x1  
    inc y1 

    ;if(x1<2)||(x1>79) 
    mov al,x1 
    cmp al,2 
    jl ifPart 
    mov al,x1 
    cmp al,79 
    jge ifPart  


    ;if(y1<2)||(y1>79) 
    y11:  
    mov al,y1 
    cmp al,2  
    jl ifPart2 

    mov al,y1 
    cmp al,24 
    jge ifPart2 ;jge for boundry(24) 

    jmp endif    
       ifPart: 
         dec x1 
         jmp y11 

       ifPart2: 
        dec y1 

       endif: 


    loop loop1 



    Code_seg ends 
end main 

回答

3

您必須在代碼中編寫彈跳算法/邏輯。此刻你的邏輯總是在[+ 1,+ 1]之後到達第24行,它將開始對它做額外的[0,-1](所以總變化是(+ 1,+ 0)),然後到達79列時它會做額外的[-1,0],所以總的變化將是(+ 0,+ 0)。

也就是說,你的代碼做了你在那裏寫的東西,代碼沒有問題。

要修復你的邏輯,首先用一些簡單的語言編寫算法(英文有幫助,當在SO處詢問時),然後將其轉換成更簡單的步驟,直到它們類似於彙編指令,將它寫爲源代碼中的註釋,並用幾條指令執行每條評論。

一開始,你可能希望有 「移動」 向量,並添加到[X1,Y1],而不是:

inc x1 
    inc y1 

(即mov al,[moveX] add [x1],al ......同樣地,對於y)。

然後當到達邊界時,否定移動矢量的那部分,所以它將從+1翻轉到-1並返回。如果您的起始位置是「內部」,則更新後檢查邊界是否正常(0 || 79觸發翻轉),如果起始位置也可以位於邊界上,則應該嘗試更新,檢測無效位置(-1 ||)。 80),翻轉矢量,取消無效更新,並進行有效更新。

+0

通過移動矢量,角色現在正在彈跳。 Theres出現輕微的問題,當它彈回時出現。它顯示了第24行最左邊一列的字符,然後彈起。 –

+0

修正:我設法通過將「cmp al,24」更改爲「cmp al,23」來解決問題(在評論中描述)。該計劃現在正在完美運作。感謝您的幫助。 –

+1

@MUHAMMADAHMEDVOHRA大約24/23 ..是不是與您的DOS輸出中斷的使用問題,使屏幕「滾動」時使用最後一行?考慮直接寫入VRAM(默認情況下,文本模式從B800:0000開始,除非您重新配置顯卡內部),速度會更快,並且可以完全控制VRAM內容,因此您可以打印全部256個VGA字符並使用所有可能的顏色/眨眼組合。最後一行沒有滾動(您必須通過代碼手動滾動,無論是通過移動VRAM內容,還是更改視頻內存的開始)。 – Ped7g

相關問題