Примеры отчетов / ASM. Лаб. 2
.docx
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"
Факультет инфокоммуникационных сетей и систем
Кафедра программной инженерии и вычислительной техники
ЛАБОРАТОРНАЯ РАБОТА №2
«ОРГАНИЗАЦИЯ УСЛОВНЫХ ПЕРЕХОДОВ»
по дисциплине «Машинно-зависимые языки программирования»
Выполнил:
студент 1 курса
дневного отделения
группы ИКПИ-##
Фамилия И. О.
Санкт-Петербург 2019
А. Постановка задачи
Вычислить заданное условное целочисленное выражение для данных в форматах INTEGER (signed int), WORD (unsigned int), используя команды сравнения, условного и безусловного переходов.
Результат X тоже целочисленный и его диапазон (формат) зависит от специфики решаемого условного выражения. Исходные данные должны вводиться корректно. Результат также должен быть проверен на область допустимых значений. Обмен данными между Си и ASM — модулем должен осуществляться через глобальные переменные, определенные в модуле Си.
Б. Разработка алгоритма
Все два формата данных будут продемонстрированы в одном проекте.
Входные данные состоят из 4 чисел A, B (signed int, unsigned int).
Выходные данные состоят из числа X — результата вычисления на языке Си и ASM для каждого типа задания (signed int, unsigned int).
Промежуточные данные: переменная типа long под названием "t" для проверки на корректность ввода чисел пользователем.
Размеры типов данных.
sizeof(signed int) = sizeof(unsigned int) = WORD (16 бит)
В. Таблица идентификаторов
N |
Обозначение в задаче |
Идентификатор |
Назначение |
1 |
A (signed int) |
Si_A |
Входные данные |
2 |
B (signed int) |
Si_B |
|
4 |
A (unsigned int) |
Ui_A |
|
5 |
B (unsigned int) |
Ui_B |
|
13 |
— |
t |
Промежуточные данные |
14 |
X (signed int) |
Si_X |
Выходные данные |
15 |
X (unsigned int) |
Ui_X |
Г. Схема алгоритма
НАЧАЛО КОНЕЦ Ввод
A, B (signed int) Вычисление
C++ Вычисление
ASM
Вывод
X
(signed
int) Проверка
ввода
Ввод
A, B (unsigned int)
Вывод
X
(unsigned
int) Проверка
ввода
Д. Таблица результатов
Результаты вычислений приведены ниже в таблице вычислений.
Тип |
A |
B |
X |
Signed Word |
-32768 |
-32768 |
C++: 23 ASM: 23 |
32767 |
32766 |
C++: 0 ASM: 0 |
|
-32767 |
-32766 |
C++: 0 ASM: 0 |
|
32767 |
32767 |
C++: 23 ASM: 23 |
|
Unsigned Word |
65535 |
65535 |
C++: 23 ASM: 23 |
65535 |
65534 |
C++: 0 ASM: 0 |
|
65534 |
65535 |
C++: 0 ASM: 0 |
|
0 |
0 |
C++: 23 ASM: 23 |
Е. Программа
/* Файл CPP */
#include <iostream.h>
/// SIGNED INT-16 (16 BITS = 2 BYTES)
signed int Si_A, Si_B, Si_X;
/// UNSIGNED INT-16 (16 BITS = 2 BYTES)
unsigned int Ui_A, Ui_B, Ui_X;
extern "C" { void LabSi(); void LabUi(); }
/// SIGNED INT-16 (16 BITS)
/// Signed Int C
void SiC() {
if (Si_A > Si_B)
Si_X = (Si_B + Si_A) / (Si_A - 1);
else if (Si_A < Si_B)
Si_X = Si_B * Si_B / 8;
else
Si_X = 23;
cout << "Si, C++: X = " << Si_X << endl;
}
/// Signed Int ASM
void SiASM() {
Si_X = 0;
LabSi();
cout << "Si, ASM: X = " << Si_X << endl;
}
/// UNSIGNED INT-16 (16 BITS)
/// Unsigned Int C
void UiC() {
if (Ui_A > Ui_B)
Ui_X = (Ui_B + Ui_A) / (Ui_A - 1);
else if (Ui_A < Ui_B)
Ui_X = Ui_B * Ui_B / 8;
else
Ui_X = 23;
cout << "Ui, C++: X = " << Ui_X << endl;
}
/// Unsigned Int ASM
void UiASM() {
Ui_X = 0;
LabUi();
cout << "Ui, ASM: X = " << Ui_X << endl;
}
void ClearCin(){
cin.clear(); /// Сброс флага ошибки ввода
while (cin.get() != '\n') continue; /// Сброс буфера
}
int main() {
long t;
cout << "SIGNED INT-16" << endl;
cout << "Signed int A: "; cin >> t;
while (t < -32768 || t > 32767) {ClearCin(); cout << "Incorrect. Try [-32768, 32767]"; cin >> t;}
Si_A = (signed int)t;
cout << "Signed int B: "; cin >> t;
while (t < -32768 || t > 32767) {ClearCin(); cout << "Incorrect. Try [-32768, 32767]"; cin >> t;}
Si_B = (signed int)t;
cout << "UNSIGNED INT-16" << endl;
cout << "Unsigned int A: "; cin >> t;
while (t < 0 || t > 65535) {ClearCin(); cout << "Incorrect. Try [0, 65535]"; cin >> t;}
Ui_A = (unsigned int)t;
cout << "Unsigned int B: "; cin >> t;
while (t < 0 || t > 65535) {ClearCin(); cout << "Incorrect. Try [0, 65535]"; cin >> t;}
Ui_B = (unsigned int)t;
SiC(); SiASM();
UiC(); UiASM();
return 0;
}
; Файл ASM
.MODEL Large,C
.data
Extrn Si_A:WORD, Si_B:WORD, Si_X:WORD
Extrn Ui_A:WORD, Ui_B:WORD, Ui_X:WORD
.code
Public LabSi
LabSi proc far
mov ax, Si_A
cmp ax, Si_B
jg Si_BigSmall
jl Si_SmallBig
je Si_Equal
Si_BigSmall:
mov ax, Si_B ; <AX> = B
add ax, Si_A ; <AX> = B + A
mov bx, Si_A ; <BX> = A
dec bx ; <BX> = A - 1
cwd ; <DX:AX> = B + A
idiv bx ; <AX> = (B + A) / (A - 1)
mov Si_X, ax
jmp Si_Branch
Si_SmallBig:
mov ax, Si_B ; <AX> = B
imul Si_B ; <DX:AX> = B * B
mov bx, 8 ; <BX> = 8
cwd
idiv bx ; <AX> = B * B / 8
mov Si_X, ax
jmp Si_Branch
Si_Equal:
mov ax, 23
mov Si_X, ax
jmp Si_Branch
Si_Branch:
ret
LabSi endp
Public LabUi
LabUi proc far
mov ax, Ui_A
cmp ax, Ui_B
ja Ui_BigSmall
jb Ui_SmallBig
je Ui_Equal
Ui_BigSmall:
mov ax, Ui_B ; <AX> = B
add ax, Ui_A ; <AX> = B + A
mov bx, Ui_A ; <BX> = A
dec bx ; <BX> = A - 1
xor dx, dx ; <DX:AX> = B + A
div bx ; <AX> = (B + A) / (A - 1)
mov Ui_X, ax
jmp Ui_Branch
Ui_SmallBig:
mov ax, Ui_B ; <AX> = B
mov bx, ax ; <BX> = B
mul bx ; <DX:AX> = B * B
xor dx, dx
mov cx, 8 ; <CX> = 8
div cx ; <AX> = B * B / 8
mov Ui_X, ax
jmp Ui_Branch
Ui_Equal:
mov ax, 23
mov Ui_X, ax
jmp Ui_Branch
Ui_Branch:
ret
LabUi endp
end
Ж. Выводы
Тот факт, что результаты, выполненные на ASM, достаточно совпадают с результатами, выполненными на C++, свидетельствует о том, что программа составлена правильно.