Родились сегодня:
Евгений [eXill@nD] Малясёв
AlexLevin


Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Модератор

1127

Россия, Северодвинск


ID: 165461

Лангваген Сергей Евгеньевич

Советник

676

Россия, Московская обл.


ID: 401284

Михаил Александров

Академик

576

Россия, Санкт-Петербург


ID: 398750

Елена Васильевна

Специалист

402

Беларусь, Гомель


ID: 137394

Megaloman

Мастер-Эксперт

196

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

186


ID: 401888

puporev

Профессор

133

Россия, Пермский край


8.2.3

26.02.2021

JS: 2.3.1
CSS: 4.3.14
jQuery: 3.5.1


 

• Assembler

Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Коцюрбенко Алексей Владимирович
Статус: Старший модератор
Рейтинг: 435
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 268
Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
 

Перейти к консультации №:
 

Консультация онлайн # 200096
Раздел: • Assembler
Автор вопроса: Petr (Посетитель)
Дата: 15.01.2021, 09:32
Поступило ответов: 1

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

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

Состояние: Консультация закрыта

Здравствуйте, 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-аттрибут выводимого символа(фон + цвет)_ всегда записывается по не четным адресам.

Удачи!


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

Рейтинг ответа:

0

[подробно]

Сообщение
модераторам

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

Мини-форум консультации № 200096

Зенченко Константин Николаевич

Старший модератор

ID: 31795

1

= общий = |  15.01.2021, 18:53 |  цитировать |  профиль |  личное сообщение
Petr:

Попробуйте сами написать комеьеты, дальше будем помотреть, что не правильно.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Petr

Посетитель

ID: 401999

2

= общий = |  15.01.2021, 20:15 |  цитировать |  профиль |  личное сообщение

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]       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, 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

HLT                            конец программы

Последнее редактирование 15.01.2021, 20:16 Petr (Посетитель)

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий = |  16.01.2021, 00:00 |  цитировать |  профиль |  личное сообщение
Petr:

Хорошо, для начала не плохо.

Правильные комменты, см. ниже

JMP     start;резервируем память для данных
srt	db	'Hello, World!';выводимая строка
start:;начало программы
;0B800h - сегментный адрес текстового режима, каждая позиция кратная 2-м: <символ>(байт) + <атрибут>(байт)=0<FON>(3 bit)+<color>(4 bit) 
MOV	AX,0B800h;будем выводить информацию, прямой записью в видеобуфер
MOV	ES,AX;устанавливаем сегментный регистр
;Устанавливаем параметры вывода символов
mov	cx,13;кол-во выводимых символов
mov	di,52h;52/2 позиция вывода: 26-ой столбец первой строки
XOR	SI,SI;позиция в выводимой строке
;читаем выводимый символ с srt+si
c: 	MOV	al,srt[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,53h;копирует в операнд di  операнд 53h
;аттрибут 0<000(фон черный)><0001(цвет синий)>
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
;остановка программы
HLT;конец программы

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

4

= общий = |  18.01.2021, 13:32 |  цитировать |  профиль |  личное сообщение
Petr:

Разобрались? Сдали?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Petr

Посетитель

ID: 401999

5

= общий = |  18.01.2021, 13:47 |  цитировать |  профиль |  личное сообщение

Еще не сдал, разбираюсь

Зенченко Константин Николаевич

Старший модератор

ID: 31795

6

= общий = |  19.01.2021, 12:49 |  цитировать |  профиль |  личное сообщение
Petr:

Что получилось?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Зенченко Константин Николаевич

Старший модератор

ID: 31795

7

= общий = |  20.01.2021, 21:18 |  цитировать |  профиль |  личное сообщение
Petr:

Что получилось?

Зенченко Константин Николаевич

Ну и?

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Petr

Посетитель

ID: 401999

8

= общий = |  23.01.2021, 22:00 |  цитировать |  профиль |  личное сообщение
Зенченко Константин Николаевич:

Пока ничего, один раз попробовал. Оказалось он проверяет по работе программы, шаг за шагом. От неожиданности тупанул и ничего сказать не смог, попытаюсь на следующей неделе. Работаем на emu8086 на ней всё работает. Чем проще программа, тем легче ему сдавать, но всё равно тяжело

Последнее редактирование 23.01.2021, 22:01 Petr (Посетитель)

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.