Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


В избранное