Квадрат, движущийся по нажатию кнопок - Assembler
Формулировка задачи:
assume cs:mycode,ds:mydate,ss:mystack mycode segment para start: mov ax, seg mydate mov ds,ax begin: mov AX,00h mov AL,10h int 10h rgr: mov SI,300 mov DX,110 mov CX,10 call vertical mov SI,301 mov DX,110 mov CX,10 call vertical mov SI,302 mov DX,110 mov CX,10 call vertical mov SI,303 mov DX,110 mov CX,10 call vertical mov SI,304 mov DX,110 mov CX,10 call vertical mov SI,305 mov DX,110 mov CX,10 call vertical ........ еще помогите вывести циклом key: mov ah,8 int 21h cmp al,1bh jz exit cmp al,0 jnz key int 21h cmp al,4bh jz left cmp al,48h jnz key left: ................ ................. ............. exit: mov AX,4C00h int 21h vertical proc v: push CX mov AH,0Ch mov AL,6 mov BH,0 mov CX,SI int 10h inc DX pop CX loop v ret vertical endp mycode ends mydate segment para mydate ends mystack segment para stack 'stack' dw 128 dup (0) mystack ends end start end begin
Решение задачи: «Квадрат, движущийся по нажатию кнопок»
.model small .stack 100h .data ;коды, возвращаемые int 16h ah=00h kbArrowUp equ 4800h kbArrowDown equ 5000h kbArrowLeft equ 4B00h kbArrowRight equ 4D00h kbEsc equ 011Bh ;коды цветов символов и точек в графическом режиме Red equ 4 Gray equ 7 Blue equ 1 White equ 15 Mode0D_W equ 320 ;ширина экрана в пикселях для видеорежима 0Dh Mode0D_H equ 200 ;высота экрана в пикселях для видеорежима 0Dh Mode0D_C equ 16 ;количество цветов для видеорежима 0Dh Mode0D_A equ 0A000h ;начальный адрес видеопамяти для видеорежима 0Dh VideoPage db ? ;номер видеостраницы Xstart dw 100 ;координаты начала прямоугольника Ystart dw 70 ; Xcurr dw ? ;текущие координаты левого верхнего угла строки ; Ycurr dw ? sqColor dw 1 ;цвет выводимого прямоугольника sqWidth dw 37 ;ширина прямоугольника sqHeight dw 37 ;высота прямоугольника ;макрос для упрощения вызова процедур с параметрами invoke macro CallProc, Params IRP P, <Params> mov ax, P push ax endm call CallProc endm .code main proc mov ax, @data mov ds, ax ; установка графического видео режима mov ax, 000Dh int 10h mov ah, 0Fh ;уточнение параметров видеорежима int 10h mov [VideoPage], bh invoke Bar, <[sqHeight], [sqWidth], [Ystart], [Xstart], [sqColor]> @@GetCmd: ;ожидание нажатия любой клавиши mov ah, 00h int 16h ;обработка команды @@TestCmd1: cmp ax, kbArrowUp jne @@TestCmd2 mov dx, [Ystart] cmp dx, 0 je @@GetCmd dec dx mov cx, [Xstart] jmp @@Redraw @@TestCmd2: cmp ax, kbArrowDown jne @@TestCmd3 mov dx, [Ystart] add dx, [sqWidth] cmp dx, Mode0D_H jae @@GetCmd mov dx, [Ystart] inc dx mov cx, [Xstart] jmp @@Redraw @@TestCmd3: cmp ax, kbArrowLeft jne @@TestCmd4 mov cx, [Xstart] cmp cx, 0 je @@GetCmd dec cx mov dx, [Ystart] jmp @@Redraw @@TestCmd4: cmp ax, kbArrowRight jne @@TestCmd5 mov cx, [Xstart] add cx, [sqWidth] cmp cx, Mode0D_W jae @@GetCmd mov cx, [Xstart] inc cx mov dx, [Ystart] jmp @@Redraw @@TestCmd5: cmp ax, kbEsc jne @@GetCmd jmp @@StopCmdLoop @@Redraw: invoke Bar, <[sqHeight], [sqWidth], [Ystart], [Xstart], 0> mov ax, [sqColor] inc ax ;Color++ cmp ax, Mode0D_C ;if (Color>MaxColor) sbb bx, bx ; Color=1 and ax, bx cmp ax, 1 adc ax, 0 mov [sqColor], ax mov [Xstart], cx mov [Ystart], dx invoke Bar, <[sqHeight], [sqWidth], dx, cx, [sqColor]> jmp @@GetCmd @@StopCmdLoop: ;переключение в текстовый режим mov ax, 0003h int 10h ;завершение программы mov ax, 4C00h int 21h main endp ;рисование полосы (залитого прямоугольника) ;на входе: ; color - цвет заливки ; x_pos, y_pos - координаты левого верхнего угла ; x_size, y_size - размеры прямоугольника ;на выходе: ; - Bar proc color: word, x_pos:word, y_pos: word, x_size: word, y_size: word push bp ;формирование кадра параметров mov bp, sp push ax ;сохранение регистров push bx push cx push dx push si push di mov ah, 0Ch ; настройка параметров для вызова функции 0Ch mov al, byte ptr color ;цвет точек mov bh, 0 ;номер видеостраницы mov dx, y_pos ;строка mov cx, x_pos ;колонка mov di, y_size @@Vertical: mov cx, x_pos ;колонка mov si, x_size ;вывести x_size точек в горизонтальной линии @@Horizontal: int 10h ;вывести точку inc cx ;прирастить координату x dec si jnz @@Horizontal inc dx ;переход к следующей горизонтальной линии с dec di jnz @@Vertical pop di ;восстановление рагистров pop si pop dx pop cx pop bx pop ax pop bp ret 10 ;удаление параметров из стека Bar endp end main
Объяснение кода листинга программы
Квадрат, движущийся по нажатию кнопок .model small .stack 100h .data kbArrowUp equ 4800h kbArrowDown equ 5000h kbArrowLeft equ 4B00h kbArrowRight equ 4D00h kbEsc equ 011Bh Red equ 4 Gray equ 7 Blue equ 1 White equ 15 Mode0D_W equ 320 Mode0D_H equ 200 Mode0D_C equ 16 Mode0D_A equ 0A000h Xstart equ 100 Ystart equ 70 SquareColor equ 1 SquareWidth equ 37 SquareHeight equ 37 .code main: mov ax, @data mov ds, ax mov ax, 000Dh int 10h mov bh, [VideoPage] invoke Bar, <[SquareHeight], [SquareWidth], [Ystart], [Xstart], [SquareColor]> @@GetCmd: mov ah, 00h int 16h @@TestCmd1: cmp ax, kbArrowUp jne @@TestCmd2 mov dx, [Ystart] cmp dx, 0 je @@GetCmd dec dx mov cx, [Xstart] jmp @@Redraw @@TestCmd2: cmp ax, kbArrowDown jne @@TestCmd3 mov dx, [Ystart] add dx, [SquareWidth] cmp dx, [Mode0D_H] jae @@GetCmd inc dx mov cx, [Xstart] jmp @@Redraw @@TestCmd3: cmp ax, kbArrowLeft jne @@TestCmd4 mov cx, [Xstart] cmp cx, 0 je @@GetCmd dec cx mov dx, [Ystart] jmp @@Redraw @@TestCmd4: cmp ax, kbArrowRight jne @@TestCmd5 mov cx, [Xstart] add cx, [SquareWidth] cmp cx, [Mode0D_W] jae @@GetCmd inc cx mov dx, [Ystart] jmp @@Redraw @@TestCmd5: cmp ax, kbEsc jne @@GetCmd jmp @@StopCmdLoop @@Redraw: invoke Bar, <[SquareHeight], [SquareWidth], dx, cx, [SquareColor]> mov ax, [SquareColor] inc ax cmp ax, [Mode0D_C] sbb bx, bx and ax, bx mov [SquareColor], ax mov [Xstart], cx mov [Ystart], dx invoke Bar, <[SquareHeight], [SquareWidth], dx, cx, [SquareColor]> @@StopCmdLoop: mov ax, 0003h int 10h mov ax, 4C00h int 21h end main