Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Задание на лабораторную работу




Задание на лабораторную работу

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

Таблица 7

Приоритеты операций

Приоритет Операция
 ! , унарный –
 *, /
 +, –
&
^
|

 

    Варианты заданий на лабораторную работу

1. (a | 5) +! b / (2 – (c & 7)) * (d ^ 10) – 1

2. ((a ^ 2) – (b | 3)) / (2 + (c & 8)) *! d

3. (a & 3) * (b ^ 8) / (! c * (d | 3)) – 5

4. ! a – (b | 2) * (c ^ 2) * (3 + d & 3) + 2

5. (a – 4 & 2) / (! b + (c ^ 5)) –! d

6. ((a & 5) – (b ^ 7)) / (! c + (d | 1) * 2)

7. (a ^ 4) * 5 – (! b + (c & 5 + d)) / 2 | 3

8. (a | 3 – (b ^ 4) * (c & 9)) / (! d + 5)

9. ((a + b | 1) ^ 5) /! c – (d * 5 & 3) + 1

10. (a & 5) / ((3 * b | 3) –! c) + (d ^ 1)

11. (a ^ 5 – (b | 3)) / 2 + (! c +! d) / 3 & 7

12. (a + 1 | 5) / ((b ^ 9) – 1) +! c * (d & 3)

13. (! a – (b | 6) * (c & 9 – (d ^ 8))) / 4

14. –a | 7 * (b & 3) + ((c ^ 4) – 1) /! d + 1

15. (a ^ 3) / ((b | 9) * (! c + 1)) – (d & 2)

16. (a | 5 + b & 9) * ((c ^ 2) + 3) / (! d – 1)

17. (a & 4 – (b + c | 8) * 2) /! ((d ^ 1) + 5)

18. (! a – ((b | 6) / c ^ 3)) * (! d – 3) + 1

19. (a ^ 9) + 2 * (b | 3) – (3 * (c –! d) & 8)

20. (a | 4) * (3 + b & 5) – 2 *! (c ^ 5 + d)

                                           

Контрольные вопросы

1. Какие логические команды существуют для МП 8086?

2. Чем отличаются действия команд NOT и NEG?

3. Какими арифметическими и логическими командами можно заменить действие команды NEG?

4. В каких случаях выполнение команды OR дает такие же результаты, как выполнение команды ADD?

5. Какими способами можно обнулить регистр общего назначения?


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

Команды условных и безусловных переходов

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

        

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

< команда_перехода> < адресное_выражение>

Для формирования флагов совместно с командами условных переходов используется команда CMP, действие которой аналогично команде SUB, но результат нигде не сохраняется. Команда CMP сравнивает два операнда (вычитает второй операнд из первого без сохранения результата) и устанавливает флаги в зависимости от результатов сравнения. Команда CMP, как правило, ставится сразу перед командой условного перехода.

    Все мнемоники команд условного и безусловного переходов начинаются с буквы ‘J’, после которой следуют буквы, определяющие команду безусловного перехода или условия передачи управления командой условного перехода. В таблице 8 приведен список всех команд условных и безусловных переходов, а также условия (флаги), которые эти команды проверяют.

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

    Особо можно отметить команду JCXZ, которая не проверяет флаги, а выполняет переход, если значения регистра CX равно 0.

Команды переходов не оказывают влияния на флаги.

Таблица 8

Команды условных и безусловных переходов

Мнемоническое обозначение Условие перехода Проверяемые значения флагов
JMP безусловный переход Нет
JA / JNBE больше (для беззнаковых чисел) CF=0 и ZF=0
JAE / JNB больше или равно (для беззнаковых чисел) CF=0
JB / JNAE меньше (для беззнаковых чисел) CF=1
JBE / JNA меньше или равно (для беззнаковых чисел) CF=1 или AF=1
JC перенос CF=1
JCXZ CX равно нулю нет
JE / JZ равно ZF=1
JG / JNLE больше (для знаковых чисел) ZF=0 и SF и OF одинаковы (оба 0 или 1)
JGE / JNL больше или равно (для знаковых чисел) SF и OF одинаковы (оба 0 или 1)
JL / JNGE меньше (для знаковых чисел) SF и OF различны
JLE / JNG меньше или равно (для знаковых чисел) ZF=1 и SF и OF различны
JO переполнение OF=1
JNO нет переполнения OF=0
JP / JPE паритет четный PF=1
JNP / JPO паритет нечетный PF=0
JS знак SF=1
JNS нет знака SF=0
JNZ не нуль ZF=0

 

    При использовании команд переходов различают передачу управления в пределах одного физического сегмента и передачу управления из одного сегмента в другой. Исходя их этого, команды безусловных переходов делятся на команды ближних и дальних переходов. В команды ближних переходов входят и команды коротких переходов – при использовании таких команд управление передается на команды, расположенные относительно команды перехода на 127 байт вперед или 128 байт назад. Все команды условных переходов являются короткими переходами. Для команды безусловного ближнего перехода указывается смещение относительно начала сегмента, а в команде короткого перехода непосредственно указывается относительное смещение (относительно данной команды).

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

