Лабораторные задания (Лабораторные задания)

Посмотреть архив целиком

13



ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ РОССИЙСКОЙ ФЕДЕРАЦИИ

_________________________

МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ

(ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)


Язык ассемблера IBM PC ”

ЛАБОРАТОРНЫЕ РАБОТЫ


Алещенко А.С.















Москва

2007

УКАЗАНИЯ ПО РАБОТЕ С ТУРБО-АССЕМБЛЕРОМ


1. Для установления связи с системой набрать

имя пользователя STUDENT

и пароль (на экране не высвечивается)

S304

2. В директории ASM располагаются файлы, необходимые для работы с языком ассемблера, их можно просматривать и копировать для использования. На диске, выделенном в данной лаборатории (H), следует создавать собственные поддиректории в директории с номером группы, в которых можно располагать собственные файлы, скопированные или вновь создаваемые.

3. Вновь создаваемые файлы можно записывать с использованием любого редактора текстов.

4. Трансляция программы осуществляется набором команды в командной строке

TASM filname.asm (enter)

где filname – любое имя файла,после чего формируется файл с исходным именем filname и расширением .obj

5. Компоновка производится набором команды в командной строке

TLINK filname (enter)

после чего формируются файлы с исходным именем filname и расширениями .exe и .map

6. Выполнение программы производится после вызова файла filname.exe в окне Norton Comander.

7. Отключение окон Norton Comander (и их включение) производится одновременным нажатием Ctrl+O.



















Лабораторная работа № 1


Цель работы: освоить программирование линейных участков программ с использованием арифметических команд языка Ассемблера.

Справочно-обучающая система ASML.

Справочно-обучающая система ASML содержит необходимую справочную информацию о командах Ассемблера IBM PC, представлении информации, форматах команд и основных конструкциях языка.

Справочно-обучающая система ASML вызывается через кнопку ПУСК или через файл ASML.exe в директории ASM. После запуска работа с окнами системы ASML начинается с нажатия кнопки включения меню программы F9.


Арифметические команды языка Ассемблера

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

Операции сложения и вычитания одинаково для знаковых и беззнаковых целых. Используются две формы операндов: байт или слово, причем операнды должны быть одинаковой длины. Операнды могут храниться в регистре или в ОП, но второй операнд может быть непосредственным.

Перечислим команды, относящиеся к группе команд сложения и вычитания:

а) ADD op1, op2 ; op1 := op1+op2

SUB op1, op2 ; op1 := op1 op2

Сложение (вычитание) операндов в дополнительном двоичном коде, результат помещается на место первого операнда, второй операнд не изменяется.

Команда модифицирует регистр флагов FLAGS в соответствии с результатом операции, а именно:

ZF – нулевой рез-т,

SF – знак результата,

PF – флаг четности,

CF, AF – флаги переносов,

OF – флаг переполнения.

Примеры:

ADD AH, 12 ; AH := AH + 12 (1Б)

SUB z, BX ; z := z – BX (2Б)



б) ADC op1, op2 ; op1 := op1+op2+CF

SBB op1, op2 ; op1 := op1 op2 – CF

Сложение (вычитание) операндов с переносом, образованным предыдущей командой.

Модифицирует флаги аналогично п.(а).

Например, если требуется сложить двойные слова, расположенные в парах регистров

(AX, BX) := (AX, BX) + (CX, DX),

причем AX, CX – старшие байты слагаемых,

BX, DX – младшие байты.

Сложение выполняется двумя командами:

ADD BX, DX

ADC AX, CX


в) Специальный случай сложения – изменение операнда на единицу.

INC op ; op:= op +1 инкремент

DEC op ; op:= op –1 декремент

г) Десятичная коррекция результата предыдущей операции. Это анализ флагов и преобразование результата сложения (вычитания) BCD-кодов. BCD-операнды обрабатываются обычными командами сложения и вычитания, а затем размещается команда десятичной коррекции.

Команда коррекции обрабатывает только однобайтовый операнд, находящийся в AL, поэтому команды десятичной коррекции операнда не имеют (подразумеваемая адресация).

