Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мет_ук_Ассемблер.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
311.81 Кб
Скачать

3.Лабораторная работа 2. Программа табулирования функций, использующая ввод чисел с клавиатуры.

Целью лабораторной работы является изучение команд сравнения, передачи управления, а также процедур, осуществляющих ввод чисел с клавиатуры.

Для выполнения этой лабораторной работы следует использовать текст программы “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

Для защиты лабораторной работы нужно знать

  1. Команды сравнения и передачи управления.

  2. Все процедуры, использованные в программе. Особое внимание обратить на процедуры VVOD, CONV_AB, ASCII_BIN, ReadKeys.

Варианты заданий:

1. Y= A2+B/(C-S), если 0<С-S<3

A*B+S во всех остальных случаях

С меняется от CN до СК с шагом DELC.

  1. 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.