"Сократить" код программы - Assembler
Формулировка задачи:
Доброй ночи) Написал я тут одну программку несложную, но мысль одна засела в голове и так и хочется найти ответ на неё) Так вот, есть некая программа (код внизу естесна:3), и есть замысел её упростить(может даже это невозможно, хз), но проблема упирается в то, что я не знаю как) Была задумка с проверкой каждой ячейки массива 80х25 на наличие такого же символа, что мы и печатаем, но почему-то мне кажется что это вышло бы длиннее самого цикла и нифига не сократило(упростило) бы код (да-да, куда ещё проще). Так что вы скажете или предложите?) (Приведу так же вариант кода, который возможно мог бы быть в качестве упрощённого, но естественно он не доработан)
Работающая программа:
Программа которая не может остановиться (Ну или я мало ждал):
.MODEL small
.STACK 100h
.DATA ;
a db '*'
x db 0
y db 0
.CODE
start:
mov ax,@data
mov ds,ax
gg:
mov si,0
mov cx, 80
mov ah,02h
mov [x],1
cklgg:
mov dh,[x]
mov dl,[y]
int 10H
mov dl,a[si]
int 21h
add [y],1
loop cklgg
gg2:
mov si,0
mov cx, 80
mov ah,02h
mov [x],24
mov [y],0
cklgg2:
mov dh,[x]
mov dl,[y]
int 10H
mov dl,a[si]
int 21h
add [y],1
loop cklgg2
wp:
mov si,0
mov cx, 23
mov ah,02h
mov [x],0
mov [y],0
cklwp:
mov dh,[x]
mov dl,[y]
int 10H
mov dl,a[si]
int 21h
add [x],1
loop cklwp
wp2:
mov si,0
mov cx, 23
mov ah,02h
mov [x],0
mov [y],79
cklwp2:
mov dh,[x]
mov dl,[y]
int 10H
mov dl,a[si]
int 21h
add [x],1
loop cklwp2
End startgg: mov si,0 mov cx, 80 mov ah,02h mov [x],1 cklgg: mov dh,[x] mov dl,[y] int 10H mov dl,a[si] int 21h add [y],1 loop cklgg gg2: mov si,0 mov cx, 79 mov ah,02h mov [x],24 mov [y],0 jmp cklgg End start
Решение задачи: «"Сократить" код программы»
textual
Листинг программы
org 100h begin: mov ax,3 int 10h mov ax,0b800h mov es,ax xor di,di; mov cx,80 mov ax,1325h rep stosw mov cx,23 l_1: stosw add di,78*2 stosw loop l_1 mov cx,80 rep stosw sub di,2 mov cx,24 xor ax,ax int 16h ret
Объяснение кода листинга программы
Органзация кода:
- Переменная
axиспользуется как аккумулятор для хранения данных и результатов операций. - Переменная
cxиспользуется для хранения количества повторений операций. - Переменная
esиспользуется как сегментный регистр для доступа к памяти. - Переменная
diиспользуется как индексный регистр для доступа к памяти. Описание действий: - Код начинает выполняться с адреса 100h.
- Переменная
axустанавливается равной 3. - Выполняется команда
int 10h, которая используется для вывода символа на экран. - Переменная
axустанавливается равной 0b800h, что является сегментом кода в реальном режиме. - Переменная
esустанавливается равнойax, что позволяет использовать сегмент кода для доступа к памяти. - Переменная
diинициализируется как 0. - Переменная
cxустанавливается равной 80. - Переменная
axустанавливается равной 1325h, что является сегментом данных в реальном режиме. - Команда
rep stoswиспользуется для заполнения первых 80 байтов памяти от начала сегмента данных значением 0. - Переменная
cxустанавливается равной 23. - В цикле
l_1происходит запись значения 0 в память с использованием командыstosw, при этом переменнаяdiувеличивается на 78*2. - После завершения цикла
l_1происходит проверка на равенствоdiнулю, и если это не так, то происходит переход к шагу 11. - Переменная
cxустанавливается равной 80. - Команда
rep stoswиспользуется для заполнения последних 24 байтов памяти от начала сегмента данных значением 0. - Переменная
diуменьшается на 2. - Переменная
cxустанавливается равной 24. - Переменная
axустанавливается равной 0. - Команда
int 16hиспользуется для прерывания и возврата управления в операционную систему. - Команда
retиспользуется для возврата управления в вызывающую программу.