2016-11-07 9 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, так как нижний предел оси у моего экрана 23. Если нижняя предел экрана достигнут, он должен перейти к 'label2', но он не перескакивает на 'label2', что очевидно из-за того, что я не правильно использую оператор cmp. Может ли кто-нибудь помочь мне решить эту проблему?

Главное, что я хочу помочь, - какое условие я должен проверить в 'label1', чтобы перейти к 'label2'.

PS. Просто новичок на ассемблере, поэтому, если вы предлагаете решение, пожалуйста, держите его простым и понятным. Вот что я пробовал до сих пор.

+1

Какую версию сборки вы используете? –

+0

Я не уверен, что вы подразумеваете под версией сборки. Можете ли вы уточнить? – Yousaf

+0

Существует множество различных версий языка ассемблера в зависимости от вашей архитектуры. Один из самых популярных ассемблеров в nasm. –

ответ

1

Две проблемы:

  • Вы сравниваете DH с 23 знать, если была достигнута нижняя часть экрана, но 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