DAA; коррекция после сложения

DAS; коррекция после вычитания.

Например,

ADD AL, y

DAA

SUB AL, DH

DAS

Примечание: BCD-операнды, представленные более, чем одним байтом должны обрабатываться побайтно.

Команды десятичной коррекции модифицирует флаги аналогично п.(а), за исключением флагов AF и OF.

  1. Дополнительные команды

а) Команда сравнения

CMP op 1, op 2; op 1 - op2

Результат нигде не запоминается.

Цель команды – модификация флагов: ZF, SF,PF,CF,AF,OF.

б) Команда изменения знака

NEG op

Операнд может быть байт или слово в регистре или в ячейке памяти.

Пример,

MOV AH, 12

NEG AH ; AH := -12

Если операнд равен нулю, то его значение не изменяется.

Команда модифицирует флаги аналогично п.(а), причем

CF=1, кроме случая, когда операнд равен нулю;

OF=0, кроме случая, когда op=-128 (для 1Б), тогда OF=1, а операнд остается без изменения.

  1. Команды умножения и деления

а) Умножение

MUL op ; умножение целых чисел без знака

I MUL op; умножение целых чисел со знаком

Операнд может быть слово или байт в регистре или в ячейке памяти, но не непосредственный операнд.

Команды действуют одинаково:

- для байтов AX := AL*op

- для слов (DX,AX) := AX*op



Команда имеет один операнд, а второй операнд находится в аккумуляторе (подразумеваемая адресация).

Т.к. результат получается удвоенной разрядности относительно сомножителей, то при умножении слов он располагается в стандартной паре регистров (DX,AX), причем DX хранит старшие разряды.

Команды модифицируют флаги:

СF=OF=0 , если старшая половина результата AH нулевая или совпадает по знакам.

СF=OF=1 , если старшие разряды не нулевые.



б) Деление

DIV op; деление целых чисел без знака

IDIV op; деление целых чисел со знаковом

где op – аналогично умножению.

Команды выполняют деление нацело и формируют два результата: целое частное и остаток.

Деление слова на байт выполняется по схеме

АН:=АХ mod op (остаток)

AL:=AX div op (частное)

Деление двойного слова на слово

DX := (DX,AX) mod op

AX := (DX,AX) div op

Делимое заранее должно быть размещено в аккумуляторе и сдвинуто в сторону младшего байта в АХ или AL соответственно.

Флаги не модифицируются, но может возникнуть ошибка «деление на ноль или переполнение», которая возникает, если делитель нулевой или частное не помещается в соответствующее ему место.

При появлении этой ошибки микропроцессор прекращает выполнение программы.

в) Команды десятичной коррекции после команд умножения AAM и перед командой деления AAD (разобрать самостоятельно).

  1. Команды преобразования длины

Эти команды используются перед делением, флаги – не модифицируют.

CBW

– преобразует байт со знаком в AL, в слово со знаком в АХ путем распространения старшего бита AL по всем разрядам AH;

CWD

– преобразует слово в АХ в двойное слово в (DX,AX).



Программирование линейных арифметических участков программ

Наибольшие проблемы в программировании на языке Ассемблера возникают при вводе и выводе информации на экран монитора и другие внешние устройства. В связи с этим изучение основных команд языка Ассемблера целесообразно начинать с включения фрагментов программы на языке Ассемблера в программу на языке Турбо-Паскаль. Причем описание переменных, присваивание начальных значений и вывод результатов выполняются на Паскале, а арифметические преобразования – на языке Ассемблера. Пример совмещения языков программирования приведен ниже.

program as;

uses crt;

var a,b,c,d: integer;

begin

a:=47;

b:=29;

c:=-54;

d:=21;

{*далее вставка фрагмента на ЯА *}

asm

mov ax,a

mov cx,d

div cl

mov al,ah

mov ah,0

mov b,ax

mov ax,c

imul d

add b,ax

mov ax,a

imul a

sub ax,27

add b,ax

end;

{* далее продолжение программы на Паскале *}

writeln ('результат=',b:4);

