Консультация № 200096
15.01.2021, 09:32
0.00 руб.
0 9 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

Обсуждение

давно
Старший Модератор
31795
6196
15.01.2021, 18:53
общий
Адресаты:
Попробуйте сами написать комеьеты, дальше будем помотреть, что не правильно.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401999
30
15.01.2021, 20:15
общий
15.01.2021, 20:16
Код:

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 конец программы
давно
Старший Модератор
31795
6196
16.01.2021, 00:00
общий
Адресаты:
Хорошо, для начала не плохо.

Правильные комменты, см. ниже
Код:
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;конец программы
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
18.01.2021, 13:32
общий
Адресаты:
Разобрались? Сдали?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401999
30
18.01.2021, 13:47
общий
Еще не сдал, разбираюсь
давно
Старший Модератор
31795
6196
19.01.2021, 12:49
общий
Адресаты:
Что получилось?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
20.01.2021, 00:48
общий
это ответ
Здравствуйте, 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, для наглядности картинок работы обоих программ.

Код:
	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 - прочитать байт и автоинкремент.

Код:
    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 bl

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


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

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

Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
20.01.2021, 21:18
общий
Адресаты:
Цитата: Зенченко Константин Николаевич
Что получилось?

Ну и?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401999
30
23.01.2021, 22:00
общий
23.01.2021, 22:01
Адресаты:
Пока ничего, один раз попробовал. Оказалось он проверяет по работе программы, шаг за шагом. От неожиданности тупанул и ничего сказать не смог, попытаюсь на следующей неделе. Работаем на emu8086 на ней всё работает. Чем проще программа, тем легче ему сдавать, но всё равно тяжело
Форма ответа