WMmail.ru - сервис почтовых рассылок

воскресенье, 24 января 2021 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

  
Похудеть быстро и при этом легко и красиво, возможно ли это?
  
  
  
Subscribe.ru
RFpro.ru: Ассемблер? Это просто! Учимся программировать

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
• повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
• повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 0
• повысить рейтинг »

• Assembler

Номер выпуска:1782
Дата выхода:25.01.2021, 09:45
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:87 / 25
Вопросов / ответов:1 / 1

Консультация # 200096: Здравствуйте, уважаемые эксперты! Прошу вас ответить на следующий вопрос: Можете еще помочь закомментировать программу. Преподаватель просит чётко ответить, что делает та или иная строка. И если чуть от формулировки в сторону идёшь валит.
Код ::

Консультация # 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


Если не видно разницы, зачаем ломать клавиатуру.
smile

Обе версии адаптированы под TASM, т.к. Вы пишете под эмулятором(и не сказали какиим).

В обоих кодах применена прямая запись в видеобуфер DOS, т.е. адресное пространство, начиная с 0хА000:0хFFFF по 0xB000:0xFFFF принадлежит видеокарте, т.е. отображению на экране информации в разных видеорежимах.

0хВ800 : 0х0000 - это первая страница(вернее она считается нулевой) отображаемой страницей на экране текстового режима, по умолч анию 3-й.

В Вашем варианте я заменил строки типа этой mov di,0; 52h, для наглядности картинок работы обоих программ.

mov	ax,83h 	int	10h


используется., как признак, что экран чистить не нужно, это для того, чтобы было видно название запускаемых программ.

Начиная с ХР и CMD.EXE, прямая запись в видеобуфер - не возможна(т.к. вывод на экран стандартных функций DOS и BIOS эммулировался минуя видеобуфер), только когда принудительно устанавливали видеорежим, создавался видеобуфер и вывод шел через него. COMМAND.COM, его устанавливал самостоятельно, вмезависимости от ОСи(но это было до 98ME, включительно).

Итак по Вашему коду:
c: 	MOV	al,srt[si] 	inc	si

В коде превращаются в
8A 84 01 03	c:	MOV al, dbsrt[si] 46			inc si

Эти инструкции были заменены одной lodsb - прочитать байт и автоинкремент. smile

   mov ES:[di], al     add di, 2

В коде превращается в
26: 88 05	mov ES:[di], al 83  C7 02	add di, 2

Эти инструкции были заменены одной stosw - запись слова и автоинкрумент на два. smile

Результат замены:
AC	@@01:	lodsb AB		stosw FE C4		inc	ah

Байты считайте сами(и умножаем на два, т.к. два бездарных цикла)
smile smile

inc bl

Эта инструкция была заменена на inc ah, и это позволило избавиться от второго цикла(см. выше).


К примеру если ее заменить на add ah,11h
То получим

И так, что в итоге:
AL - Код выводимого символа, всегда записывается по четным позициям сегмента, AH-аттрибут выводимого символа(фон + цвет)_ всегда записывается по не четным адресам.< br>
Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 20.01.2021, 00:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

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


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Это сообщение сформировано и выслано с помощью Sendsay.Ru

Комментариев нет:

Отправить комментарий