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