end.

Следует осторожно использовать константы, описанные в Паскале, т.к. в некоторых командах языка Ассемблера существуют ограничения на типы операндов.

Задание

  1. Законспектировать заданный раздел справочно-обучающей системы ASML в соответствии с номером бригады, особое внимание уделить числовым примерам:

1) Разобрать пример десятичной коррекции чисел при сложении.

2) Разобрать пример десятичной коррекции чисел при вычитании.

3) Разобрать пример выполнения команды вычитания (SUB).

4) Разобрать пример выполнения команды сложения (ADD).

5) Разобрать команды DAA,AAA.

6) Разобрать команды DAS, AAS.

7) Разобрать пример выполнения команды ADC.

8) Разобрать пример выполнения команды SBB.

9) BCD – формат и команда DAA.

10) ASCII-коды и команда ААА.

11) ASCII-коды и команда ААS.

12) ASCII-коды и команда ААM.

13) Команды RCL и ROL.

14) Команды CALL и RET.


2. Разработать программу на Турбо-Паскале для реализации линейного процесса в соответствии с вариантом задания, содержащую также вычисление эталонного результата.

Вариант

Расчетная формула

Аргументы

a

b

c

d

1

a2-(c Div b)+4d

23

-30

42

21

2

cd+(a Mod b)+(a2-7)

29

18

31

-14

3

((b+5) Div a)-c2+4d

-16

39

14

28

4

((a.b) Mod (13+c))-2d

43

-6

-20

47

5

c2-2((ab) Mod (d+10))

25

71

56

-35

6

4a+(b2 Mod (c+a))-d

66

51

-28

12

7

((b2-a) Div (c+12))+4d

9

18

-54

44

8

2d+((a+b) Div (c-17))

30

-14

28

36

9

a2-(c Div b)+2d

23

-30

42

21

10

2d+(с Mod b)+(a2-17)

19

18

31

-14

11

((b+5) Div a)-2c+d2

-16

39

14

12

12

(a Mod (13-c))-bd

43

-6

10

-17

13

b2+2((ac) Mod (d+10))

15

17

26

-35

14

a+(b2 Mod (c+a))-2d

46

51

-28

12

где Div - результат целочисленного деления,

Mod - остаток от целочисленного деления.

Лабораторная работа № 2


Команды передачи управления


Команды передачи управления делятся на 3 вида:

  • команды переходов,

  • команды организации циклов,

  • команды обращения к процедурам.

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

Близкие и далекие переходы.



Мнемоники команд переходов в ЯА образуются от слова Jump.

Например, безусловный переход:

JMP оp,

где ор – имя команды, которой передается управление (т.е. метка).

Адрес перехода ассоциируется с меткой команды. Метка – это имя команды, которое располагается до мнемоники команды и отделяется двоеточием. Любая программная метка (включая имя процедуры) имеет атрибут NEAR или FAR.

Например,

АМ1: ADD AX,4

………………….

JMP AM1


Команды перехода модифицируют указатель команд IP и, возможно, регистр сегмента команд CS и бывают двух типов:

  • если команда изменяет только IP , т.е. передача управления внутри сегмента, то переход называется ближний переход NEAR.

  • если изменяется пара регистров CS:IP, - это межсегментный переход или далекий переход FAR. Заметим, что переход из ассемблерного участка программы в Паскаль-программу также является далеким переходом.

а) команды, анализирующие результаты предыдущей команды (флаги) – условный переход в классическом понимании. Они имеют только 1-байтовое смещение.

Если условный переход требует удаления более чем на 128Б (30-40 команд), то используется комбинация условного и безусловного перехода.


Например:

Требуется NEAR переход на метку ZERO по флагу ZF=1, тогда

Получим фрагмент программы

………..

JNZ CONTINUE; if ZF<>1 then continue

JMP ZERO

CONTINUE

Т.е. используется условный переход по противоположному признаку, а по ZF=1 получим 2-хбайтовый переход.

Мнемоника условного перехода сложна, таких переходов более 20. Некоторые очевидны. Для образования мнемоники используют следующие сокращения:

