- •Оглавление
- •Вопрос №3
- •Вопрос №4
- •Вопрос №5
- •Вопрос №6 Системы исчисления
- •Вопрос №7
- •Вопрос №8
- •Вопрос №9
- •Вопрос №10
- •Вопрос №11
- •Вопрос №12
- •Вопрос №13
- •Вопрос №14
- •Вопрос №15
- •Вопрос №16
- •Вопрос №17
- •Вопрос №18
- •Вопрос №19
- •Вопрос №20
- •Вопрос 21
- •Вопрос 22
- •Вопрос 23
- •Вопрос №24
- •Вопрос № 25
- •Вопрос № 26
- •Вопрос №27
- •Вопрос №28
- •1. Команда пересылки данных.
- •Вопрос №29
- •Вопрос №30
- •Вопрос №31
- •Вопрос №32
- •Вопрос №33
- •Вопрос №33(Краткая версия)
- •1) Команда вызова процедуры.
- •2) Команда возврата управления.
- •Вопросы №34
- •Вопросы №35
- •Вопрос №36
- •1) Команда организации цикла.
- •2) Команда перехода по обнуленному счетчику.
- •3) Команды организации цикла с условием.
- •Вопрос №37
- •Вопросы №38
- •Вопрос №39
- •Вопрос №40
2) Команда перехода по обнуленному счетчику.
JCXZ <адрес перехода>
передает управление по указанному адресу, если содержимое регистра cx равно 0. Например:
mov cx, loop_count ; загрузка счетчика
jcxz end_of_loop ; проверка счетчика
begin_loop:
; ... тело цикла ...
loop begin_loop
end_of_loop: ...
3) Команды организации цикла с условием.
LООРE <адрес перехода>
LOOPNE <адрес перехода>
уменьшают содержимое на единицу и передают управление по указанному адресу при условии, что содержимое cx отлично от нуля, но LООРE дополнительно требует наличия признака "равно", а LOOPNE - ''не равно", формируемых командами сравнения. Например:
mov cx, loop_count ; загрузка счетчика
jcxz end_of_loop ; проверка счетчика
begin_loop:
; ... тело цикла ...
cmp al, 100 ; проверка содержимого al
loopnebegin_loop; возврат в цикл, еслиcx0 и al100
end_of_loop: ...
Вопрос №37
Два регистра используются для поддержки так называемых цепочечных операций
esi/si — индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике.
edi/di — индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
Это команды обработки строк символов
Цепочечные команды позволят производить действия над блоками памяти, представляют собой последовательность элементов размером 8, 16, 32 бита.
Существует следующие операции обработки цепочек:
пересылка цепочки:
movs адрес_приемника,адрес_источника
сравнение цепочек:
cmps адрес_приемника,адрес_источника
сканирование цепочки:
scas адрес_приемника
загрузка элемента из цепочки:
lods адрес_источника
сохранение элемента в цепочке:
stos адрес_приемника
получение элементов цепочки из порта ввода-вывода:
ins адрес_приемника,номер_порта
вывод элементов цепочки в порт ввода-вывода:
outs номер_порта,адрес_источника
пересылка цепочки:
movs адрес_приемника,адрес_источника movsb movsw movsd
MOVS может работать с цепочками любого размера. При трансляции команда movs преобразуется в одну из трех movsB, movsW, movsD.
Команда movs пересылает только 1 элемент исходя из его типа и модифицированного значения регистров ESI,EDI.
Перечислим последовательность действий, которые нужно выполнить в программе для того, чтобы переслать
цепочку элементов из одной области памяти в другую с помощью команды MOVS:
Установить значение флага DF в зависимости от того, в каком направлении будут обрабатываться элементы цепочки — в направлении возрастания или убывания адресов.
Загрузить указатели на адреса цепочек в памяти в пары регистров DS, ES:DI
Загрузить в регистр ЕСХ/СХ количество обрабатываемых элементов.
Выдать команду MOVS с префиксом REP.
REP используется с командами пересылки и сохранения элементов. REP заставляет данные команды, пока содержимое ECX/CX не станет равно 0.
Вопросы №38
Массив — структурированный тип данных, состоящий из некоторого числа элементов одного типа.
Чтобы использовать массив в программе, его нужно смоделировать одним из перечисленных далее способов:
Можно перечислить элементы массива в поле операндов одной из директив описания данных.
mas dd 1,2,3,4,5
Можно использовать оператор повторения DUP.
mas dw 5 dup (0)
Можно использовать директивы LABEL и REPT.
Директива REPT относится к макросредствам языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой ENDM.
В результате в памяти будет создана последовательность из четырех слов fl f0.
Эту последовательность можно трактовать как массив байтов или слов в зависимости от того, какое имя области мы будем использовать в программе — mas_b или mas_w.
Чтобы инициализировать значениями область памяти и впоследствии трактовать ее как массив, можно использовать цикл.