Лабы по ОргЭВМ 2023 / Baraeva_Elizaveta_lb3
.docМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В. И. Ульянова (Ленина)
Кафедра МО ЭВМ
отчет
по лабораторной работе №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
ПРОТОКОЛ
Преобразование формул.
При 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
Разработка программы.
Разработанный код программы находится в приложении.
Тестирование программы.
Входные данные |
Выходные данные |
|||||
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 ; завершение программы
