3.3 Алгоритм подпрограммы
Б лок схема представлена на рисунке 3.
Ввод первого и второго массива
Умножение массивов
Умножение массивов
Вывод на экран первого результирующего
массива
Вывод на экран второго результирующего
массива
Ввод третьего и четвертого массива
Рисунок 3 – блок – схема подпрограммы
3.4 Описание процедур
В данном варианте программы используются следующие процедуры:
– процедура ввода массива с клавиатуры;
– процедура вывода массива на экран;
– получение произведения.
Блок – схема алгоритма ввода массива с клавиатуры представлена на рисунке 4.
Загрузка адреса
накопителя ввода
Чтение символов
с клавиатуры
Сравнение кода
введенного символа с кодом числа
да
да
да
да
да
нет
Вывод на экран
введенного символа
Вывод на экран
введенного символа
Завершение ввода
числа
Вычитание из кода
введенного символа 30h
Вычитание из кода
введенного символа 30h
Запись кода
введенного символа в переменную - буфера
Запись кода
введенного символа в переменную - буфера
нет
нет
нет
нет
нет
да
да
Рисунок 4 – Блок – схема ввода данных
Б лок – схема вывода массива на экран представлена на рисунке 5.
Получение начало массива и его длины
В dl загружается первый
байт
ASCII коррекция старшего
байта
нет
да
нет
да
Увеличение si
Декрементирование счетчика цикла
Enter
Рисунок 5 – Блок – схема вывода
3.5 Текст программы
.286
len11=4d
len12=2d
len21=5d
len22=3d
Data Segment
X1 DB 4 dup(?)
X2 DB 2 dup(?)
Y1 DB 6 dup(0)
X3 DB 5 dup(?)
X4 DB 3 dup(?)
Y2 DB 8 dup(0)
Mes1 db 'first number: ', '$'
Mes2 DB 'second number : ', '$'
NextLine DB ' ',0Dh, 0Ah, '$'
mes3 db 'first pair : ', '$'
mes4 db 'second pair: ', '$'
mes5 db 'rezult :', '$'
Data EndS
Stack Segment
dw 64 dup(?)
StkTop Label Word
Stack EndS
Code Segment
Assume CS:Code,SS:Stack,ES:Data,DS:Data
inputData proc
mov bp,sp
mov cx,[bp+2]
mov si,[bp+4]
LEA DX, MES1
MOV AH, 09H
INT 21H
;-------------------ввод--переменных-------------------------------------
l:
l1: mov ah,0h
int 16h
cmp al,0
je l1
cmp al,' '
je l1
cmp al, '0'
jb l1
cmp al, '9'
jbe L_num
cmp al, 'A'
jb l1
cmp al, 'F'
jbe l_AF
jmp l1
l_num:
; ввод цифры
sub AL,30h
mov byte ptr [SI], AL
inc SI
MOV AH, 0eH
add al, 30h
INT 10H
jmp l_end
l_AF:
; ввод большой буквы из диапазона
sub al, 37h
mov byte ptr [SI], AL
inc SI
MOV AH, 0EH
add al, 37h
INT 10H
l_end:
; завершение ввода цифры
dec cx
JNZ l
ret 4
inputData endp
;-------------------вывод--переменной-------------------------------------
outputData proc
mov bp, sp
mov cx, [bp+2]
mov si, [bp+4]
l_v:
MOV DL, byte ptr[SI]
cmp dl, 9h
ja l_C
MOV AH, 06h
add dl, 30h
int 21h
jmp l_E
l_C:
MOV AH, 06h
add dl, 37h
int 21h
l_E: inc SI
dec CX
jnz l_v
lea dx, nextline
mov ah,09h
int 21h
ret 4
outputData endp
ProgramStart PROC
push bp
MOV bp,sp ;привязка к верхушке стека
MOV BX,[BP+4]
MOV DI,[BP+6]
MOV SI,[BP+8]
MOV CX,[BP+10]
m1: MOV SI, [BP+8]
PUSH CX
PUSH BX
MOV Ah,dh
mov al,ah
mov ah,0
MOV CX,AX
xor ax,ax
m2:
MOV AL, byte ptr [SI]
MUL byte ptr [DI]
AAM
ADC AL, byte ptr [BX]
AAA
MOV byte ptr [BX],AL
MOV AL,AH
clc
ADC AL,byte ptr[BX-1]
AAA
MOV byte ptr [BX-1],AL
MOV DL,byte ptr [BX-1]
DEC SI
DEC BX
DEC CX
JNZ m2
DEC DI
POP BX
DEC BX
POP CX
DEC CX
JNZ m1
MOV BX,[BP+4]
POP BP
ret 8
ProgramStart ENDP
Start:
;-------------------------------------инициализация--------------------------------------
MOV AX, Data
MOV DS, AX
MOV ES, AX
MOV AX, Stack
MOV SS, AX
MOV SP, offset StkTop
;------------------------ввод первой пары чисел--4--и--2-------------------------------
push offset x1
push len11
call inputData
lea dx, nextline
mov ah,09h
int 21h
push offset x2
push len12
call inputData
; -----------------------умножение ------------------------------------
mov dh, 4
push len12
push offset x1+type x1*3
push offset x2+type x2
push offset y1+type y1*5
call ProgramStart
lea dx, nextline
mov ah,09h
int 21h
Lea dx, mes5
mov ah, 09h
int 21h
push offset y1
mov al, len11
add al, len12
xor ah, ah
push ax
call OutputData
;------------------------ввод второ пары чисел--5--и--3--------------------------------
lea dx, nextline
mov ah,09h
int 21h
push offset x3
push len21
call inputData
lea dx, nextline
mov ah,09h
int 21h
push offset x4
push len22
call inputData
; --------------------------------умножение ---------------------------
mov dh, 5
push len22
push offset x3+type x3*4
push offset x4+type x4*2
push offset y2+type y2*7
call ProgramStart
lea dx, nextline
mov ah,09h
int 21h
Lea dx, mes5
mov ah, 09h
int 21h
push offset y2
mov al, len21
add al, len22
xor ah, ah
push ax
call OutputData
;---------------------------------------------------------------------------
mov ah,01h
int 21h
mov ax,4c00h
int 21h
Code EndS
End Start