русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

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


Дата добавления: 2014-11-27; просмотров: 787; Нарушение авторских прав


 

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

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

 

 



<== предыдущая лекция | следующая лекция ==>
Лабораторная работа 1. Вычисление арифметического выражения. | Лабораторная работа 3. Обработка одномерных массивов.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.299 сек.