E – equal (=)

N – not (не)

Ggreater (больше для знаковых целых)

Lless (меньше для знаковых целых)

Aabove (выше) беззнаковых

Bbelow (ниже) для беззнаковых

В условных переходах используется после J от одной до трех букв (из перечисленных выше).

Например, после сравнения чисел результат ор1<ор2, возможны 2 команды, эквивалентные между собой для одного и того же перехода:

  • для знаковых JL ADRES

JNGE ADRES


  • для беззнаковых JB ADRES

JNA ADRES



б) команды управления циклом

LOOP ор

- управление циклом по счетчику, где ор – метка первой команды цикла, цикл управляется счетчиком в СХ.

Команда LOOP уменьшает содержимое СХ (dec СХ) и передает управление в начало цикла, если содержимое СХ<>0, иначе управление передается команде следующей за LOOP.

Обычно цикл оформляется следующим образом.

mov CX,N ; СХ = {число проходов цикла}

L1: ……… начало цикла

……………….

LOOP L1;


Особенности команды LOOP:

  • счетчик цикла находится только в CX;

  • начальное значение загружается в CX>0 до входа в цикл;

  • команды прохода цикла выполняются хотя бы один раз;

  • LOOP осуществляет переход типа SHORT, поэтому проход цикла не должен занимать 128Б (30-40 команд); если нужен более длинный проход цикла, то используется сочетание условных и безусловных переходов;

  • CX может использоваться как операнд в цикле, но не должен изменяться другими командами.


Задание


1. Разработать программу реализации циклического процесса в соответствии с вариантом задания. Вычисляется выражение типа

y1, x<0

Y = y2 , x=0

  • y3 , x>0


при этом используется целочисленное деление, а параметром цикла является переменная x


Вариант

y1

y2

y3

a

b

c

d

x

1

(a2+x)

c

a+b

d

3ax

12

-3

4

3

[-3;4]

2

2ax+5

a-b

d

a2-x

c+d

-6

4

8

2

[-2;5]

3

x(c+7)

b-d

a

cx2

c+d

5

-6

2

1

[-4;5]

4

(d2+x)bc

c+b

d

x2

a+b

1

-3

12

4

[-3;4]

5

cx

a

-b2d

(b+c)x

2

-7

11

5

[-5;2]

6

b+cx

a

-(5+bc)

d2x

c+3

4

-3

6

10

[-4;4]

7

ab-c

x

d-ab

b2x

c+d

14

2

1

-6

[-6;2]

8

a2-x

c

bd-a2

(a2+x)b

5

-3

4

16

[-2;6]

9

c2 -x

a-c

a+b

d

4ax

12

-3

4

3

[-3;4]

10

2a+5x

a-b

d

a2+x

c-d

-6

4

8

2

[-3;3]

11

x(c+5)

2b-d

2a

x2

c+d

5

-6

2

1

[-4;5]

12

(d2+x)b

c+b

d

x2

a-b

1

-3

12

4

[-3;4]

13

c+x

a

-b2d

(b+c)-x

2

-7

11

5

[-5;2]

14

b+x

a

(5+bc)

d2x

c+3

4

-3

6

10

[-4;4]




Лабораторная работа № 3


Блочная структура ассемблер-программы

Построение программы в виде комплекса процедур позволяет упростить решение типовых участков алгоритмов, как например, начало программы или вывод данных на печать.

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


Структура программы на языке Ассемблера

Исходный файл на ЯА состоит из сегментов. В простейшем случае это – один сегмент, который содержит обязательные элементы.

{мет. сегм.} SEGMENTcode

ASSUME CS:{ мет. сегм.}, DS:{ мет. сегм.}

{мет. начала} MOV AX, { мет. сегм.};

MOV DS,AX;

MOV AX,{код функции};

INT 21h

DW

DB

{ мет. сегм.} ENDS

END { мет. начала}



Рассмотрим директивы оформления программы:

1) директива SEGMENT для ассемблеров MASM и TASM имеет одинаковую структуру