JMP < адресное_выражение>

Пример: JMP [BX]

В этом примере смещение, на которое передается управление командой JMP, находится в памяти по смещению, определяемому значением регистра BX.

Для непосредственной формы адресации используется следующий синтаксис:

JMP < имя_метки>

Пример:

ADDR:

. . .

JMP ADDR                               ; переход на метку ADDR

Имя переменной определяет ячейку памяти, в которой хранится смещение для передачи управления.

Для прямой формы адресации используется следующий синтаксис:

JMP < имя_сег_регистра>: < смещение> или

JMP WORD PTR < имя_переменной>

Имя_сег_регистра – это CS, DS, SS или ES (префикс замены сегмента). Смещение – это непосредственно указываемое в команде числовое значение. Имя переменной определяет переменную, в которой хранится смещение.

Пример 1:

JMP DS: 0040h

В этом примере управление передается на смещение, хранящееся в памяти по смещению 0040h.

Пример 2:

A DW 1000h

. . .

JMP WORD PTR A         ; передача управления

; на смещение 1000h

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

JMP NEAR PTR < имя_метки>

Пример:

M1:

. . лборторня

JMP NEAR PTR M1

Конструкция “NEAR PTR” используется для обозначения не короткого, а именно ближнего перехода. Короткие безусловные переходы используют такой синтаксис:

JMP SHORT < имя_метки>

Пример:

M1:

. . .

                                                                                                                                                                           JMP SHORT M1

Для команд условного перехода указывать служебное слово SHORT ненужно, так как все команды условных переходов являются короткими переходами. При компиляции программы транслятор проверяет, находится ли метка на расстоянии +127 или –128 байт от команды короткого перехода. Если нет, то фиксируется ошибка. Транслятор Turbo Assembler также автоматически преобразует ближние безусловные переходы с непосредственным смещением в короткие, если это возможно. Если используется синтаксис вида:

JMP < имя_метки>

транслятор выбирает тип безусловного перехода (ближний или короткий) в зависимости от того, на каком расстоянии от команды перехода находится метка. Это справедливо, если метка находится перед командой перехода. Если метка находится после команды перехода, то транслятор всегда выбирает ближний тип перехода.

    Дальние переходы представляют собой передачу управления из одного физического сегмента в другой. При этом меняется не только содержимое регистра IP (как в командах ближних и коротких переходов), но и содержимое регистра CS, что и говорит о переходе в другой физический сегмент. При организации дальних переходов можно использовать прямую и косвенную формы адресации. Синтаксис дальнего перехода с непосредственной формой адресации следующий: короткий

JMP FAR PTR < имя_метки>

Метка располагается в другом программном сегменте. Это будет дальний переход. Если метку расположить в том же программном сегменте, что и команду перехода, Turbo Assembler автоматически преобразует команду дальнего перехода в команду ближнего или короткого перехода. Пример использования команды дальнего перехода:

MySegment1 SEGMENT

   . . .

M1:

. . .

MySegment1 ENDS

 

MySegment2 SEGMENT

   . . .

JMP FAR PTR M1

. . .

MySegment2 ENDS

 

    Синтаксис команды дальнего перехода с использованием косвенной формы адресации такой:

JMP DWORD PTR < адресное_выражение>

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

OFFS DW 0010H

SEGM DW 0400H

. . .

MOV BX, OFFSET OFFS

JMP DWORD PTR [BX]

В этом примере управление будет передано по адресу 0400: 0010 (сегмент: смещение).

 

Задание на лабораторную работу

       1. Даны три битовые переменные без знака a, b, c, d. Записать в d наибольшее из значений этих переменных.

2. Пусть a, b, c – числа размером в слово. Вычислить значение функции f при следующих условиях:

                                      f=4*a+b/c-6, если a> =b

                                      f=6-c*(a+b), если b> =c

                                      f=3/a-(7+b)*5, если c> =a

3.  Пусть k – байтовая переменная со значением от 1 до 18. Записать в регистр AL количество двухзначных десятичных чисел (от 10 до 99), сумма цифр которых равна k.

 

Контрольные вопросы:

1. Сколько операндов имеют команды условного и безусловного переходов?

2. Опишите результат выполнения команды CMP?

3. Что такое дальний переход?

4. Влияют ли команды перехода на значения регистра флагов?

5. Для чего используется оператор SHORT?

 

 

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

Организация циклов

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

 

Для организации циклов в программах на ассемблере могут использоваться команды условных и безусловных переходов, но чаще всего используются специальные команды процессора, предназначенные для организации циклов, а также команда условного перехода JCXZ. Команды организации циклов используют в качестве счетчика циклов регистр CX. Каждая такая команда уменьшает значение регистра CX на 1 и, если значение регистра CX стало равно 0, передает управление на указанную метку. К тому же команды организации циклов могут передавать управление на метку в зависимости от определенного условия – как команды условных переходов. Все команды организации циклов выполняют короткие переходы, поэтому они используют только непосредственно указанное смещение.

    Команда LOOP не имеет дополнительных условий для передачи управления и цикл с использованием команды LOOP выполняется ровно CX раз. Цикл с использованием этой команды является циклом с постусловием и выполняется хотя бы 1 раз.

    Пример использования команды LOOP:

