
- •Теория.
- •Практические задания.
- •Imul reg,src(исходный)
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
- •Теория.
- •Практические задания.
Задание №1.
Теория.
Язык ассемблера процессора Intel IA-32. Директивы ассемблера. Директивы описания данных. Структура программы на языке ассемблера. Команды управления потоком выполнения команд. Дать примеры программного кода на ассемблере. (30 баллов)
Практические задания.
Написать программу на ассемблере IA-16, вычисляющую максимальное значение числа N, при котором N! не переполняет одно слово (2 байта). (30 баллов)
Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, выбирать тип используемого процессора, организовывать связи между процедурами и т.д. К сожалению, пока нет единого стандарта на эти команды (он существует для UNIX). Разные ассемблеры используют различные наборы директив, но TASM и MASM (два самых популярных ассемблера для DOS и Windows) поддерживают общий набор. Программа на языке ассемблера состоит из строк, имеющих следующий вид: метка команда/директива операнды ;комментарий Рассмотрим директивы, работающие напрямую с метками и их значениями, — LABEL и EQU. метка label тип
Директива LABEL определяет метку и задает ее тип. Тип может быть одним из:
BYTE (байт),
WORD (слово),
DWORD (двойное слово),
FWORD (6 байт),
QWORD (учетверенное слово),
TBYTE (10 байт),
NEAR (ближняя метка),
FAR (дальняя метка).
Метка получает значение, равное адресу следующей команды или следующих данных, и тип, указанный явно. В зависимости от типа команда
mov метка,0
запишет в память байт (слово, двойное слово и т.д.), заполненный нулями, а команда
call метка
выполнит ближний или дальний вызов подпрограммы.
С помощью директивы LABEL удобно организовывать доступ к одним и тем же данным, как к байтам, так и к словам, определив перед данными две метки с разными типами.
метка equ выражение
Директива EQU присваивает метке значение, которое определяется как результат целочисленного выражения в правой части. Результатом этого выражения может быть целое число, адрес или любая строка символов:
truth equ 1
Псевдокоманда — это директива ассемблера, которая приводит к включению данных или кода в программу, хотя сама она никакой команде процессора не соответствует. Псевдокоманды определения переменных указывают ассемблеру, что в соответствующем месте программы располагается переменная, определяют тип переменной (байт, слово, вещественное число и т.д.), задают ее начальное значение и ставят в соответствие переменной метку, которая будет использоваться для обращения к этим данным. DB — определить байт;
DW — определить слово (2 байта);
DD — определить двойное слово (4 байта);
DF — определить 6 байт (адрес в формате 16-битный селектор: 32-битное смещение);
DQ — определить учетверенное слово (8 байт);
DT — определить 10 байт (80-битные типы данных, используемые FPU).
Пример ассемблерной программы сложения нескольких чисел. Ассемблерные директивы .data и .code определяют начало областей данных и кода (то есть команд) программы. Директива DD (Definition Double (Double word)) выделяет в области данных 4-байтовое двойное слово. NUM1 — это метка, назначенная адресу первого из двойных слов, которые инициализированы значениями 17, 3, -51, 242 и -113. Адресам следующих двух двойных слов, инициализированных значениями 5 и 0, назначены метки N и SUM. Три символических имени, объявленных в разделе данных, используются в командах в разделе кода. В частности, метка MAIN предназначена для определения точки начала выполнения программы, а также задается в ассемблерной директиве END, которой заканчивается текстовый файл программы.
.data ; директивы асемблера инициируют данные в сегменте данных
NUMLIST DD 17,3,-51,242,-113
NUM1 EQU NUMLIST
N DD 5
SUM DD 0
.code : команды ассемблера в сегменте кода
MAIN: LEA EBX,NUM1 ;Загрузка адреса NUM1 в базовый регистр
SUB EBX,4 ;Уменьшение адреса на 4
MOV ECX,N ; Загрузка значения счетчика
MOV EAX,0 ;Обнуление регистра суммы
STARTADD: ADD EAX,(EBX+ECX*4) ;Определение адреса следующего и прибавление к EAX
LOOP STARTADD ;Уменьшение на 1 счетчика ECX и
;если ECX >0, переход на STARTADD
MOV SUM,EAX ;Пересылка суммы по адресу SUM
… …
SUM DEF ? ;сегмент данных программы
N DEF n
NUM1 DEF ?
NUM2 DEF ?
NUM3 DEF ?
… …
NUMn DEF ?
END MAIN ;директива ассемблера
Существует два способа отклонения программы от «прямолинейного курса». Первый из них— это вызов подпрограммы и возврат из нее. Кроме того, в программе могут выполняться переходы к заданным командам — как условные, так и безусловные.
Задание №2.
Теория.
Арифметические команды. Сложение, умножение, деление, вычитание. Дать примеры программных кодов на ассемблере. (30 баллов)
Практические задания.
Написать программу на языке ассемблер IA-16, в которой определены две переменных х и у двойные слова и подпрограмму, вычисляющую сумму х + у. Параметры передаются через стек процессора.(30 баллов)
Команды вычитания\сложения
Команда SUB (вычитание), так же как и ADD выполняет вычитание байтов или слов, содержащих двоичные данные. Вычитание осуществляется в компьютере по методу сложения с двоичным дополнением: для второго операнда устанавливаются обратные значения битов и прибавляется 1, а затем происходит сложение с первым операндом. Во всем, кроме первого шага, операции сложения и вычитания идентичны.
Существует пять возможных комбинаций операндов: Примеры:
вычитание регистр – регистр SUB EAX,EBX;
вычитание память – регистр SUB NUMB,EBX;
вычитание регистр – память SUB EAX,NUMB;
вычитание регистр - непосредственное значение SUB EAX,100;
вычитание память - непосредственное значение SUB 100,EBX.
Команды умножения и деления
Кроме команд для сложения и вычитания целых чисел со знаком, описанных в разделе 5.5, в наборе команд IA-32 имеются команды для целочисленного умножения и деления, а также для выполнения арифметических операций над числами с плавающей запятой.
Имеются следующие команды умножения:
MUL – для умножения чисел без знака;
IMUL - для умножения чисел со знаком.
В общем случае в результате умножения двух 32-разрядных чисел получается произведение двойной длины, то есть 64-разрядное значение. Однако для многих приложений достаточно иметь результат одинарной длины, то есть 32-разрядное значение. В подобных ситуациях используются разные команды. Результат одинарной длины генерирует команда
Imul reg,src(исходный)
помещающая 32-разрядное значение результата в регистр общего назначения REG. Исходный операнд может находиться либо в регистре, либо в памяти.
В случае результата двойной длины команды
IMUL src и MUL src
используют в качестве второго операнда регистр AL, AX или ЕАХ, в зависимости от размера исходного операнда, располагающегося либо в регистре, либо в памяти. Произведение двойной длины помещается в два регистра: старшая половина разрядов результата сохраняется в регистрах DH, DX или EDX, а младшая — в регистрax AL, AX или ЕАХ.
Команда для выполнения целочисленного деления имеет следующий формат:
IDIV src и DIV src
Выполняет целочисленное деление со знаком AL, АХ или ЕАХ (в зависимости от размера источника) на источник (регистр или переменная) и помещает результат в AL, АХ или ЕАХ, а остаток — в АН, DX или EDX соответственно. Результат всегда округляется в сторону нуля, знак остатка всегда совпадает со знаком делимого, абсолютное значение остатка всегда меньше абсолютного значения делителя.
В архитектуре IA-16 имеется отличие,
-если размер src – байт, то делимое всегда должно быть AX, после выполнения команды частное находится в AL, а остаток в AH. -если размер src – слово (2 байта), то делимое всегда должно быть в паре регистров DX:AX (в AX – младшая часть делимого, а в DX – старшая часть) а, после выполнения команды частное находится в AX, а остаток в DX.
Пример: Сложение чисел ТАSM .model small
.stack 100h
.386
.data
x dd 1
y dd 3
z dd ?
.code
start:
mov ax,DGROUP
mov ds,ax
;inerst code
mov eax,x
add eax,y
mov z,eax
;code end
mov ax,4c00h
int 21h
end start
Задание №3.