Добрый день.
Есть программа котьорая выводит на экран "Тарас", постепенно увеличивая и уменьшая надпись.
Нужно переделать код так чтобы буквы выводились с помощью макросов
Вот предположительно как должен работать макрос
http://fastpic.ru/view/1/2010/0203/d4e2 ... 9.jpg.html
Он доллжен создавать некую матрицу.
Сама программа уже неоднократно переделывалась, преподаватель давал много разных заданий, но ему не угодить. Так как это зачет мне очень нужна ваша помощь, а сессия официально уже закончилась.
Программа с использованием макросов..
Модератор: Andy
Вот непосредственно сам код программы.
.model small
.data
;закодированное изображение
txt db 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1 ,1,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,0, 0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1 ,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,1, 1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1 ,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1, 1,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1 ,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1, 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0 ,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0, 1,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,1,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ksize equ $-txt ;размер изображения
tcx dw ? ;временно хранится х
.stack 256
.code
start: mov ax,@data ;инициализируем сегментные регистры
mov ds,ax
mov ax,0a000h
mov es,ax
mov ax,0013h
int 10h ;устанавливаем видеорежим 320*240*256 цветов
mov cx,32000 ;очищаем экран
xor ax,ax
xor di,di
rep stosw
mov bx,1 ;коэффициент масштабирования
m2: call scaled_text;выволим картинку с заданным масштабом
inc bx ;увеличиваем масштаб
in al,60h ;читаем из порта клавиатуры
cmp al,1 ;если нажата ESC, то выход
jz ex
call waitp ;задержка
cmp bx,7 ;достигли максимального масштаба
jnz m2 ;если нет, продолжаем
dec bx ;корректируем масштаб
m3: mov cx,32000 ;очищаем экран
xor ax,ax
xor di,di
rep stosw
call scaled_text;выволим картинку с заданным масштабом
dec bx ;увеличиваем масштаб
in al,60h ;читаем из порта клавиатуры
cmp al,1 ;если нажата ESC, то выход
jz ex
call waitp ;ожидание
cmp bx,0 ;достигли минимального масштаба?
jnz m3 ;если нет, продолжаем
inc bx ;корректируем масштаб
jmp m2 ;начинаем сначала
ex: mov ax,4c00h ;выход из программы
int 21h
waitp: push cx ;подпрограмма задержки выполнения программы
push dx
mov dx,1000 ;Поскольку у меня не работает функция 86h int 16h(задержка)
;то будем приостанавливать программу при помощи циклов ожидания
llp1: xor cx,cx
llp: loop llp ;внутренний цикл ожидания
dec dx
jnz llp1 ;внешни цикл ожидания
pop dx
pop cx
ret
scaled_text: ;вывод в центре экрана отмасштабированой картинки. bx - масштаб
xor di,di ;счетчис столбца картинки
mov si,offset txt;начало картинки
mov ax,53 ;длина строки картинки
mul bx ;умножаем масштаб на длину строки
mov cx,320
sub cx,ax
shr cx,1 ;получаем коорд левого угла отмасштабир картинки, выводивой в центр экрана
mov tcx,cx ;сохраняем сх
mov ax,14
mul bx
mov dx,200
sub dx,ax
shr dx,1 ;получаем коорд верхнего угла отмасштабир картинки, выводивой в центр экрана
lp: cmp si,offset txt+ksize; проверяем достигли ли конца картинки
jz skip ;если достигли, то заканчиваем вывод
lodsb ;берем байт(пиксель) из картинки
inc di ;увеличиваем счетчик столбцов
call scaled_pixel;выводим отмасштабированый пиксель
add cx,bx ;переходим к следующей горизонтальной координате
cmp di,53 ;если закончиласть строка картинки
jnz m1
xor di,di ;то обнулить счетчик
mov cx,tcx ;восстановить сх
add dx,bx ;увеличикаем координату y
m1: jmp lp ;продолжаем вывод
skip: ret ;выход из подпрограммы
;подпрограмма вывода отмасштабированного пикселя
scaled_pixel:
push di ;сохраняем регистры
push si
push dx
push cx
push bx
push ax
mov si,bx ;сохраняем масштаб
mov ax,320
mul dx ;y*320
add ax,cx ;y*320+х
mov di,ax ;получили адрес верхнего левого угола квадратика
pop ax ;восстанавливаем цвет пикселя
pxlp: mov cx,si ;количество пикселей погориз=масштабу
push di ;сохраняем адрес верхнего левого угола квадратика
rep stosb ;выводим строку пикселей из квадратика
pop di ;восстанавливаем адрес верхнего левого угола квадратика
add di,320 ;переходим на следующую строку
dec bx ;уменьшаем количество оставшихся строк
jnz pxlp ;продолжаем пока не выведем все
pop bx ;восстановить регистры
pop cx
pop dx
pop si
pop di
ret ;выход
end start
.model small
.data
;закодированное изображение
txt db 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1 ,1,0,0,0,0,1,1,0,0,1,1,1,0,0,0,0,0, 0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,1 ,1,1,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0, 1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0, 0,0,0,0,0,1,1,0,0,0,0,1,1,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 0,1,1,1,1,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,0, 1,1,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0 ,1,1,0,0,0,1,1,0,0,0,0,0,1,1,0,0,1, 1,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,1 ,1,1,0,0,0,1,1,1,0,0,0,1,1,0,0,0,1, 1,0,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0
db 0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1,1 ,1,1,1,1,0,1,1,1,1,1,1,1,1,0,0,0,1, 1,1,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1
db 0,0,0,0,1,1,0,0,0,0,0,0,0,1,1,1,1,0 ,0,1,1,1,0,1,1,0,1,1,1,1,0,0,0,0,0, 1,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,1,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
ksize equ $-txt ;размер изображения
tcx dw ? ;временно хранится х
.stack 256
.code
start: mov ax,@data ;инициализируем сегментные регистры
mov ds,ax
mov ax,0a000h
mov es,ax
mov ax,0013h
int 10h ;устанавливаем видеорежим 320*240*256 цветов
mov cx,32000 ;очищаем экран
xor ax,ax
xor di,di
rep stosw
mov bx,1 ;коэффициент масштабирования
m2: call scaled_text;выволим картинку с заданным масштабом
inc bx ;увеличиваем масштаб
in al,60h ;читаем из порта клавиатуры
cmp al,1 ;если нажата ESC, то выход
jz ex
call waitp ;задержка
cmp bx,7 ;достигли максимального масштаба
jnz m2 ;если нет, продолжаем
dec bx ;корректируем масштаб
m3: mov cx,32000 ;очищаем экран
xor ax,ax
xor di,di
rep stosw
call scaled_text;выволим картинку с заданным масштабом
dec bx ;увеличиваем масштаб
in al,60h ;читаем из порта клавиатуры
cmp al,1 ;если нажата ESC, то выход
jz ex
call waitp ;ожидание
cmp bx,0 ;достигли минимального масштаба?
jnz m3 ;если нет, продолжаем
inc bx ;корректируем масштаб
jmp m2 ;начинаем сначала
ex: mov ax,4c00h ;выход из программы
int 21h
waitp: push cx ;подпрограмма задержки выполнения программы
push dx
mov dx,1000 ;Поскольку у меня не работает функция 86h int 16h(задержка)
;то будем приостанавливать программу при помощи циклов ожидания
llp1: xor cx,cx
llp: loop llp ;внутренний цикл ожидания
dec dx
jnz llp1 ;внешни цикл ожидания
pop dx
pop cx
ret
scaled_text: ;вывод в центре экрана отмасштабированой картинки. bx - масштаб
xor di,di ;счетчис столбца картинки
mov si,offset txt;начало картинки
mov ax,53 ;длина строки картинки
mul bx ;умножаем масштаб на длину строки
mov cx,320
sub cx,ax
shr cx,1 ;получаем коорд левого угла отмасштабир картинки, выводивой в центр экрана
mov tcx,cx ;сохраняем сх
mov ax,14
mul bx
mov dx,200
sub dx,ax
shr dx,1 ;получаем коорд верхнего угла отмасштабир картинки, выводивой в центр экрана
lp: cmp si,offset txt+ksize; проверяем достигли ли конца картинки
jz skip ;если достигли, то заканчиваем вывод
lodsb ;берем байт(пиксель) из картинки
inc di ;увеличиваем счетчик столбцов
call scaled_pixel;выводим отмасштабированый пиксель
add cx,bx ;переходим к следующей горизонтальной координате
cmp di,53 ;если закончиласть строка картинки
jnz m1
xor di,di ;то обнулить счетчик
mov cx,tcx ;восстановить сх
add dx,bx ;увеличикаем координату y
m1: jmp lp ;продолжаем вывод
skip: ret ;выход из подпрограммы
;подпрограмма вывода отмасштабированного пикселя
scaled_pixel:
push di ;сохраняем регистры
push si
push dx
push cx
push bx
push ax
mov si,bx ;сохраняем масштаб
mov ax,320
mul dx ;y*320
add ax,cx ;y*320+х
mov di,ax ;получили адрес верхнего левого угола квадратика
pop ax ;восстанавливаем цвет пикселя
pxlp: mov cx,si ;количество пикселей погориз=масштабу
push di ;сохраняем адрес верхнего левого угола квадратика
rep stosb ;выводим строку пикселей из квадратика
pop di ;восстанавливаем адрес верхнего левого угола квадратика
add di,320 ;переходим на следующую строку
dec bx ;уменьшаем количество оставшихся строк
jnz pxlp ;продолжаем пока не выведем все
pop bx ;восстановить регистры
pop cx
pop dx
pop si
pop di
ret ;выход
end start
Хоть ктонить может решить проблему?
Если вам будет удобнее то можно связаться по эмэйлу yourgfriend@mail.ru
Если вам будет удобнее то можно связаться по эмэйлу yourgfriend@mail.ru