Бегущая строка - Assembler (223436)

Узнай цену своей работы

Формулировка задачи:

Прошу помощи с заданием: Составить программу для вывода на экран дисплея бегущей строки "Переферийные устройства ЭВМ" из (12,40) в (12,10). При Esc строка должна остановится на экране, при нажатии на пробел - продолжение движения, при Left Shift - выход. Пока что есть такое: строка "бежит" только при нажатии клавиш, выход осуществляется по Esc. Проблема в том, что не могу понять, как сделать так, чтобы она "бежала" сама по себе и при этом скорость её была не сумасшедшей.
.model small
.stack 256
.data
    mes db 'пpогpамма завеpшена',13,10,'$'
    text db 'Переферийные устройства ЭВМ'
    len = $ - text
.code
 
start:
    mov ax, @data
    mov ds, ax
    mov ax, 3
    int 10h
    push 0b800h
    pop es
    mov di, (80*12*2)-160; смещение текста
    mov bx,di
m1:
    mov ah, 7h; атрибуты текста 
    mov si, offset text
    mov cx, len
a1:
    lodsb
    stosw
    loop a1
 
    mov ah, 0
    int 16h
    cmp al,27
    je exit
 
    mov word ptr es:[bx],0020h  ;черный пробел
    inc bx
    inc bx
    mov di, bx
 
    jmp short m1
 
exit:
    lea dx, mes
    mov ax,3
    int 10h
    mov ah,9
    int 21h
    mov ax,4c00h
    int 21h
 
end start

Решение задачи: «Бегущая строка»

textual
Листинг программы
.model small
.386
 
.stack 255
 
.data
mes db 'GAME OVER!!!',0Ah,0Dh,'$'
text db 'Переферийные устройства ЭВМ'
len equ $-text
    
.code
start:
mov ax,@data
mov ds,ax
 
mov ah,00h
mov al,03h
int 10h
    
push 0B800h
pop es
mov di,(80*2*12)+40*2
mov cx,40-10
m1:
push cx
 
push di
 
mov ah,02h  ;атрибут текста 
lea si,text
mov cx,len
a1:
lodsb
stosw
loop a1
 
call delay
 
pop di
 
push di
 
mov al,20h 
mov cx,len
a2:
stosw
loop a2
 
pop di
 
sub di,2
 
;;;;;;;;;;;;;;;;;;;;;;;;;
push es
push ax
push bx
 
push 0040h
pop es
 
xor bh,bh
mov bl,byte ptr es:[001Ah]
 
cmp bl,byte ptr es:[001Ch]
je skip
 
mov bl,byte ptr es:[001Ch]
 
sub bx,2
mov al,byte ptr es:[bx]
 
cmp al,1Bh
jne next
 
push ax
push bx
 
push es
push si
push di
 
push 0B800h
pop es
 
lea si,text 
mov cx,len
a3:
lodsb
stosw
loop a3
 
pop di
pop si
pop es
 
resume:
mov bl,byte ptr es:[001Ch]
 
sub bx,2
mov al,byte ptr es:[bx]
 
cmp al,' '
jne resume
 
pop bx
pop ax
 
next:
mov bl,byte ptr es:[001Ah]
mov byte ptr es:[001Ch],bl
 
;push ax
;push es
 
;push 0040h
;pop es
 
;mov al,byte ptr es:[0017h]
 
;test al,00000010b
;jnz exit
 
;pop es
;pop ax
 
skip:
pop bx
pop ax
pop es
;;;;;;;;;;;;;;;;;;;;;;;;;
 
pop cx
loop m1
 
exit:
mov ah,09h
lea dx,mes
int 21h
    
mov ah,4Ch
mov al,00h
int 21h
 
delay proc
push ax
push bx
push cx
push dx
 
xor ah,ah
int 1Ah
 
mov bx,dx
add bx,10
 
time:
xor ah,ah
int 1Ah
 
cmp dx,bx
jbe time
 
pop dx
pop cx
pop bx
pop ax
 
ret
delay endp
end start

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 3.333 из 5