
Федеральное агентство по образованию Российской Федерации
Факультет заочного обучения |
|||
Кафедра вычислительных систем |
КУРСОВАЯ РАБОТА
По дисциплине:
ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ АССЕМБЛЕРА
Вариант № 18
Исполнитель:
студент группы ЗВП-07
Орлов
Д.Б. “____”__________ Руководитель:
кандидат технических
наук, профессор
Комаров
В.М “____”__________ |
РЫБИНСК
Оглавление
-
Условие задачи первой задачи .................................................3
-
Граф-схема алгоритма решения первой задачи.......................4
-
Исходный текст программы для решения первой задачи......6
-
Условие задачи второй задачи .................................................8
-
Граф-схема алгоритма решения второй задачи.......................9
-
Исходный текст программы для решения второй задачи......11
-
Вывод..........................................................................................13
Список литературы.........................................................................14
1. Условие задачи №1:
Написать подпрограмму для вычисления y = x*const, где Х – массив трехразрядных десятичных чисел в распакованном формате, const – заданное значение. С помощью этой подпрограммы обработать два массива, умножая элементы первого на число 5, а элементы второго на число 7. Для передачи параметров использовать стек.
-
Граф-схема алгоритма решения первой задачи
.
Рисунок - основной программы
0 Верхушка стека |
+2 IP |
+4 кол-во чисел в массиве |
+6 константа |
+8 входные данные |
+10 выходные данные |
Рисунок - Схема размещения данных в стеке
Загрузка данных
из стека
Коррекция
результата
Модификация
адресов
Нет
ДА
Рисунок - Блок-схема подпрограммы MulArr
__________
|___|___|___| - трехразрядное число
___
|___| - константа
_________________________
_________
|_AH||_AL| - промежуточный результат
+ _______
|___||___|
+ _______
|___||___|
_________________________
_______________
|___||___||___||___| - результат
+3 +2 +1 +0
Рисунок - Общая схема умножения
3. Исходный текст программы для решения первой задачи
n=100
NAME Ass1
Data Segment
const1 db 5
Arr_byte1 Db 5,3,4 ;первый входной массив - 435
Db 1,2,9 ; 921
endarr_byte1 label byte
N1=(offset endArr_byte1-offset Arr_byte1)/3 ;определяем длину 1го массива
Res1 DD N1 DUP (0) ; массив результатов
Prob DB '$$$$'
const2 db 7
Arr_byte2 Db 8,8,8 ;первый входной массив - 888
Db 7,7,7 ; 777
endarr_byte2 label byte
N2=(offset endArr_byte2-offset Arr_byte2)/3 ; определяем длину 2го массива
Res2 DD N2 DUP (0) ; массив результатов
Prob1 DB '$$$$'
Data Ends
MyStack Segment
DW 12 DUP (?)
StkTop Label WORD
MyStack Ends
Code Segment
ASSUME CS:Code,DS:Data,ES:Data,SS:MyStack
MulArr Proc Near
push BP
mov BP,SP
mov CX,[bp+4] ;N из стека
mov bx,[bp+6] ;const из стека
mov di,[bp+8] ;byte из стека
mov si,[bp+10] ;res из стека
Z: mov AL,[di] ;первая цифра исходного массива
mul byte ptr [bx] ;умножение на константу
aam ;коррекция
mov [si],al ;запись рез-тата
mov [si+1],ah
mov al,[di+1] ;вторая цифра
mul byte ptr [bx] ;умножение на константу
aam ;коррекция
adc al,[si+1] ;сложение с переносом
aaa ;коррекция
mov [si+1],al ;запись рез-тата
mov [si+2],ah
mov al,[di+2] ;третья цифра
mul byte ptr [bx] ;умножение
aam ;коррекция
adc al,[si+2] ;сложение с переносом
aaa ;коррекция
mov [si+2],al ;запись рез-тата
mov [si+3],ah ;
add SI,type Res1 ;модернизация адресов
inc di
inc di
inc di
loop Z
pop BP
RET 8
MulArr Endp
Start:
mov AX, Data
mov DS, AX
mov ES, AX
mov AX, MyStack
mov SS, AX
mov SP, offset StkTop
lea AX, Res1 ;передаем данные об адресах через стек
push AX ;инициализируем их и запоминаем в стеке
lea AX, Arr_byte1
push AX
lea ax,const1
push ax
mov AX, N1
push AX
call MulArr
lea AX, Res2
push AX
lea AX, Arr_byte2
push AX
lea ax,const2
push ax
mov AX, N2
push AX
call MulArr
Code ENDS
END Start