Целью лабораторной работы является изучение команд сравнения, передачи управления, а также процедур, осуществляющих ввод чисел с клавиатуры.
Для выполнения этой лабораторной работы следует использовать текст программы “Labn2.ASM”. В сегмент данных вписать свои переменные и их значения. В сегмент кодов в процедуру MAIN ввести операторы, выполняющие действия, соответствующие индивидуальному заданию.
Ниже приведен пример выполнения следующего задания:
Вычислить Y= A+B*X, если Х<0
A-X, если Х>=0
Контрольный пример:
Пусть А=2, В=4, Х начальное =-2, Х конечное =2, шаг изменения Х=1.
Ответы:
У=-6 Х=-2
У=-2 Х=-1
У=2 Х=0
У=1 Х=1
У=0 Х=2
Блок-схема приведена на рис.1.
Рис.1. Блок-схема к лабораторной работе 2.
Текст программы:
;****************************************************
;вычислить У в зависимости от Х.
; / A+B*Х, если Х<0
;Y = |
; \ A-X, если X>=0
; Х меняется от Xn до Xk c шагом Dx
;****************************************************
DSEG SEGMENT
;индивидуальные данные - начало
TextA db 'Введите А : $'
TextB db 'Введите В : $'
TextXn db 'Введите Xn : $'
TextXk db 'Введите Xk : $'
TextDx db 'Введите шаг X : $'
X dw ?
A dw ?
B dw ?
Xn dw ?
Xk dw ?
Delx dw ?
TextPA db 'A=$'
TextPB db 'B=$'
TextPXn db 'Xn=$'
TextPXk db 'Xk=$'
TextPDx db 'шаг=$'
TextPY db 'Y=$'
TextPX db 'X=$'
; индивидуальные данные - конец
Y dw ?
User_String db 10,11 dup (?)
Text10 db 'Строка слишком длинная',10,13,'$'
Text20 db 'Число вне допустимого диапазона',10,13,'$'
Text30 db 'Недопустимый символ - '
Symv db ' ',10,13,'$'
Text40 db 'Повторите ввод',10,13,'$'
New_Line db 10,13,'$'
Ish db 'Исходные данные: ',10,13,'$'
Buffer db 6 dup (?),'$'
Otw db 'Результат : ',10,13,'$'
Pr1 db ' $'
DSEG ENDS
Stacks segment
dw 100 dup (?)
Stacks ends
Codes segment
MAIN PROC far
Assume CS:codes, DS:dseg, SS:stacks
Mov AX,Dseg
Mov DS,AX
; индивидуальная часть программы - начало
;======================
LEA DX,TextA
CALL PRT ; печать 'введите А'
CALL VVOD
Mov A,AX
CALL NL ;перевели строку
;======================
LEA DX,TextB
CALL PRT ;печать 'введите B'
CALL VVOD
Mov B,AX
CALL NL ;перевели строку
;======================
LEA DX,TextXn
CALL PRT ;печать 'введите Xn'
CALL VVOD
Mov Xn,AX
CALL NL ;перевели строку
;======================
LEA DX,TextXk
CALL PRT ;печать 'введите Xk'
CALL VVOD
Mov Xk,AX
CALL NL ;перевели строку
;======================
LEA DX,TextDx
CALL PRT ;печать 'введите Dx'
CALL VVOD
Mov DelX,AX
CALL NL ;перевели строку
;======================
LEA DX,Ish
CALL PRT ;печать 'исходные данные'
;\\\\\\\\\\\\\\\\\\\\\\\
LEA DX,TextPA
CALL PRT ;печать 'A = '
Mov AX,A
CALL PRN
CALL NL ;перевели строку
;\\\\\\\\\\\\\\\\\\\\\\\
LEA DX,TextPB
CALL PRT ;печать 'B = '
Mov AX,B
CALL PRN
CALL NL ; перевели строку
;\\\\\\\\\\\\\\\\\\\\\\\
LEA DX,TextPXn
CALL PRT ;печать 'Xn = '
Mov AX,Xn
CALL PRN
CALL NL ; перевели строку
;\\\\\\\\\\\\\\\\\\\\\\\
LEA DX,TextPXk
CALL PRT ;печать 'Xk = '
Mov AX,Xk
CALL PRN
CALL NL ;перевели строку
;\\\\\\\\\\\\\\\\\\\\\\\
LEA DX,TextPDx
CALL PRT ;печать 'Dx = '
Mov AX,DelX
CALL PRN
CALL NL ; перевели строку
LEA DX,Otw
CALL PRT ;печать 'ответ :'
Mov AX,Xn ;блок 2
Mov X,AX
BL3:
CMP X,0
JL BL4 ;если X< 0, то на блок 4
Mov AX,A ;блок 5
SUB AX,X
Mov Y,AX ;в Y получаем ответ
JMP BL6 ;безусл переход на BL6
BL4:
Mov AX,X ;блок 4
IMUL B
ADD AX,A
Mov Y,AX ;в Y получаем ответ
;--------------------------
BL6:
LEA DX,TextPY
CALL PRT ;печать 'Y = '
Mov AX,Y ;печать значение У
CALL PRN
CALL probel ; пробелы
LEA DX,TextPX
CALL PRT ;печать 'X = '
Mov AX,X ;печать значение X
CALL PRN
CALL NL ; перевели строку
;--------------------------
Mov AX,X ;блок 7
Add AX,DelX
Mov X,AX
CMP AX,Xk ; блок 8
JG FIN
JMP BL3
FIN:
mov ah,1
int 21h
Mov AH,4CH
Int 21h
; индивидуальная часть программы – конец
MAIN ENDP
;********************************************
CONVBA PROC ; процедура преобразования числа из
;двоичного кода в строку ASCII-кодов
…
CONVBA endp
;********************************************
ReadKeys PROC ; процедура ввода символов с клавиатуры в
; поле User_String. В результате получаем в регистре DX адрес начала
; введенной строки, а в регистре СХ – количество введенных символов.
; Процедура “портит” регистры DX и CX.
push AX
LEA DX,User_String
Mov AH,0AH
Int 21h
Sub CH,CH
Mov CL,User_String+1
Add DX,2
POP AX
RET
ReadKeys ENDP
;********************************************
VVOD PROC ; процедура ввода чисел с клавиатуры и преобразования их в ; формат двоичного числа со знаком.
Inp:
Push dx
Push bx
Push ax
Push di
CALL ReadKeys ; ввод числа с клавиатуры
Mov BX,DX
CALL ASCII_BIN ; преобразование числа в двоичный формат
JNC Valid
CMP DI,00FFH ; проверки на ошибки ввода
JNE Inv_Char
OR AX,AX
JNZ Range_Er
LEA DX,Text10
Mov AH,09h
Int 21h
JMP Povtor
Range_Er:
LEA DX,Text20
Mov AH,09h
Int 21h
JMP Povtor
Inv_Char:
LEA DX,Text30
Mov AL,[DI]
Mov Symv,AL
Mov AH,09h
Int 21h
Povtor:
LEA DX,Text40
Mov AH,09h
Int 21h
JMP Inp
Valid:
Pop di
Pop ax
Pop bx
Pop dx
RET
VVOD ENDP
;********************************************
ASCII_BIN PROC ; процедура преобразования десятичного числа, ;записанного в ASCII-кодах, в двоичное число.
push BX
push CX
Sub AX,AX
Sub DX,DX
Mov DI,00FFH
CMP CX,7
JG No_Good
Blanks:
CMP byte PTR[BX],' '
JNE Chk_Neg
Inc BX
Loop Blanks
Chk_Neg:
CMP byte PTR[BX],'-'
JNE Chk_Pos
Inc BX
Dec CX
CALL CONV_AB
JC Thru
CMP AX,32768
JA No_Good
Neg AX
JS Good
Chk_Pos:
CMP byte PTR[BX],'+'
JNE Go_Conv
Inc BX
Dec CX
Go_Conv:
CALL CONV_AB
JC Thru
CMP AX,32767
JA No_Good
Good:
CLC
JNC Thru
No_Good:
STC
Thru:
POP CX
POP BX
RET
ASCII_BIN ENDP
;********************************************
CONV_AB PROC ; процедура, выполняющая собственно преобразование ;числа в формат двоичного.
push BP
push BX
push SI
Mov BP,BX
Sub BX,BX
Chk_Pt:
CMP DX,0
JNZ Range
CMP byte PTR DS:[BP],'.'
JNE Range
Dec CX
Mov DX,CX
JZ End_Conv
Inc BP
Range:
CMP byte PTR DS:[BP],'0'
JB Non_Dig
CMP byte PTR DS:[BP],'9'
JBE Digit
Non_Dig:
Mov DI,BP
STC
JC End_Conv
Digit:
Mov SI,10
push DX
MUL SI
POP DX
Mov BL,DS:[BP]
And BX,0FH
Add AX,BX
JC End_Conv
Inc BP
LOOP Chk_Pt
CLC
End_Conv:
POP SI
POP BX
POP BP
RET
CONV_AB Endp
; ****************************************
prt proc ; процедура печати текста
…
prt endp
; ****************************************
prn proc; процедура печати числа
…
prn endp
; *****************************************
NL proc ; процедура перевода строки
push dx
lea dx,NEW_LINE
CALL PRT
pop dx
ret
NL endp
;******************************************
PROBEL proc ; процедура, выполняющая печать пробелов.
push dx
lea dx,pr1
CALL PRT
pop dx
ret
PROBEL endp
; ******************************************
CODES ENDS
END MAIN
Для защиты лабораторной работы нужно знать
Команды сравнения и передачи управления. Все процедуры, использованные в программе. Особое внимание обратить на процедуры VVOD, CONV_AB, ASCII_BIN, ReadKeys.
Варианты заданий:
1. Y= A2 +B/(C-S), если 0<С-S<3
A*B+S во всех остальных случаях
С меняется от CN до СК с шагом DELC.
Y= A*(A+C), если C+D>=0 100/!C+D!, если C+D<0 С меняется от CN до СК с шагом DELC.
3. Y= (A-B)/C+S, если 0<С<3 C*(A-B) во всех остальных случаях
С меняется от CN до СК с шагом DELC.
4. Y= A+B*S/C, если 0<С<3 A-B*C во всех остальных случаях С меняется от CN до СК с шагом DELC.
5. Y= A+(B-C)*D, если 0<=С<2 A+B/C во всех остальных случаях
С меняется от CN до СК с шагом DELC.
6. Y= (A+B)*(C-D), если C-D>=0 !100/(C-D)!, если C-D<0 С меняется от CN до СК с шагом DELC.
7. Y= A2 +(B-C)/2, если C>0 B-C, если С>=0 С меняется от CN до СК с шагом DELC.
8. Y= A/B+C, если B>0 A*!B!, если B<=0 B меняется от BN до BК с шагом DELB.
9. Y=A-B*C, если B<=0 D/S+A/B, если B>0 B меняется от BN до BК с шагом DELB.
10. Y= A*(B+C) , если B+C>=0 D/(B+C) , если B+C<0 С меняется от CN до СК с шагом DELC.
11. Y= (A-B)/S+C2 , если 0<S<3 A-B во всех остальных случаях S меняется от SN до SК с шагом DELS.
12. Y= B2 +C2 , если 0<B<3 (B+C)/3 во всех остальных случаях B меняется от BN до BК с шагом DELB.
13. Y=A+B2 /C, если 0<С<=3 C-A, если C>3 !C!, если C<=0 С меняется от CN до СК с шагом DELC.
14. Y=A+(B-C)/D, если 0<D<3 !D!, если D<=0 0, если D>=3 D меняется от DN до DК с шагом DELD.
15. Y= A-B*C, если C>=0 D/!C!+A, если C<0 С меняется от CN до СК с шагом DELC.
16. Y= A/(B+C), если 0<B+C<3 A*(B+C), если B+C>=3 !B+C!, если B+C<=0 С меняется от CN до СК с шагом DELC.
17. Y= A2 +B/D2 , если 0<D<3
A-B во всех остальных случаях D меняется от DN до DК с шагом DELD.
18. Y= S/A+B, если 0<A<3 A-B*C во всех остальных случаях A меняется от AN до AК с шагом DELA.
19. Y=A/B+C/S, если 0<B<3 A*(B+C) во всех остальных случаях B меняется от BN до BК с шагом DELB.
20. Y=(A-B)*C/S, если S>0 S2 , если S<=0
S меняется от SN до SК с шагом DELS.
21. Y= A+X*B, если A>=0 X2 /A, если A<0
A меняется от AN до AК с шагом DELA.
22. Y=!A-B!/C, если C>0 C2 , если C<=0
C меняется от CN до CК с шагом DELC.
23. Y= A/B2 , если B>0 A+!B!*C, если B<=0
B меняется от BN до BК с шагом DELB.
24. Y=A/(B*C), если C>0 C+A, если C<=0
C меняется от CN до CК с шагом DELC.
25. Y= B2 +C, если 0<B<3 (B+C)/2 во всех остальных случаях B меняется от BN до BК с шагом DELB.
26. Y= A2 +B/S, если 0<S<3 S-A во всех остальных случаях S меняется от SN до SК с шагом DELS.
27. Y=A*X2 +B, если X+B>=0
!A/(X+B)!, если X+B<0 X меняется от XN до XК с шагом DELX.
28. Y=A/B+C/S, если 0<B<3 A*!B!+C во всех остальных случаях B меняется от BN до BК с шагом DELB.
29. Y=A/(B+C), если C>0 !C!-A, если C<=0
C меняется от CN до CК с шагом DELC.
30. Y= B+C, если 0<B<3 !B+C!/2 во всех остальных случаях B меняется от BN до BК с шагом DELB.