Автор работы: Пользователь скрыл имя, 11 Января 2011 в 19:34, лекция
Язык ассемблера - это один из самых старых из всех существующих языков программирования. Когда-то это был один из основных языков программирования, без знания которого нельзя было заставить компьютер сделать что-либо полезное. Появились более удобные средства общения с компьютером. Но в отличии от других языков ассемблер не умирал, более того он это не смог сделать в принципе.
Адресация
Для получения данных рассмотрим подробнее все виды адресации
1- Регистровая и непосредственная адресация.
При регистровой адресации МП извлекает операнд из регистра(или загружает его в регистр). MOV AX,CX
Непосредственная адресация позволяет Вам указывать 8- или 16-битовое значение константы в качестве операнда-источника. Эта константа содержится в команде., а не в регистре или в ячейке памяти.. MOV CX,500
При
таком способе адресации
Ассемблер всегда расширяет знак при пересылке непосредственных значений в операнд-приемник.
2- Прямая адресация.
При прямой адресации исполнительный адрес является составной частью команды. Обычно прямая адресация применяется, если операндом служит метка.
MOV AX, TABLE
Существует абсолютная и относительная прямая адресация.
3- Косвенная регистровая
При косвенной
регистровой адресации
Для загрузки адреса в BX используется операция OFFSET(смещение) к адресу ячейки
памяти.
MOV BX, OFFSET TABLE
MOVAX,[BX]
4- Адресация по базе.
При адресации
по базе Ассемблер вычисляет
Регистр BX удобно использовать при доступе к структурированным записям данных, расположенным в разных областях памяти. В этом случае базовый адрес помещается в базовый регистр BX и доступ к ее отдельным элементам осуществляется по их сдвигу относительно базы. MOVAX,[BX]+4 MOV AX,4[BP] MOVAX,[BP+4]
5- Прямая адресация с индексированием.
При прямой адресации
с индексированием
значений сдвига и индексного регистра (DI или SI). Этот тип адресации удобен для доступа
к элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный элемент к
элементам таблицы, когда сдвиг указывает на начало таблицы, а индексный регистр - на ее
элемент.
MOV DI,2
MOV AL,B_TABLE[DI]
Загрузится 3-й элемент таблицы.
6- Адресация по базе с индексированием
При адресации
по базе с индексированием
значений базового регистра, индексного регистра и, возможно, сдвига.
В этом режиме адресации складывается два отдельных смещения, то он удобен при
адресации двумерных массивов, когда базовый регистр содержит начальный адрес массива,
а значение сдвига и индексного регистра суть смещения по строке и столбцу.
MOV AX,SMECH[BX][DI]
Начальный адрес в BX, в DI сдвиг блока(номер строки), а SMECH - сдвиг
Примеры:
MOVAX,[BX+2+DI]
MOVAX,[DI+BX+2}
MOVAX,[BX+2][DI]
MOVAX,[BX][DI+2]
Псевдооператор определения сегмента
Для работы с данными необходимо уметь определять сегменты и данные в них. Пример определения сегмента данных:
DATASEG SEGMENT PARA PUBLIC DATA
ADB?
В DB 10,20,30,40
CDW
DATASEG ENDS
где DATASEG - имя сегмента данных или адрес начала сегмента данных
SEGMENT - псевдооператор определения сегмента
Формат псеводооператора следующий
имя_сег SEGMENT [тип подгонки] [тип_связи] ['класс'] [ тип размера памяти]
имя_сег ENDS
[тип подгонки] - сообщает компоновщику о том, что нужно обеспечить размещение начала сегмента на заданной границе. Это важно, т.к. при правильном выравнивании доступ к данным в процессорах i80x86 выполняется быстрее. Допустимы следующие значения:
[тип_связи] (Атрибут комбинирования сегментов) - сообщает компоновщику, как нужно комбинировать сегменты различных модулей, имеющие одно и то же имя. По умолчанию атрибут комбинирования сегмента принимает значение PRIVATE. Значения атрибутов могут быть:
STACK - определение сегмента стека. Заставляет компоновщик соединять все одноименные сегменты и вычислять адреса в этих сегментах относительно регистра ss. Регистр sp устанавливается на конец объединенного сегмента стека. Если сегмент стека создан, а комбинированный тип STACK не используется, программист должен явно загрузить в регистр ss адрес сегмента (подобно регистру ds)
['класс'] - это заключенная в кавычки строка, помогающая компоновщику определить соответствующий порядок следования сегментов при сборке программы из сегментов нескольких модулей. Компоновщик объединяет вместе в памяти все сегменты с одним и тем же именем класса.
[ тип размера памяти] - Для процессоров i80386 и выше сегменты могут быть 16- или 32-разрядными. Это влияет прежде всего на размер сегмента и порядок формирования физического адреса.
Существуют упрощенные
директивы определения
.CODE [ИМЯ] - начало сегмента кода
.DATA - начало сегмента данных
.CONST - начало и продолжение сегмента постоянных данных.
.DATA? - начало и продолжение сегмента неинициализированных данных.
.STACK - начало и продолжение сегмента стека модуля
Псевдооператоры DB, DW, DD
DB - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует один или несколько байт.
Формат:
[имя] DB выражение[,…]
DW - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует двухбайтовые слова.
Формат:
[имя] DW выражение[,…]
DD - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует четырехбайтовые слова.
Формат:
[имя] DD выражение[,…]
DF - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует шестибайтовые слова.
Формат:
[имя] DF выражение[,…]
DP - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует шестибайтовые слова.
Формат:
[имя] DP выражение[,…]
DQ - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует восьмибайтовые слова.
Формат:
[имя] DQ выражение[,…]
DT - определяет переменную или присваивает ячейке памяти начальное значение. Резервирует десятибайтовые слова.
Формат:
[имя] DT выражение[,…]
Пример:
.DATA
ADB 10
В DB 10 DUP (?)
С DB 4 DUP (0)
DDW?
.CODE
MOV @AX, @DATA
MOVDS,AX
MOV AX, OFFSET A
Лекция 4. Команды пересылки данных
Эти команды осуществляют обмен данными и адресами между регистрами и ячейками памяти или портами ввода-вывода.
К этой группе относятся следующие команды:
MOV<операнд-приемник>,<
Существуют ограничения на использования данной команды:
mov es,ax
• нельзя использовать сегментный регистр cs в качестве операнда-приемника. Это объясняется тем, что в паре регистров cs:ip всегда содержится адрес команды, которая должна выполняться следующей. Изменение данного регистра означает фактически операцию перехода, а не команду пересылки.
Для организации работы со стеком используются следующие команды.
Стек - память организованная по принципу «первым пришел последним ушел». Чаще всего стек используется при вызовах процедуры при использовании команды CALL. В этом случае адрес возврата, который извлекается после выполнения процедуры.
Стек имеет следующую структуру. Адрес стека находится в указателе стека sp. Адрес, который содержится в sp называется вершиной стека. Стек «растет» по направлению к младшим адресам (к ячейке 0), т.е. первое слово помещенное в стек имеет наибольший адрес, следующее на 2 байта ниже. Если нам необходимо получить доступ к элементам не на вершине, а внутри стека, то в этом случае необходимо использовать регистр ebp- это регистр указателя базы кадра стека, где можно записать необходимый адрес стека.