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