Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабы по ОргЭВМ 2023 / Baraeva_Elizaveta_lb3

.doc
Скачиваний:
0
Добавлен:
09.09.2026
Размер:
88 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В. И. Ульянова (Ленина)

Кафедра МО ЭВМ

отчет

по лабораторной работе №3

по дисциплине «Организация ЭВМ и систем»

Тема: Изучение организации ветвлений в программах на языке ассемблера

Студентка гр. 2383

Бараева Е. Н.

Преподаватель

Фирсов М. А.

Санкт-Петербург

2023

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ ПОЛОЖЕНИЯ

Метка – это символическое имя, присваиваемое определенному месту в коде. Метки используются как цели для переходов и как ссылки на адреса памяти.

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

Инструкция JMP безусловно передает управление на указанную метку или адрес памяти. Она не зависит ни от какого условия и всегда выполняет переход.

Условные переходы передают управление на указанную метку или адрес памяти в зависимости от результата предыдущего сравнения (например, CMP).

Примеры инструкций условного перехода:

JE (Jump if Equal): переходит, если предыдущее сравнение привело к равенству.

JNE (Jump if Not Equal): переходит, если предыдущее сравнение привело к неравенству.

JG (Jump if Greater): переходит, если в результате предыдущего сравнения первый операнд оказался больше второго операнда.

JL (Jump if Less): переходит, если в результате предыдущего сравнения первый операнд оказался меньше второго операнда.

JGE (Jump if Greater or Equal): переходит, если в результате предыдущего сравнения первый операнд оказался больше или равен второму операнду.

JLE (Jump if Less or Equal): переходит, если в результате предыдущего сравнения первый операнд меньше или равен второму операнду.

ЗАДАНИЕ

Разработать на языке Ассемблер iX86 программу, которая по заданным целым значениям a,b,i,k, размером 1 слово, вычисляет:

а) значения i1 = fn1(a,b,i) и i2 = fn2(a,b,i);

b) значения res= fn3(i1,i2,k),

где вид функций fn1,fn2 определяется из табл. 1, а функции fn3 — из табл.2 по цифрам шифра индивидуального задания (n1.n2.n3).

Значения a,b,i,k являются исходными данными, которые должны выбираться студентом самостоятельно и задаваться в процессе исполнения программы в режиме отладки. При этом следует рассмотреть все возможные комбинации параметров a,b и k, позволяющие проверить различные маршруты выполнения программы.

Замечания:

1) при разработке программы не использовать фрагменты, представленные на ЯВУ, в частности, для ввода-вывода данных. Исходные данные должны вводиться, а результаты контролироваться в режиме отладки;

2) при вычислении функций fn1 и fn2 вместо операции умножения следует использовать арифметический сдвиг и, возможно, сложение;

3) не использовать процедуры (в том числе при вычислении функций fn1 и fn2);

4) при разработке программы следует минимизировать длину кода; для этого могут потребоваться преобразования формул и введение промежуточных результатов.

Для выполнения задания:

1. Преобразовать формулы, по которым будут выполняться вычисления, согласно замечанию 4.

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

3. Протестировать программу, оформив таблицу с входными данными и результатами. Тесты должны проверять все пути выполнения вычислений, и их точно не менее 4.

Вариант 4, где шифр задания: 1.5.4

/ 15-2*i, при a>b

f1 = <

\ 3*i+4, при a<=b

/ 20-4*i, при a>b

f2 = <

\ -(6*i-6), при a<=b

/ min(|i1-i2|, 2), при k<0

f3 = <

\ max(-6, -i2), при k>=0

ПРОТОКОЛ

  1. Преобразование формул.

При a > b: f1 = 15 – 2*i, f2 = 20 – 4*i

Следовательно, f2 = 2*f1 – 10

При a ≤ b: f1 = 4 + 3*i, f2 = 6 – 6*i

Следовательно, f2 = –2*f1 + 14

  1. Разработка программы.

Разработанный код программы находится в приложении.

  1. Тестирование программы.

Входные данные

Выходные данные

a

b

i

k

i1

i2

res

10

-5

0

-1

000F

0014

0002

1

0

2

-32768

000B

000C

0001

-32000

-32768

3

-100

0009

0008

0001

-1

-2

-128

8

010F

0214

FFFA

64

32

11

0

FFF9

FFE8

0018

0

0

256

-1

0304

FA06

0002

0

0

0

-2

0004

0006

0002

0

1

-1

-3

0001

000C

0002

-1

1

256

0

0304

FA06

05FA

-1

0

-1

1

0001

000C

FFFA

ВЫВОД

В результате выполнения лабораторной работы были изучены ветвления в программах на языке Ассемблера процессора Intel X86.

ПРИЛОЖЕНИЕ

Код программы lb3.asm:

; Стек программы

AStack SEGMENT STACK

DW 12 DUP(?)

AStack ENDS

; Данные программы

DATA SEGMENT

; Занесение в память констант:

a DW -1

b DW -5

i DW 0

k DW -1

i1 DW ?

i2 DW ?

res DW ?

DATA ENDS

; Код программы

CODE SEGMENT

ASSUME CS:CODE, DS:DATA, SS:AStack

; Головная процедура

Main PROC FAR ; начало процедуры

push DS ; сохранение адреса начала PSP в стеке

sub AX,AX ; обнуление регистра AX

push AX ; сохранение 0 в стеке

mov AX,DATA ;\ загрузка в DS

mov DS,AX ;/ адреса начала сегмента данных

mov AX, a ; запись числа a в регистр AX

cmp AX, b ; сравнение a и b

jg AGB ; если a>b, то переход на метку AGB

mov AX, i ; в AX записывается значение i

shl AX, 1 ; 2*i

add AX, i ; 3*i

add AX, 4 ; 3*i+4

mov i1, AX ; в i1 записывается значение AX: 3*i+4

shl AX, 1 ; 2*(3*i+4)

neg AX ; -2*(3*i+4)

add AX, 14 ; -2*(3*i+4)+14

mov i2, AX ; в i2 записывается значение AX: -2*(3*i+4)+14

jmp F12END ; переход на метку F12END

AGB:

mov AX, i ; в AX записывается значение i

shl AX, 1 ; 2*i

neg AX ; -2*i

add AX, 15 ; -2*i+15

mov i1, AX ; в i1 записывается значение AX: -2*i+15

shl AX, 1 ; 2*(-2*i+15)

sub AX, 10 ; 2*(-2*i+15)-10

mov i2, AX ; в i2 записывается значение AX: 2(-2*i+15)-10

F12END:

cmp k, 0 ; сравнение k с 0

jl KL0 ; если k<0, то переход на метку KL0

mov AX, i2 ; в AX записывается значение i2

neg AX ; -i2

cmp AX, -6h ; сравнение -i2 и -6 в шест.с.с.

jge F3END

mov AX, -6h ; в AX записывается -6 в шест.с.с.

jmp F3END ; переход на метку F3END

KL0:

mov AX, i1 ; в AX записывается значение i1

sub AX, i2 ; i1-i2

jns NABS ; если (i1-i2)>=0, то переход на метку NABS

neg AX ; -(i1-i2)

NABS:

cmp AX, 2 ; сравнение |i1-i2| и 2

jle F3END ; если |i1-i2|<=2, то переход на метку F3END

mov AX, 2 ; в AX записывается 2

F3END:

mov res, AX ; в res записывается значение AX

ret ; выход из программы

Main ENDP ; конец процедуры

CODE ENDS ; окончание сегмента кода

END Main ; завершение программы

7

Соседние файлы в папке Лабы по ОргЭВМ 2023