Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Задания для модуля 2 арх.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
162.82 Кб
Скачать

Задание №1.

  1. Теория.

    1. Язык ассемблера процессора Intel IA-32. Директивы ассемблера. Директивы описания данных. Структура программы на языке ассемблера. Команды управления потоком выполнения команд. Дать примеры программного кода на ассемблере. (30 баллов)

  1. Практические задания.

    1. Написать программу на ассемблере IA-16, вычисляющую максимальное значение числа N, при котором N! не переполняет одно слово (2 байта). (30 баллов)

  1. Каждая программа на языке ассемблера помимо команд процессора содержит еще и специальные инструкции, указывающие самому ассемблеру, как организовывать различные секции программы, где располагаются данные, а где команды, позволяющие создавать макроопределения, выбирать тип используемого процессора, организовывать связи между процедурами и т.д. К сожалению, пока нет единого стандарта на эти команды (он существует для 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.

  1. Теория.

    1. Арифметические команды. Сложение, умножение, деление, вычитание. Дать примеры программных кодов на ассемблере. (30 баллов)

  2. Практические задания.

    1. Написать программу на языке ассемблер IA-16, в которой определены две переменных х и у двойные слова и подпрограмму, вычисляющую сумму х + у. Параметры передаются через стек процессора.(30 баллов)

  1. Команды вычитания\сложения

Команда 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.