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

ID: 259041

Алексеев Владимир Николаевич

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

318

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

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

Советник

269

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


ID: 400669

epimkin

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

256


ID: 137394

Megaloman

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

123

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


ID: 405239

al4293189

1-й класс

91


ID: 325460

CradleA

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

66

Беларусь, Минск


ID: 401888

puporev

Профессор

49

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


8.9.8

01.08.2021

JS: 2.9.16
CSS: 4.5.14
jQuery: 3.6.0
DataForLocalStorage: 2021-08-02 12:16:01-standard


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

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

Консультация онлайн # 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
Мини-форум консультации # 200096

q_id

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

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

ID: 31795

1

= общий =    15.01.2021, 18:53
Petr:

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

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

q_id

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 (Посетитель)

q_id

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

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

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

q_id

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

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

ID: 31795

4

= общий =    18.01.2021, 13:32
Petr:

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

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

q_id

Petr

Посетитель

ID: 401999

5

= общий =    18.01.2021, 13:47

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

q_id

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

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

ID: 31795

6

= общий =    19.01.2021, 12:49
Petr:

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

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

q_id

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

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

ID: 31795

7

= общий =    20.01.2021, 21:18
Petr:

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


Ну и?

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

q_id

Petr

Посетитель

ID: 401999

8

= общий =    23.01.2021, 22:00
Зенченко Константин Николаевич:

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

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

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

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

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

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

Рейтинг: 88

Коцюрбенко Алексей Владимирович

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

Рейтинг: 0

Лысков Игорь Витальевич

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

Рейтинг: 0

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0

Kdsfofwe21

2-й класс

Рейтинг: 0