Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

Подписываем
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Предоплата всего
Подписываем
Лабораторная работа №1.
ВСТРОЕННЫЙ АССЕМБЛЕР
Ассемблером называется машинно-зависимый компилятор, преобразующий специальным образом составленные текстовые строки в машинные инструкции. Как и любой другой компилятор, ассемблер упрощает разработку программ за счет того, что предоставляет пользователю доступ к кодам машинных инструкций и операндам с помощью символьных имен. Встроенный ассемблер имеется в версиях 6.0 и 7.0 Турбо Паскаля и в руках опытного программиста представляет собой мощный инструмент, позволяющий «выжать» из ПК все возможное.
1.1. ОБЩЕЕ ОПИСАНИЕ МП 8086/8088
Встроенный ассемблер (далее - просто ассемблер) дает возможность программировать на уровне отдельных машинных инструкций. Это - главное отличие ассемблера от Паскаля и в этом отличии сосредоточены все его достоинства и недостатки. Достоинство заключается в том, что, программируя на ассемблере, программист обычно выбирает последовательность машинных инструкций так, чтобы реализовать нужные вычисления с максимальной скоростью при минимальных затратах памяти, в то время как даже такой весьма совершенный компилятор, как компилятор Турбо Паскаля неизбежно вносит в машинный код некоторую избыточность, уменьшающую скорость счета и увеличивающую затраты памяти. С другой стороны, программирование на уровне машинных инструкций - чрезвычайно хлопотное занятие и не может сравниться по скорости разработки программ с программированием на Паскале - в этом заключается главный недостаток ассемблера.
Чтобы использовать средства ассемблера, необходимо ясно представлять себе детали архитектуры микропроцессоров Intel 80x86.
1.2. Регистры
В МП 8086/8088 имеется 14 регистров. В функциональном отношении они делятся на группы:
регистры общего назначения (АХ, ВХ, СХ, DX); предназначены для хранения операндов и выполнения основных команд; любой из них может использоваться как совокупность двух независящих друг от друга 8-разрядных регистров: старшего байта регистра (АН, ВН, СH, DH) и младшего байта (AL, BL, CL, DL); например, АХ состоит из АН и AL;
сегментные регистры (CS, DS, SS, ES); используются для указания сегмента при адресации памяти;
регистры-указатели (SP, BP, IP); используются для указания смещения при адресации памяти;
индексные регистры (SI, DI); применяются для индексной адресации;
регистр флагов; используется для хранения признаков состояния процессора.
Внутри одной и той же функциональной группы регистры используются различным образом. Ниже описывается специфика использования регистров.
Регистр АХ. Является основным сумматором. Используется во всех арифметических операциях (сложить, умножить и т.п.). Только с помощью АХ и его полурегистров AH и AL возможен обмен данными с портами ввода/вывода.
Регистр ВХ. Используется как сумматор в арифметических операциях, а также как базовый регистр при индексной адресации.
Регистр СХ. В основном используется как счетчик при выполнении операций повторения и сдвига. Может также участвовать в арифметических операциях.
Регистр DX. Используется как регистр данных в операциях ввода/вывода, а также как сумматор при обработке длинных целых чисел (32-разрядных).
ОБЗОР ПРИЕМОВ ПРОГРАММИРОВАНИЯ НА АССЕМБЛЕРЕ
1.1. Программирование арифметических выражений.
Программа на языке Ассемблер состоит из операторов (команд) . Каждый оператор занимает одну строку. Общий вид оператора:
<оператор> <операнд1>,<операнд2>
Некоторые операторы могут содержать только один из операндов.
Пример наиболее часто встречающейся команды:
Mov ax,x
Команда копирует содержимое переменной (операнда) x в регистр процессора ax. Соответствует команде в языке Паскаль:
Ax:=x;
Операторы языка Ассемблер не допускают использования двух переменных в качестве операндов для команды, т. е. команда
mov x,y { в Паскале x:=y}
где x и y переменные, недопустима. Следует писать:
mov ax,x
mov y,ax
В данном курсе рассмотрена арифметика для целых двоичных чисел. В табл. 1 представлены основные команды для выполнения арифметических операции, а в табл. 2 дополни тельные .
Таблица 1 Двоичная арифметика.
Обозначения, используемые в таблице :
on 1, on 2, on операнды, т.е. содержимое, стоящее по первому (оп 1), второму (оп 2) адресам или единственный операнд (on); al, ah, ax, dx, eax, edx регистры, причем eax, edx допустимы только для процессоров 80386 и выше.
Как видно из табл. 1, в командах умножения и деления задается один операнд, второй сомножитель или делимое в фиксированных регистрах. Команда умножения возвращает результат в два раза длиннее сомножителей, команда деления требует, чтобы делимое было в два раза длиннее делителя. Результатом выполнения команды деления являются частное (регистр, записанный первым в таблице) и остаток (регистр, записанный вторым).
Если перед кодом стоит буква i (imul, idiv, i-integer-целый), операции выполняются с учетом знаков исходных данных, в противном случае беззнаковые операции.
ПРИМЕР: Вычислить значение выражения x=y+(z-u*v)/w, если исходные данные занимают одно слово.
Program asm_prg;
Var
X,y,z,u,v,w:integer;
Begin
Writeln( Writeln y,z,u,v,w);
Readln (y,z,u,v,w); { это комментарий}
Asm { Здесь начинается ассемблерный код}
mov ax,v { ax:=v}
mul u { ax:=ax*u}
mov bx,ax (bx:=ax)
mov ax,z (ax:=z)
sub ax,bx (ax:=ax-bx)
cwd {подготовка к делению}
Idiv w (ax:=ax div w)
add ax,y (ax:=ax+y)
mov x,ax (x:=ax)
End; { Здесь заканчиваетсяассемблерный код}
Writeln (x= ,x);
Readln;
End.
"Узелки" на память
Данные, участвующие в операциях, должны быть одной длины (байт-байт, слово-слово, двойное слово - двойное слово).
Команда умножения изменяет содержимое регистра dx (edx) даже если сомножители дают произведение, которое помещается в ах (еах).
Команда деления требует дополнительной подготовки, т.е. увеличения длины делимого(длина делимого должна быть в 2 раза больше длины делителя). Для расширения делимого в ah, dx, eaх (для байта, слова и двойного слова соответственно) записывается знаковый разряд.
Рекомендуем просмотреть выполнение программы с помощью отладчика!
Таблица 2 Двоичная арифметика(дополнительные команды)
Заметим, что команды inc(dec) используются вместо add(sub), если нельзя менять флаг переноса; команды adc(sbb) используются для вычислений с многократной точностью
Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.
Лабораторная работа №2.
2. Организация разветвлений.
Для организации разветвлений используются команды условных и безусловных переходов. Команды условного перехода имеют ограниченную область доступа -128..127 байт, т. е. разность между адресом очередной команды и адресом перехода должна быть в этом диапазоне.
Если необходимо перейти к команде вне области действия команды перехода, команда условного перехода комбинируется с командой безусловного перехода.
ПРИМЕР: Реализовать на ассемблере оператор
------------------------
if ( х < 3 ) then x:=x+1;
x:=x-1;
-------------------------
Решение 1
-------------------------
mov ax,x ;ax:=x
cmp ax,3 ; сравнить x и 3
jge @metka ;перейти на строчку metka если x>=3
inc ax ; ax::=ax+1
@metka: dec ax ; ax::=ax-1
-------------------------
Здесь metka - метка строки вне области действия оператора if.
Заметим, что команды inc(dec) используются вместо add(sub).
ПРИМЕР: Реализовать на ассемблере оператор
if ( х < 3 ) goto mrtka
Предложенное выше решение НЕ ВЕРНО, транслятор сообщит об ошибке, если metka вне области действия оператора if.
Решение 2
-------------------------
mov ах,х ; х=>ах
сmр ах, 3 ; сравнить x и 3
jge @continue ; if (x>=3) goto continue
jmp near ptr @metka ; if (x<3) goto m
@continue:..
-------------------------
Решение ВЕРНО. Здесь используется команда безусловного перехода с префиксом near ptr. Префикс определяет область действия команды безусловного перехода и принимает значения:
short область действия-128..127 байт
near ptr область действия -32768..32767 байт
far ptr область действия распространяется на другие модули программы.
При использовании команд перехода необходимо правильно выбирать требуемые команды с учетом работы со знаковыми и беззнаковыми данными.
Таблица 3 Основные команды условного перехода .
Знаковые данные |
Беззнаковые данные |
Не зависят от типа |
jl (jnge) - меньше |
jb (jnal) - ниже |
je (jz) - paвно |
jg (jnle) - больше |
ja (jnbe) - выше |
jne (jnz) - нe равно |
jle (jng) - нe больше |
jbe (jna) - нe выше |
jo - переполнение |
jge (jnl) - нe меньше |
jae (jnb) - нe ниже |
jno - нет переполнения |
js отрицательное |
jc - перенос |
|
jns не отрицательное |
jnc - нет переноса |
Примеры команд с использованием команд перехода.
ПРИМЕР 1: Вычислить z=max(x,y) с учетом знака чисел х, у
------------------------
var
x,y,z:integer;
begin
read(x,y);
asm
mov ах, х ; aх: =х
сmр ах, у ; х сравнивается с у
jge @xgey ;
mov ах, у ; ax: =y
@xgey: mov z, ах ; z:=ax
end;
writeln(max= ,z);
end.
------------------------
В этом примере xgey метка с адресом перехода, если х >= у.
Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.
Лабораторная работа №3.
3. Организация циклов.
Для организации циклов с известным числом повторений используется команда loop или ее модификации. Область действия команды и ее модификаций такая же, как у команд условного перехода (-128..127).
Циклический участок программы обычно имеет следующую структуру:
mov сx, число повторений { Инициализация цикла}
jcxz метка_после_цикла
метка:
{тело цикла}
loop метка
метка_после_цикла :
Команда jcxz означает переход при сх=0, т.е. цикл не нужно выполнять ни разу. Напоминаем, что по команде loop содержимое сх уменьшается на 1 и, если сх<>0, то переход к метке, заданной в команде loop, в противном случае выход из цикла.
Если выход из цикла определяется не только числом повторений, вместо команды loop можно использовать ее разновидности
{ loope } повтор цикла, если счетчик не исчерпан и флаг
{ loopz } нуля установлен
{ loopne } повтор цикла, если счетчик не исчерпан и флаг
{ loopnz } нуля не установлен
ПРИМЕР: Найти сумму S=1+2+3+4+…+n.
var
s,n:integer;
begin
read(n);
asm
mov cx,n
mov ax,0
jcxz @end
@for:
add ax,cx
loop @for
@end: mov s,ax
end;
writeln('s=',s);
readln;
readln;
end.
Та же программа с использованием для организации цикла «прыжков».
var
s,n:integer;
begin
read(n);
asm
mov cx,n
mov ax,0
@for: jcxz @end
add ax,cx
dec cx
jmp @for
@end: mov s,ax
end;
writeln('s=',s);
readln;
readln;
end.
Пример2. 1. Дано натуральное n. Написать программу вычисления x в степени n.
var
x,n:integer;
begin
read(x,n);
asm
mov cx,n
mov ax,1
jcxz @end
@for:
imul x
loop @for
@end: mov x,ax
end;
writeln('s=',x);
readln;
readln;
end.
Задание. Написать программу на языке Паскаль с использованием Ассемблерной вставки для произведения вычислений.
1. Найти сумму: S=1+2+3+4+…+n
2. Вычислить произведение: S=(n-1)(n-2)(n-3)…(n-(n-1)).
3. Дано целое число n. Найти сумму цифр числа n.
4. Дано целое n. Сколько цифр в числе n?
5. Наитии наибольший делитель числа x не считая само число.