MOV CX, 10

M1:

< тело_цикла>

LOOP M1

В этом примере тело цикла будет выполняться 10 раз.

    Команды LOOPE и LOOPZ представляют одну и ту же команду процессора и аналогичны команде LOOP за исключением того, что цикл с использованием этих команд выполняется, пока значение CX не равно 0 и пока значение флага ZF равно 1 – цикл «пока CX и ZF не равны 0».

    Команды LOOPNE и LOOPNZ представляют одну и ту же команду процессора и аналогичны команде LOOP за исключением того, что цикл с использованием этих команд выполняется, пока значение CX не равно 0 и пока значение флага ZF равно 0 – цикл «пока CX не равен 0 и ZF равен 0».

    Цикл с предусловием можно организовать несколькими способами:

1. Использование команд условного перехода. В этом случае цикл выполняется пока неверно условие. Само условие определяется используемой командой условного перехода. Пример:

MOV DX, 10

M1: CMP DX, 0

    JE M2

    < тело_цикла>

    DEC DX

    JMP M1

M2:

В этом примере тело цикла выполняется 10 раз. В качестве счетчика циклов используется регистр DX. Метка M2 определяет конец цикла.

2. Использование команды JCXZ. В этом случае условием выполнения цикла является ненулевое значение регистра CX. Пример:

MOV CX, 100

M1: JCXZ M2

    < тело_цикла>

    DEC CX

    JMP M1

M2:

В этом примере тело цикла выполняется 100 раз. В качестве счетчика циклов используется регистр CX. Метка M2 определяет конец цикла.

3. Использование команды LOOP. Хотя команда LOOP используется, в основном, в циклах с постусловием, ее можно использовать и для цикла с предусловием. Условием выполнения цикла также является ненулевое значение регистра CX. При этом цикл будет выполняться CX – 1 раз, так как команда LOOP автоматически декрементирует значение регистра CX. Пример:

MOV CX, 21

M1: LOOP M2

    < тело_цикла>

    JMP M1

M2:

В этом примере тело цикла выполняется не 21, а 20 раз. В качестве счетчика циклов используется регистр CX. Метка M2 определяет конец цикла.

    Цикл с постусловием в программе на ассемблере можно организовать следующими способами:

1. Использование команд LOOP, LOOPZ и LOOPNZ. Тело цикла выполняется CX раз. Достоинством этого способа является наличие только одной команды для организации цикла. Пример:

    MOV CX, 1000

M1: < тело_цикла>

LOOP M1

2. Использование команды JCXZ. В этом случае для организации цикла требуется еще две дополнительные команды, но в отличие от всех рассмотренных выше примеров циклов, тело такого цикла может занимать более 127 байт (в предыдущих примерах использовались команды коротких переходов). Пример:

    MOV CX, 500

M1: < тело_цикла>

    DEC CX

    JCXZ M2

    JMP M1

M2:

3. Использование команд условного перехода. В этом случае условие цикла зависит от используемых команд условного перехода. Цикл выполняется до тех пор, пока условие станет неверным. Пример:

    MOV CX, 2000

M1: < тело_цикла>

    DEC CX

    CMP CX, 0

    JNE M1

В большинстве рассмотренных примеров циклов размер тела цикла не может превышать 127 байт. Для снятия этого ограничения необходимо использовать дополнительные команды безусловного перехода, которые могут быть не короткими, а ближними. В следующем примере показан цикл с использованием команды условного перехода и дополнительными командами безусловного перехода:

MOV DX, 10

M1: CMP DX, 0

    JE M2

    JMP SHORT M3

M2: JMP M2

M3: < тело_цикла>

    DEC DX

    JMP M1

M2:

Сократить число команд безусловного перехода можно путем использования противоположного условия:

MOV DX, 10

M1: CMP DX, 0

    JNE M3

    JMP M2

M3: < тело_цикла>

    DEC DX

    JMP M1

M2:

 

Задание на лабораторную работу

1. Вычислить значение суммы:

2. Вычислить значение произведения:

3. Вычислить значение суммы:

4. Вычислить значение произведения:

5. Вычислить значение суммы:

6. Вычислить значение произведения:

7. Вычислить значение суммы:

8. Вычислить значение произведения:

9. Вычислить значение суммы:

10. Вычислить значение произведения:

11. Вычислить значение суммы:

12. Вычислить значение произведения:

13. Вычислить значение суммы:

14. Вычислить значение произведения:

15. Вычислить значение суммы:

16. Вычислить значение произведения:

17. Вычислить значение суммы:

18. Вычислить значение произведения:

19. Вычислить значение суммы:

20. Вычислить значение произведения:

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...