Код ::
Консультация # 200096:
Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос:
Можете еще помочь закомментировать программу. Преподаватель просит чётко ответить, что делает та или иная строка. И если чуть от формулировки в сторону идёшь валит.
JMP start srt db 'Hello, World!' start: MOV AX, 0B800h MOV ES, AX mov cx, 13 mov di, 52h XOR SI, SI c: MOV al, srt[si] mov ES:[di], al inc si add di, 2 loop c mov cx, 13 mov di, 53h mov bl, 01h b: mov es:[di], bl inc bl add di, 2 loop b HLT
Дата отправки: 15.01.2021, 09:32
Вопрос задал: Petr (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »
Консультирует Зенченко Константин Николаевич (Старший модератор):
Здравствуйте, Petr!
Код, который Вы предоставили написан "бездарно", в кавычках, т.к. он никакой. И комметировать его, нет желания.
Правильная версия Вашего кода:210119b
model tiny code org 100h begin: JMP start dbstr db 'Hello, World!' start: mov ax,83h int 10h MOV AX, 0B800h MOV ES, AX mov cx, 13 lea si,dbstr xor di,di mov ah,1 @@01: lodsb stosw inc ah loop @@01 ret end begin
Ваш код:210119а
model tiny code org 100h begin: JMP start dbsrt db 'Hello, World!' start: mov ax,83h int 10h MOV AX, 0B800h MOV ES, AX mov cx, 13 mov di,0; 52h XOR SI,SI c: MOV al, dbsrt[si]; c – метка начала цикла,копирует в операнд al операнд srt с адресом si mov ES:[di], al; копирует в операнд ES с адресом di операнд al inc si; добавляем 1 к si add di, 2; выполняют сложение loop c; переход на строку С до тех пор пока счетчик не будет равен 0 mov cx, 13; копирует в операнд сx чмсло 13 mov di,1; 53h; копирует в операнд di операнд 53h mov bl, 01h; копирует в операнд bl операнд 01h b: mov es:[di], bl; b-метка начала цикла копирует в операнд ES с адресом di операнд bl inc bl; добавляем 1 к bl add di, 2; выполняют сложение loop b; переход на строку GO (до тех пор пока счетчик не будет равен 0 ret end begin HLT конец программы
STR -
зарезервированное слово компилятором - его использовать
нельзя(одни компиляторы пропускают, но большенство -
нет)-заменено на
dbsrt
Если не видно разницы, зачаем ломать клавиатуру.
Обе версии адаптированы под TASM, т.к. Вы пишете под эмулятором(и не сказали какиим).
В обоих кодах применена прямая запись в видеобуфер DOS, т.е. адресное пространство, начиная с 0хА000:0хFFFF по 0xB000:0xFFFF принадлежит видеокарте, т.е. отображению на экране информации в разных видеорежимах.
0хВ800 : 0х0000 - это первая страница(вернее она считается нулевой) отображаемой страницей на экране текстового режима, по умолч анию 3-й.
В Вашем варианте я заменил строки типа этой
mov di,0; 52h, для наглядности картинок работы обоих программ.
8х используется., как признак, что экран чистить не нужно, это для того, чтобы было видно название запускаемых программ.
Начиная с ХР и CMD.EXE, прямая запись в видеобуфер - не возможна(т.к. вывод на экран стандартных функций DOS и BIOS эммулировался минуя видеобуфер), только когда принудительно устанавливали видеорежим, создавался видеобуфер и вывод шел через него. COMМAND.COM, его устанавливал самостоятельно, вмезависимости от ОСи(но это было до 98ME, включительно).
Итак по Вашему коду:
В коде превращаются в
8A 84 01 03 c: MOV al, dbsrt[si] 46 inc si
Эти инструкции были заменены одной
lodsb - прочитать байт и автоинкремент.
mov ES:[di], al add di, 2
В коде превращается в
26: 88 05 mov ES:[di], al 83 C7 02 add di, 2
Эти инструкции были заменены одной
stosw - запись слова и автоинкрумент на два.
Результат замены:
AC @@01: lodsb AB stosw FE C4 inc ah
Байты считайте сами(и умножаем на два, т.к. два бездарных цикла)
Эта инструкция была заменена на
inc ah, и это позволило избавиться от второго цикла(см. выше).
К примеру если ее заменить на
add ah,11hТо получим

И так, что в итоге:
AL - Код выводимого символа, всегда записывается по четным позициям сегмента, AH-аттрибут выводимого символа(фон + цвет)_ всегда записывается по не четным адресам.< br>
Удачи!
Оценить выпуск | Задать вопрос экспертам
главная страница | стать участником | получить консультацию
техническая поддержка
Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста,
оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете
оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив
наш форум, почитав
журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете
зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!
Комментариев нет:
Отправить комментарий