- •Практическая работа № 8.
- •2) Lds и les (Load ds и Load es) — команды загрузки адреса, состоящего из двух слов, в пару регистров (сегментный регистр и, чаще всего, базовый).
- •Организация циклов.
- •Inc al ; в регистре al организуем счетчик нулевых элементов
- •Inc si ; увеличиваем si на 1, для перехода к след. Элементу mas
- •Команды, организующие циклы
- •Доступ к элементам массива
- •Inc cx ; добавляем 1 к cx (!)
- •Варианты заданий
- •Осторожно ошибки!
- •Int 21h ; вызов dos
- •Контрольные вопросы:
2) Lds и les (Load ds и Load es) — команды загрузки адреса, состоящего из двух слов, в пару регистров (сегментный регистр и, чаще всего, базовый).
LDS регистр, переменная (двойное слово)
LES регистр, переменная (двойное слово)
Младшее слово, находящееся в переменной, загружается в регистр (1-ый операнд), старшее слово — в сегментный регистр DS (если LDS) и ES (если LES).
ПРИМЕР
t1 dd 565A0053h ; дальний адрес
……………..
LDS bx, t1 ; в DS запишется сегментный адрес 565Ah
; а в BX — 0053h
LES bp, t1 ; аналогично, только номер сегмента — в ES,
; а смещение в BP
jmp FAR DS:[BX] ; при этом будет происходить переход в другой
jmp FAR ES:[BP] ; сегмент кода.
Таким образом, команды пересылки адреса LES и LDS позволяют организовать переход в другой сегмент по заранее заготовленному адресу. То есть заранее в памяти в переменной t1 каким-то образом формируют два слова: номер сегмента и смещение, а затем их засылают, например, с помощью команды LDS в DS и в BX. Это дает возможность адресоваться к другому сегменту.
Команды LDS и LES часто используются в системном программировании, когда пишутся собственные обработчики прерываний, и нужно переходить между сегментом кода своей программы и сегментом кода стандартных обработчиков.
Для того чтобы обрабатывать массив в ассемблере, нужно знать, где он хранится (его начальный адрес), и длину его элемента. Как и в языке C/C++, имя массива в ассемблере является и его начальным адресом.
Архитектура CPU предоставляет достаточно удобные программно-аппаратные средства для работы с массивами. К ним относятся базовые и индексные регистры, позволяющие реализовывать несколько режимов адресации данных. Используя базовый, индексный, базово-индексный и базово-индексный со смещением режимы адресации можно организовать эффективную работу с массивами в памяти.
Например, индексный режим адресации вида имя_массива [регистр_индекса] позволяет обрабатывать каждый элемент массива, изменяя значение индексного регистра SI, DI.
При необходимости использования массива в программе его описывают одним из следующих способов:
Перечислением элементов массива в поле операндов одной из директив описания данных. При перечислении элементы разделяются запятыми.
Например:
; массив из 4-х элементов. Размер каждого элемента – машинное слово
mas dw 0d50h, 77FFh, 5080h, 0ah
2. Используя оператор повторения dup. Его используют обычно для резервирования памяти с целью размещения и инициализации элементов массива.
Например:
;массив из 25 букв "а"
mas db 25 dup ("a")
3. Используя директивы label и rept. Директива rept относится к макросредставм языка ассемблера и вызывает повторение указанное число раз строк, заключенных между директивой и строкой endm. Достоинство директивы label в том, что она не резервирует память, а лишь определяет характеристики ячейки памяти. Использование нескольких директив label, записанных одна за другой, дает возможность присвоить одной и той же области памяти разные имена и типы.
Например:
mas1 label byte
mas2 label word
rept 8
db 0Ch
endm
В результате в памяти будет создана последовательность из 8 байт 0Ch. Эту последовательность можно трактовать как массив байт с именем mas1 или как массив слов с именем mas2.
4. Использованием цикла для инициализации значениями области памяти, которую можно будет впоследствии трактовать как массив.
Например:
mas dw 10 dup (?)
