Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Примеры отчетов / ASM. Лаб. 2

.docx
Скачиваний:
61
Добавлен:
01.10.2019
Размер:
53.15 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ "САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М. А. БОНЧ-БРУЕВИЧА"

Факультет инфокоммуникационных сетей и систем

Кафедра программной инженерии и вычислительной техники

ЛАБОРАТОРНАЯ РАБОТА №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++, свидетельствует о том, что программа составлена правильно.

Соседние файлы в папке Примеры отчетов