{мет. сегм.} SEGMENT [{счетн.}] [{комб.}] [‘{класс}’]

где {мет. сегм.} - это имя сегмента, которое трактуется как метка, т.к. используется для передачи управления.

Атрибуты необязательны, но, если они есть, то очередность должна сохраняться.

2) директива ASSUME нужна для выполнения команд программы, которые неявно ссылаются на сегментные регистры МП (т.е. в примере – DS и CS). Она обеспечивает передачу адресов сегментов с соответствующими именами в сегментные регистры.

Общий вид

ASSUME CS:{ мет.}[, {сег. рег.}:{ мет.}]

В приведенном примере эта директива означает, что DS и CS указывают на один и тот же сегмент, причем в CS адрес начала сегмента загружается автоматически, а в DS для этого требуются обычно две команды в самом начале сегмента.

Заметим, что ASSUME может быть расположен до начала первого сегмента. В многосегментных программах ASSUME может описывать следующие сегменты



Сег.рег.

Сегмент

Загрузка адреса

CS

Рг сегмента команд

автоматическая

DS

Рг сегмента данных

в программе

ES

Рг доп. сегмента данных

в программе

SS

Рг сегмента стека

автоматическая



3) Директива ENDS указывает на конец текста сегмента. Общий вид

{ мет. сегм.} ENDS

4) Директива END указывает на конец текста исходного модуля (ИМ). Общий вид

END { мет. начала}

где { мет. начала} – пусковой адрес, т.е. метка первой выполняемой строки ИМ, которой передается управление после компоновки.

Обычно программы состоят из 3-х сегментов: команд, данных и стека. Допускается использовать дополнительный сегмент данных. Расположение сегментов в принципе свободное, но рекомендуется:

    1. сегмент данных,

    2. дополнительный сегмент данных,

    3. сегмент команд,

    4. сегмент стека, т.к. он может быть описан без расхода памяти.

Например,

Stack SEGMENT stack ,‘stack’

DW 128 dup(?)

Stack ENDS

Объем стека обычно указывается в словах и не должен превышать 64КБ.

Здесь имя сегмента совпадает с атрибутами, что не запрещено; далее stack – комбинаторный атрибут, который позволяет компоновщику объединить стековые сегменты из разный ИМ в один стековый сегмент. Кроме того, при загрузке программы выполняется автоматическая инициализация регистров SS и SP.

Часто в больших программах используются подпрограммы для реализации типовых участков. В ЯА подпрограммы оформляются в виде процедур.

Описание процедур

{имя проц.} PROC {параметр}

{тело проц.}

[RET]

{имя проц.} ENDP

где {имя проц.} – должно повторяться дважды и используется для обращения к процедуре;

{параметр} может принимать одно из двух значений - <NEAR> (по умолчанию) или <FAR>.

К близкой (внутренней) процедуре можно обращаться только из того сегмента команд, где она описана. К дальней (внешней) процедуре можно обращаться из любых сегментов команд программы, в том числе и из того, где она описана.

Имена и метки, описанные в процедуре, не локализуются внутри нее, поэтому должны быть уникальными в программе.

Хотя в АЯ можно описать одну процедуру внутри другой, никакой выгоды это не дает и обычно не используется.

Вызов процедур

Если из процедуры возможен возврат в DOS, то ее можно вызвать командой перехода на имя процедуры

JMP {имя проц.}

Если нужен возврат в вызывающую программу, то проще всего использовать команду обращения

CALL {имя проц.}

Тогда в теле процедуры должна быть команда возврата

RET


Задание


  1. Ознакомиться с образцами программ, приведенными в файлах task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm.

  2. Ознакомиться с образцами программ, приведенными в файлах task2_1.asm, task5_m.asm, task6_1.asm.

  3. Разработать ассемблер-программу реализации линейного процесса.



Лабораторная работа № 4


Задание


1. Разработать программу в Турбо-ассемблере для реализации циклического процесса в соответствии с вариантом задания, выполненным на занятии 3.



Случайные файлы

Файл
41759.rtf
154573.rtf
16168.rtf
2280.rtf
146861.rtf