Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра «Електронні обчислювальні машини»
Лабораторна робота №6
“Використання макрокоманд та процедур.
Ввід даних з клавіатури та вивід результату на екран.”
з дисципліни:
“ Засоби системного програмування”
Львів - 2013
Мета роботи:
Мета: набути навиків написання макрокоманд та процедур на Асемблері, освоїти способи передачі параметрів. Реалізувати ввід та вивід даних в десятковій системі числення.
ЗАВДАННЯ:
1. Створити *.exe програму, яка реалізовує обчислення, заданого варіантом виразу над даними, введеними в десятковій системі і результат виводить на екран в десятковій формі.
Програма повинна складатися з трьох основних підпрограм:
процедура вводу - забезпечує ввід даних з клавіатури в десятковій формі і їх перевід у двійкове значення ;
процедура безпосередніх обчислень – здійснює всі необхідні арифметичні дії у двійковій системі;
процедура виводу – забезпечує перевід війкового результату у десятковий формат та вивід на екран.
Передача параметрів може здійснюватися довільним чином. Кожна з перерахованих процедур може містити довільну кількість додаткових підпрограм.
Вхідні операнди А, В, С, D, E, F вважати беззнаковими і довжиною в байтах, згідно з індексу. К – константа, довжина якої визначається значенням(згідно варіанту).
2. Переконатися у правильності роботи кожної процедури зокрема та програми загалом.
3. Скласти звіт про виконану роботу з приведенням тексту програми та коментарів до неї.
4. Дати відповідь на контрольні запитання.
Мій Варіант 11
11
X=(A4-B3-K)*D1+E4/F2
311
Код програми:
DOSSEG
.MODEL SMALL
MY_MUL MACRO X,Y,Z
mov z,0
mov z+2,0
MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX, X+2
MUL Y
ADD Z+2,AX
mov ax,Z
mov dx,Z+2
ENDM
.STACK 100h
.DATA
K EQU 0311h
A dd 0000h
B dd 0000h
D db 0000h
E dd 0000h
F dw 00h
Temp1 dw 00h,00h
Temp2 dw 00h, 00h
Temp3 dw 00h
Temp4 dw 00h
temp5 dw 00h
X dw 00h,00h,00h
X_Str db 10 dup (0)
TempStr db 10 dup (0)
TempBin dw 0,0
MaxLen dw 0
X_div2 dw 0,0
Y_div2 dw 0
MESSG_X DB 13,10,'X=(A4-B3-K)*D1+E4/F2 K=311h,785d','$'
MESSG_A DB 13,10,'A= ','$'
MESSG_B DB 13,10,'B= ','$'
MESSG_D DB 13,10,'D= ','$'
MESSG_E DB 13,10,'E= ','$'
MESSG_F DB 13,10,'F= ','$'
MESSG_X1 DB 13,10,'X= ','$'
erStr1 db 13,10,'Data not input_variable',13,10,'$'
erStr2 db 13,10,'Incorrectly data ',13,10,'$'
erStr2_1 db 13,10,' D =0 --> divide by zero ',13,10,'$'
erStr3 db 13,10,'Data is too long ',13,10,'$'
Mult10 dw 1,0
my_z dw 0,0
.CODE
start:
mov ax,@data
mov ds,ax
call input
call calculation
call output
mov ah,01
int 21h
mov ah,4Ch
int 21h
input proc
LEA DX,MESSG_X
MOV AH,09
INT 21H
LEA DX,MESSG_A
MOV AH,09
INT 21H
mov di,offset A
mov MaxLen,11
mov cx,MaxLen
call input_variable
LEA DX,MESSG_B
MOV AH,09
INT 21H
mov di,offset B
mov MaxLen,11
mov cx,MaxLen
call input_variable
LEA DX,MESSG_D
MOV AH,09
INT 21H
mov di,offset D
mov MaxLen,3
mov cx,MaxLen
call input_variable
cmp D,0
jne dali
mov ah,09
mov dx, offset erStr2_1
int 21h
mov ah,4Ch
int 21h
dali: LEA DX,MESSG_E
mov AH,09
int 21H
mov di,offset E
mov MaxLen,11
mov cx,MaxLen
call input_variable
LEA DX,MESSG_F
MOV AH,09
INT 21H
mov di,offset F
mov MaxLen,5
mov cx,MaxLen
call input_variable
ret
input endp
calculation proc
xor ax,ax
xor bx,bx
xor cx,cx
xor dx,dx
mov bx, offset A
mov ax, [bx+2]
mov bx, offset B
mov cx, [bx+2]
mov temp1+2, cx
;A-B=Temp1
sub ax, cx
mov dx, ax
mov bx, offset A
mov ax, [bx]
mov bx, offset B
mov cx, [bx]
sub ax, cx
sbb dx,0
clc
mov temp1, ax
;temp1 - K = temp2
mov ax, Temp1
mov bx, temp1+2
mov cx, K
sub ax, cx
sbb bx,0
clc
mov Temp2,ax
mov temp2+2,bx
;Temp2*D=Temp3
mov ax, temp2
xor bx, bx
mov bl, D
mul bx
mov temp3, ax
mov temp4, dx
mov X, ax
xor cx, cx
mov ax, temp2+2
mul bx
add ax,temp4
adc dx, 0
mov ax, temp4
mov dx, temp5
mov ax, temp3
mov ax, temp4
mov ax, temp5
; E/F=Temp4
mov bx, offset E
mov ax, [bx]
mov dx, [bx+2]
div F
mov Temp1, ax
mov ax,0
;Temp3+Temp4= X
xor ax,ax
xor bx,bx
xor cx,cx
mov ax, Temp3
add ax, Temp1
mov bx, temp3
mov X, ax
mov ax, temp4
mov X+2, ax
mov ax, temp5
mov X+4, ax
ret
calculation endp
input_variable PROC
mov si,0
In_00: mov ah,01
int 21h
cmp al,0Dh
je In_1
In_0: mov dl,al
call CHECK_BYTE
mov TempStr[si],dl
inc si
loop In_00
In_1: push si
dec si
cmp cx,MaxLen
jne In_2
call Err1
In_2: mov bh,0
mov bl,TempStr[si]
MY_MUL Mult10,bx,my_z
add TempBin,ax
adc TempBin+2,dx
mov bh,0
mov bl,10
MY_MUL Mult10,bx,my_z
mov Mult10,ax
mov Mult10+2,dx
dec si
cmp si,0
jge In_2
mov ax, TempBin
mov dx,TempBin+2
pop si
cmp si,MaxLen
jl In_3
cmp MaxLen,10
jl In_2_1
js In_Err
cmp dx,0FFFFh
ja In_Err
jmp In_3
In_2_1: cmp MaxLen,5
jl In_2_2
cmp dx,00
ja In_Err
cmp ah,0ffh
ja In_Err
jmp In_3
In_2_2: cmp ax,00FFh
jbe In_3
In_Err: LEA DX,erSTR3
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
In_3: mov [di],ax
mov [di+2],dx
mov TempBin,0
mov TempBin+2,0
mov Mult10,1
mov Mult10+2,0
RET
input_variable ENDP
Err1 PROC
PUBLIC Err1
LEA DX,erSTR1
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
RET
Err1 ENDP
CHECK_BYTE PROC
PUBLIC CHECK_BYTE
sub dl,30h
cmp dl,00
jl ErS
cmp dl,0Ah
jl GO
ErS: LEA DX,erSTR2
MOV AH,09
INT 21H
mov ah,4Ch
int 21h
GO: RET
CHECK_BYTE ENDP
MY_DIV2 proc
sub cx,cx
sub bx,bx
mov dx,X_div2+2
mov ax,X_div2
M2_D1:
cmp dx,Y_div2
jb M2_D3
sub ax,Y_div2
sbb dx,00
add cx,01
adc bx,0
jmp M2_D1
M2_D3:
div Y_div2
add cx,ax
adc bx,00
ret
MY_DIV2 ENDP
output PROC
mov di,0
mov Y_div2,10
mov cx,X
mov bx,X+2
O_1: mov X_div2,cx
mov X_div2+2,bx
call my_div2
add dl,30h
mov X_Str[di],dl
inc di
cmp bx,0
ja O_1
cmp cx,10
jae O_1
add cl,30h
mov X_Str[di],cl
mov dx,offset MESSG_X1
mov ah,09
int 21h
O_2:
mov dl,X_Str[di]
mov ah,02h
int 21h
dec di
jge O_2
ret
output ENDP
end start
Результати виконання програми:
/
Висновок:
У цій лабораторній роботі я освоїв використання макрокоманд та процедур на Асемблері, освоїти способи передачі параметрів. Реалізувати ввід та вивід даних в десятковій системі числення. Набув вміння використовувати арифметичні команди над знаковими даними та команди логічних операцій.