- •Оглавление
- •Вопрос №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
Вопрос №32
Безусловные переходы.
Синтаксис команды безусловного перехода без сохранения информации о точке возврата:
jmp [модификатор] адрес_перехода.
Команды перехода модифицируют регистр указателя команды EIP/IP и, возможно, сегментный регистр кода CS.
Здесь адрес_перехода представляет метку или адрес области памяти, в которой находится указатель перехода.
Существует несколько вариантов записи команды imp. Их различие определяется дальность перехода и способом задания адреса перехода (текущий или другой сегмент):
внутрисегментный переход или близкий
межсегментный или дальний
Можно выделить три варианта внутрисегментного использования команды JMP:
Прямой короткий внутрисегментный переход.
применяется, когда расстояние от команды JMP до адреса перехода не превышает -128 или +127 байт.
Прямой внутрисегментный переход.
отличается от прямого короткого внутри сегментного перехода тем, что длина машинной команды JMP в этом случае составляет три байта.
Увеличение длины связано с тем, что поле адреса перехода в машинной команде JMP расширяется до двух байтов, а это, в свою очередь, позволяет
производить переходы в пределах 64 Кбайт относительно следующей за JMP команды:
Косвенный внутрисегментный переход
в команде указывается не сам адрес перехода, а место, где он ≪лежит≫.
Межсегментные переходы
прямой межсегментный переход
косвенный межсегментный переход
в качестве операнда имеет адрес области памяти, в которой содержатся смещение и сегментная часть целевого адреса перехода. Адрес перехода указан косвенно в регистре
Вопрос №33
Процедуры.
В ассемблере есть несколько средств, чтобы решить проблемы дублирования.
1. процедуры
2. макроподстановки
3. генерация и обработка программных прерываний
Процедуру можно определить как оформленную совокупность команд, которая будучи однократно описана при необходимости может быть вызвана в любом месте программы.
Proc.endp
Заголовок процедуры:
Имя процедуры Proc[расстояние]
[ARGсписок аргументов]
[RETURN– список элементов]
Тело процедуры:
…………………..
Команды
Директивы ассемблера
Конец процедуры
…………………..
[имя процедуры] ENDP
Имя процедуры является обязательным. Атрибут расстояния может применять значения nearилиfarи характеризует возможность обращения к процедуре из другого сегмента кода. Очень важен вопрос размещения процедуры в программе:
в начале программы до первой исполняется команда
в конце программы после команды, возвращающей управление операционной системе
в другом модуле (библиотеке)
Размещение в начале сегмента. Последовательность команд, ограниченных парой procиendsбудет размещаться до метки, обозначающей команду с которой начинается программа.
Model small
.stack 100h
.data
.code
my.proc PROC near
………………………
Ret
my_proc ENDS
start:
………………………
………………………
Endstart
Размещение процедуры в конце программы предполагает, что последовательность команд между PROCиENDSнаходящихся за командой, возвращающей управление ОС:
Model small
.stack100h
.data
.code
Start:
……………
……………
movax4c00h
int21h; возврат управления ОС
my.proc PROC
……………
Ret
my. Proc ENDP
end start.
Вариант расположения процедуры в отдельных сегментах кода предполагает, что часто используемые процедуры выносятся в отдельный файл, который должен быть оформлен как обычный исходный файл и оттранслирован для получения объектного кода.
При вызове процедуры важен контекст программы. Под контекстом понимается информация о состоянии программы в точке вызова процедуры. Для работы с контекстом используют программы CALLиRET.
CALLосуществляет вызов процедуры
CALL[модификатор] имя процедуры
CALLпередает управление по адресу – имя процедуры. При этом в стеке сохраняется адрес возврата, т.е. адрес команды, следующей заCALL. Модификатор определяет организацию ближних и дальних переходов.
Межсегментный вызов far– процедура находится в другом сегменте кода.
Процедура не может быть одновременно ближнего и дальнего типа.
RET[число] считывает адрес возврата из стека и загружает его в регистрCSиIP/EIP, тем самым возвращая управление на команду, следующую заCALL.
[число] – обозначает количество элементов, удаляемых из стека при возврате процедуры.