Движение слова по нажатию клавиши - Assembler
Формулировка задачи:
Имеется код, нужно дописать его так, чтобы слово Внимание двигалось по нажатию клавиш W,A,S,D. Например, нажимая на клавишу W слово двигается вверх, а когда доходит до верхней части экрана останавливается, аналогично и для других клавиш, движение влево, вниз и вправо
stdin=0 stdout=1 stderr=2 data segment text1 db 'Внимание!' textlen=$-text1 time dw 10 vs db 0 tab1 db '0123456789ABCDEF' b1 db 30h b2 db 14h data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax vid0: mov ah,05h mov al,vs int 10h call video mov ah,0h int 16h cmp al,'1' je vid1 cmp al,'2' je vid3 cmp al,'3' je vid4 cmp al,'4' je vid5 cmp al,'5' je vid6 cmp al,'6' jne outg jmp vid7 outg: cmp al,'7' jne q1 jmp vid8 q1: mov ah,05h mov al,0 int 10h mov ah,4ch int 21h vid1: cmp vs,0 je vid2 mov vs,0 mov b1,30h mov b2,14h jmp vid0 vid2: mov vs,1 mov b1,0a0h mov b2,0e1h jmp vid0 vid3: mov vs,2 mov b1,0c0h mov b2,0d7h jmp vid0 vid4: mov vs,3 mov b1,0b4h mov b2,0d2h jmp vid0 vid5: mov vs,4 mov b1,0e1h mov b2,0f1h jmp vid0 vid6: mov vs,5 mov b1,0f7h mov b2,0a0h jmp vid0 vid7: mov vs,6 mov b1,0f4h mov b2,0c0h jmp vid0 vid8: mov vs,7 mov b1,0a5h mov b2,0f6h jmp vid0 ;изменим цвет экрана video: mov ah,06h ;ф-ция инициализации окна mov al,0 ;не прокручивать mov bh,b1 ;бирюзовый фон mov ch,0 ;у-левый верхний mov cl,0 ;х-левый верхний mov dh,24 ;у-правый нижний mov dl,79 ;х-правый нижний int 10h ;нарисуем пустое окно mov ah,06h mov al,0 mov bh,b2 ;синий фон красные символы mov ch,10 mov cl,30 mov dh,14 mov dl,49 int 10h ;выведем в окно2 текст mov ax,seg text1 ;подготовим сегментный регистр es mov es,ax mov ah,13h ;ф-ция вывода строки mov al,0 ;режим mov bh,vs ;страница mov bl,b2 ;атрибуты символов строки mov cx,textlen ;длина строки mov dh,12 ;y mov dl,36 ;x mov bp,offset text1 ;адрес строки int 10h ;выведем в окно1 текст ;установка курсора mov ah,02h mov bh,vs mov dh,0 mov dl,79 int 10h ;вывод номера видеостраницы mov al,vs lea bx,tab1 xlat mov bh,vs mov cx,1 mov ah,0ah int 10h ;прокрутим окно вверх updown: mov ah,06h ;ф-ция прокрутки вверх mov al,1 ;прокрутить на одну строку mov bh,b2 ;теже атрибуты mov ch,11 ;у-левый верхний mov cl,31 ;х-левый верхний mov dh,13 ;у-правый нижний mov dl,48 ;х-правый нижний int 10h call delay ;прокрутим окно вниз mov ah,07h ;ф-ция прокрутки вниз mov al,1 mov bh,b2 mov ch,11 mov cl,31 mov dh,13 mov dl,48 int 10h call delay ;анализ нажатия клавиши mov ah,01h int 16h jnz v1 jmp updown v1: ret delay: ;небольшая задержка push cx mov cx,time outer: push cx xor cx,cx inner: loop inner pop cx loop outer pop cx ret code ends stack1 segment db 128 (?) stack1 ends end start
Решение задачи: «Движение слова по нажатию клавиши»
textual
Листинг программы
stdin=0 stdout=1 stderr=2 data segment text1 db 'Warning!' textlen=$-text1 time dw 10 vs db 0 tab1 db '0123456789ABCDEF' b1 db 30h b2 db 14h PtrS dw 1000 Place db " " Attan db "ouuuuuuushit" data ends code segment assume cs:code,ds:data start: mov ax,0B800h mov es,ax @main: call saveScr call PutStr @Ink: xor ax,ax int 16h cmp al,27 je @Stop cmp ah,48h je @Up cmp ah,50h je @Down cmp ah,4bh je @Left cmp ah,4dh je @Right jmp @Ink @Up: call RestScr mov ax,PtrS sub ax,160 jl @main mov PtrS,ax jmp @main @Down: call RestScr mov ax,PtrS add ax,160 cmp ax,4000 jg @main mov PtrS,ax jmp @main @Left: call RestScr mov ax,PtrS sub ax,2 mov PtrS,ax jmp @main @Right: call RestScr mov ax,PtrS add ax,2 mov PtrS,ax jmp @main @Stop: int 20h SaveScr: push ax push cx push di push si mov cx,18 lea si,Place mov di,PtrS @0: mov al,es:[di] mov ds:[si],al inc si inc di loop @0 pop si pop di pop cx pop ax ret RestScr: push ax push cx push di push si mov cx,18 lea si,Place mov di,PtrS @1: mov al,ds:[si] mov es:[di],al inc si inc di loop @1 pop si pop di pop cx pop ax ret PutStr: push ax push cx push di push si mov cx,9 lea si,Attan mov di,PtrS @2: mov al,ds:[si] mov es:[di],al inc si inc di mov es:[di],byte ptr 3Eh inc di loop @2 pop si pop di pop cx pop ax ret end start code ends stack1 segment db 128 (?) stack1 ends