Бегущая строка - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д