
- •Структура компиляторов. Общая схема работы компилятора.
- •Порядок обработки программ: Компиляция или ассемблирование, компоновка, отладка. Средства обработки программ: редакторы, компиляторы, ассемблеры, отладчики.
- •Основные функции библиотек программ и их составы.
- •Команды пересылки, сравнения и сдвига денных в ассемблерных программах.
- •Арифметические команды в ассемблерных программах; разновидности и примеры команд.
- •Команды передачи управления в ассемблерных программах: условные и безусловные переходы, циклы.
- •Загрузчики. Основные функции загрузчика.
-
Команды пересылки, сравнения и сдвига денных в ассемблерных программах.
Команды пересылки данных, MOV — пересылка данных
Команда MOV замещает первый операнд (приемник) вторым (источником). При этом исходное значение первого операнда теряется. В зависимости от описания операндов пересылается слово или байт. Если операнды описаны по-разному или режим адресации не позволяет однозначно определить размер операнда, для уточнения размера передаваемых данных в команду следует включить один из атрибутных операторов byte ptr или word ptr. В зависимости от использованных режимов адресации команда MOV может осуществлять пересылки следующих видов:
из регистра общего назначения в регистр общего назначения;
из ячейки памяти в регистр общего назначения;
из регистра общего назначения в ячейку памяти;
непосредственный операнд в регистр общего назначения;
непосредственный операнд в ячейку памяти;
из регистра общего назначения в сегментные регистры DS, ES;SS;
из сегментного регистра в регистр общего назначения;
из сегментного регистра в ячейку памяти.
Запрещены пересылки из ячейки памяти в ячейку памяти (для этого предусмотрена команда MOVS), а также загрузка сегментного регистра непосредственным значением, которое, таким образом, приходится загружать через регистр общего назначения:
mov AX, seg mem ; Сегментный адрес ячейки mem mov DS, АХ ;3агрузка его в регистр DS Нельзя также непосредственно переслать содержимое одного сегментного регистра в другой. Такого рода операции удобно выполнять с использованием стека: push DS ;
pop ES ;Содержимое DS копируется в ES
пример:
mov BX, ES ;Из сегментного регистра в регистр
mov SS, [SI] ;Из памяти в сегментный регистр
XCHG - Обмен данными между операндами
Команда XCHG пересылает значение первого операнда во второй, а второго - в первый. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве , второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Пример:
movAX.OFFOlh
mov SI, 1000
xchg AX, SI ;AX=3E8h=1000, SI=FF01h
PUSH - Занесение операнда в стек
Команда PUSH уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину содержимое двух-байтового операнда-источника. В качестве операнда-источника может использоваться любой 16-разрядный регистр (включая сегментные) или ячейка памяти.
Пример:
push AX ;Сохранение АХ
pushCS Сохранение CS
push ES:mem Сохранение содержимого слова
;памяти mem из дополнительного
;сегмента
POP - Извлечение слова из стека
Команда POP пересылает слово из вершины (на которую указывает регистр SP) по адресу операнда-приемника. Затем содержимое SP увеличивается на 2 и указывает на новую вершину стека. В качестве операнда-приемника можно использовать любой 16- разрядный регистр (кроме CS) или ячейку памяти. Команда IN вводит в регистр AL или АХ соответственно байт или слово из порта, указываемого вторым операндом. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-приемника (AL или АХ) обязательно.
Пример 1:
in AL, 60h ;Ввод байта из порта 60h
Пример 2:
mov DX, 3D5h ;Адрес порта in AX, DX ;Ввод слова из порта 3D5h
OUT - Вывод в порт
Команда OUT выводит в порт, указываемый первым операндом, байт или слово соответственно из регистра AL или АХ. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-источника (AL или АН) обязательно.
Пример 1:
out61h, AL Пример 2:
mov DX, 3CEh mov AL,
out DX, AL
;Вывод байта в порт 61h из AL
;Адрес порта ;Данное
XLAT — Табличная трансляция
Команда XLAT осуществляет выборку байта из таблицы. В регистре ВХ должен находиться относительный адрес таблицы, а в регистре AL - смещение в таблице к выбираемому байту (его индекс). Выбранный байт загружается в регистр AL, замещая находившееся в нем смещение. Длина таблицы может достигать 256 байтов. Команда XLAT не имеет явных операндов, но требует предварительной настройки регистров ВХ и AL.
LEA — Загрузка исполнительного адреса Команда LEA загружает в регистр, указанный в команде в качестве первого операнда, относительный адрес второго операнда. В качестве первого операнда следует указывать регистр общего назначения (не сегментный), в качестве второго -ячейку памяти.
TEST - Логическое сравнение
Команда TEST выполняет операцию логического И над двумя операндами и в зависимости от результата устанавливает флаги SF, ZF и PF. Флаги OF и CF сбрасываются, a AF имеет неопределенное значение. Состояние флагов можно затем проанализировать командами условных переходов. Команда TEST не изменяет ни один из операндов. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти.
CMP - Сравнение
Команда CMP выполняет вычитание второго операнда из первого. В соответствии с результатом вычитания устанавливаются состояния флагов CF, PF, AF, ZF, SF и OF. Сами операнды не изменяются.
В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака.
Обычно вслед за командой СМР стоит одна из команд условных переходов, анализирующих состояние флагов процессора. Пример:
Пример:
cmp AX, 562Dh
je equal ;Переход на метку equal,
;если AX=562Dh
SAL, SHL - SAL/SHL Арифметический сдвиг влево/логический сдвиг влево
Команда SAL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате:
SAL операнд, 1
сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате:
SAL операнд, CL
сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие заполняются нулями. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2. Поскольку логический сдвиг влево полностью эквивалентен арифметическому сдвигу влево, команда SHL является просто другим обозначением команды SAL.
Пример 2:
mov AX, 1FFh
mov CL, 2
sal AX, CL; AX=07FCh=lFFh*4
SAR - Арифметический сдвиг вправо
Команда SAR осуществляет сдвиг вправо всех битов операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате:
SAR операнд, 1
сдвиг осуществляется на 1 бит. Старший бит операнда сохранят свое значение. Если команда записана в формате:
SAR операнд, CL
сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда, пройдя через флаг CF, теряются, а старший бит расширяется вправо. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг вправо эквивалентен делению знакового числа на 2, поэтому команду SAR удобно использовать для деления операнда на целые степени 2.
Пример 1:
mov AL, 7
sar AL, 1 ;AL=3=7/2. Остаток потерян
SHR - Логический сдвиг вправо
Команда SHR осуществляет сдвиг вправо всех бит операнда. Младший бит операнда поступает в флаг CF. Если команда записана в формате:
shr операнд, 1
сдвиг осуществляется на 1 бит. В старший бит операнда загружается 0, а младший теряется. Если команда записана в формате:
SHR операнд, CL
сдвиг осуществляется на число бит, указан указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда заполняются нулями, а младшие, пройдя через флаг CF, теряются. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Пример 1:
mov AL, 7
shr AL, 1 ;AL=3
Команда RCR осуществляет сдвиг вправо всех бит операнда. Если команда записана в формате:
RCR операнд, 1
сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате:
RCR операнд, CL
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда - в старшие биты операнда. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Пример 1:
clc ;Сбросим CF
movAX, 2
rcr AX, 1 ;AX=2; CF=O
ROL - Циклический сдвиг влево
Команда ROL осуществляет сдвиг влево всех бит операнда. Если команда записана в формате:
ROL операнд, 1
сдвиг осуществляется на 1 бит. Старший бит операнда мгружается в его младший разряд. Если команда записана в формате:
ROL операнд, CL
сдвиг осуществляется на число бит, указанное в регистре-ечетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда перемещаются в его младшие разряды. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Пример 1:
mov AX, 1
rol AX, 1 ;AX=0002h
Циклический сдвиг вправо
Команда ROR осуществляет сдвиг вправо всех бит операнда. Если команда записана в формате:
ROR операнд, 1
сдвиг осуществляется на 1 бит. Младший бит операнда чаписывается в его старший разряд. Если команда записана в формате:
ROR операнд, CL
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда перемещаются в его старшие разряды. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение.
Пример 1:
mov AX, 2
ror АХ, 1; AX=1
SAL, SHL - SAL/SHL Арифметический сдвиг j влево/логический сдвиг влево
Команда SAL осуществляет сдвиг влево всех битов операнда. Старший бит операнда поступает в флаг CF. Если команда записана в формате:
SAL операнд, 1
сдвиг осуществляется на 1 бит. В младший бит операнда загружается 0. Если команда записана в формате:
SAL операнд, CL
сдвиг осуществляется на число битов, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда, пройдя через флаг CF, теряются, а младшие , заполняются нулями. В качестве операнда можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Каждый сдвиг влево эквивалентен умножению знакового числа на 2, поэтому команду SAL удобно использовать для возведения операнда в степень 2. Поскольку логический сдвиг влево полностью эквивалентен арифметическому сдвигу влево, команда SHL является просто другим обозначением команды SAL.
Пример 1:
mov AL, 7
sal AL, 1 ;AL=0Eh=7*2