Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

epd629

.pdf
Скачиваний:
17
Добавлен:
02.05.2015
Размер:
1.05 Mб
Скачать

Приложение 2

Пример работы № 3

;================================================================ ; l_3bnn.asm, Работа №3

;выполнена студентом 1 курса СибАДИ группы 11 БИ

;Буслаевым Н.Н. (здесь чужого кода еще меньше) ;================================================================

codesg segment para 'Code'

;начало сегмента кода

assume cs:codesg,ds:codesg,ss:codesg

org

100h

 

 

start: jmp

begin

;обход данных

soob1 db ' Программа расчёта по формулам',0ah,0dh,'$'

soobform1

db '#1 b1*b2*b3-d1/b3+w1+w2',0ah,0dh,'$'

soobform3

db '#3 логический сдвиг слова влево на 2',0ah,0dh,'$'

soobform4

db '#4

арифметический сдвиг двойного слова вправо на 3',0ah,0dh,'$'

soobform5

db '#5

циклический сдвиг байта влево на 4',0ah,0dh,'$'

soobform6 db '#6 циклический сдвиг слова вправо через флаг переноса на

5',0ah,0dh,'$'

soobform34 db '#34 w1 or w2 ',0ah,0dh,'$' soobform35 db '#35 w1 xor w2 ',0ah,0dh,'$' soobform49 db '#49 w13 and b13 ',0ah,0dh,'$' soobform57 db '#57 w19 and not(b16) ',0ah,0dh,'$' soobform62 db '#62 w21 and neg(w2) ',0ah,0dh,'$'

soobformnum db 'Введите, пожалуйста номер формулы: $'

soobCFval1 db 'Флаг CF содержит 1 $' soobCFval0 db 'Флаг CF содержит 0 $' soobCFent db 'Введите значение флага CF: $'

soob_vixod db 'Для выхода нажмите любую клавишу! ', '$' soobformerr db 'Формулы с таким номером не существует! $'

X

db

1

 

CFval db

0

 

b1

db 5

 

;_____________________________

b2

db 2

 

 

b3

db 1

 

 

w1

dw 1

 

 

w2

dw 1

 

 

d1

dd 1

 

 

b13

db 1

 

 

b16

db 1

 

 

w13

dw 1

 

 

w19

dw 1

 

 

w21

dw 1

 

 

rezult

dd

0

;_____________________________

res

dd

0

 

res1w

dw

0

 

res2

dd

0

 

71

namepar_b

label

byte ;_____________________________

maxlen_b

db

4

faktlen_b

db

?

namefld_b

db

4 dup(' ')

namepar_w label byte ;_____________________________

maxlen_w db 6 faktlen_w db ? namefld_w db 6 dup(' ')

namepar_d label byte ;_____________________________

maxlen_d db 12 faktlen_d db ? namefld_d db 12 dup(' ')

binval_b dw 0

 

;_____________________________

binval_w dw 0

 

 

binval dd 0

 

 

 

binval_d dw 0

 

 

 

dw

0

 

 

ascval db '00000000000000000000','$'

kol dd 0

 

 

 

ln

db

0

 

 

del

dd

0

 

 

soob2 db

'Введите b1 ','$'

;_____________________________

soob3 db

'Введите b2 ','$'

 

soob4 db

'Введите b3 ','$'

 

soob5 db

'Введите b13 ','$'

 

soob6 db

'Введите b16 ','$'

 

soob7 db

'Введите w1 ','$'

 

soob8 db

'Введите w2 ','$'

 

soob11 db

'Введите d1 ','$'

 

;soobask db

'Ещё раз вычислять будем ? Если да, нажмите "1"',0ah,0dh,'$'

strerr1 db

'Ошибка! Значение больше 127',0ah,0dh,'$'

strerr2 db

'Ошибка! Значение больше 32767',0ah,0dh,'$'

strerr3 db

'Ошибка! Значение больше 2147483647',0ah,0dh,'$'

strerr4 db

'Недопустимое значение CF! $'

mult10 dw

1

 

;_____________________________

 

dw

0

 

 

;область DTA

 

 

reclen

 

equ

20

 

namepar

label

byte

 

maxlen

db

reclen

 

namelen

db

?

 

namedta

db

reclen dup (' ')

;блок управления файлом FCB

fcbrec label

byte

 

;FCB для дискового файла

fcbdriv

db 03

 

; дисковод C

fcbname

db

'result00'

; имя файла

fcbext

db

'txt'

; тип файла

 

 

 

72

fcbblk

dw

0

; номер текущего блока

fcbrcsz

dw

?

; размер логической записи

fcbflsz

dd

?

; размер файла (DOS)

 

dw

?

; дата (DOS)

 

dt

?

; зарезервировано (DOS)

fcbsqrc

db

0

; номер текущей записи

 

dd

?

; относительный номер

begin proc

far

 

;главная процедура ;_________________________

;mov ln,1

 

mov

ax,0600h

;очистка экрана

 

mov

bh,011

 

 

mov

cx,0000

 

 

mov

dx,184fh

 

 

int

10h

 

 

call

stroka

 

 

call

himess

 

entfnum:

 

 

 

call

entx

; ввод и преобразование номера формулы (Х)

 

mov

maxlen_b,4

 

 

mov

word ptr namefld_b, 2020h

 

cmp

x,1

;вычисление по формуле 1?

 

jnz

f34

; нет

 

call

entb1

; ввод и преобразование b1

 

call

entb2

; ввод и преобразование b2

 

call

entb3

; ввод и преобразование b3

 

call

entw1

; ввод и преобразование w1

 

call

entw2

; ввод и преобразование w2

 

call

entd1

; ввод и преобразование d1

 

call

form1

;вызов процедуры вычислений по формуле 1

 

jmp

rgn

 

f34:

cmp

X,34

 

 

jnz

f35

 

 

call

entw1

 

 

call

entw2

 

 

call

form34

 

 

jmp

rgn

 

f35:

cmp

X,35

 

 

jnz

f49

 

 

call

entw1

 

 

call

entw2

 

 

call

form35

 

 

jmp

rgn

 

f49:

cmp

X,49

 

 

jnz

f57

 

 

call

entw13

 

 

call

entb13

 

 

call

form35

 

 

jmp

rgn

 

f57:

cmp

X,57

 

 

 

 

73

 

jnz

f62

 

 

 

call

entw19

 

 

 

call

entb16

 

 

 

call

form57

 

 

 

jmp

rgn

 

 

f62: cmp

X,62

 

 

 

jnz

f3

 

 

 

call

entw21

 

 

 

call

entw2

 

 

 

call

form62

 

 

 

jmp

rgn

 

 

f3:

cmp

X,3

 

 

 

jnz

f4

 

 

 

call

entw1

 

 

 

call

form3

 

 

 

jmp

rgn

 

 

f4:

cmp

X,4

 

 

 

jnz

f5

 

 

 

call

entd1

 

 

 

call

form4

 

 

 

jmp

rgn

 

 

f5:

cmp

X,5

 

 

 

jnz

f6

 

 

 

call

entb1

 

 

 

call

form5

 

 

 

jmp

rgn

 

 

f6:

cmp

X,6

 

 

 

jnz

ferr

 

 

 

call

entw1

 

 

 

call

entcf

 

 

 

call

form6

 

 

 

jmp

rgn

 

 

ferr:

mov

ah,09h

 

 

 

lea

dx,soobformnumerr

 

 

int

21h

 

 

 

call

stroka

 

 

 

jmp

entfnum

 

 

rgn:

call

bin2asc

 

;вызов преобразования из bin в ascii

 

call

diskwrite

 

;вывод результата на диск

 

mov

ah,9

;\

 

 

lea

dx,ascval

 

; вывод на экран результата

 

int

21h

;/

 

 

call

stroka

 

 

 

cmp

X,6

 

 

 

jnz

mmmmm

 

 

 

call

printcf

 

 

mmmmm:

 

 

 

 

mov

ah,02

;\

| установка курсора

 

mov

bh,00

; \

| экран 0

 

mov

dh,24

; управление курсором | строка 23

 

 

 

 

74

 

mov

dl,00

; /

 

| столбец 00

 

int

10h

;/

 

| передача упр. в BIOS

 

mov

ah,09

 

 

 

 

lea

dx,soob_vixod

 

 

 

int

21h

 

 

 

 

mov

ah,0

 

;-ожидание нажатия клавиши

 

int

16h

;/

 

 

 

int

20h

 

 

 

;

ret

 

 

 

;передача управления в DOS

begin endp

 

 

 

;конец главной процедуры

diskwrite

proc

 

 

 

 

mov

ah,16h

 

;функция создания файла

 

lea

dx,fcbrec

 

 

 

 

int

21h

 

 

 

;

cmp

al,00

 

;есть место на диске?

;

jnz

c20

 

;

нет ошибка

 

mov

fcdrcsz,reclen

;размер записи (EQU)

;

lea

dx,namedta

;эагрузить адрес DTA

 

lea

dx,ascval

 

 

 

 

mov

ah,1ah

 

 

 

 

int

21h

 

 

 

 

mov

ah,15h

 

;функция записи

 

lea

dx,fcbrec

 

 

 

 

int

21h

 

 

 

 

mov

ah,10h

 

;функция закрытия

;

lea

dx,fcbrec

 

 

 

 

int

21h

 

 

 

 

ret

 

 

 

 

 

diskwrite endp

 

 

 

himess proc

 

 

 

 

 

 

mov

ah,09

 

;вывод на экран

 

lea

dx,soob1

 

;заслать в dx адрес soob1

 

int

21h

 

 

 

;

call

stroka

 

 

;вывод на экран

;

mov

ah,09

 

 

 

lea

dx,soobform1

;заслать в dx адрес soobform

 

int

21h

 

;прерывание (передача управления в BIOS)

;call stroka

lea

dx,soobform34

int

21h

;call stroka

lea

dx,soobform35

int

21h

;call stroka

lea

dx,soobform49

int

21h

;call stroka

 

lea

dx,soobform57

 

int

21h

;

call

stroka

 

75

lea

dx,soobform62

int

21h

;call stroka

lea

dx,soobform3

int

21h

;call stroka

lea

dx,soobform4

int

21h

;call stroka

lea

dx,soobform5

int

21h

;call stroka

lea

dx,soobform6

int

21h

;call stroka add ln,11 ret

himess endp

;************************************************************************ ; Процедура вычисления по формуле b1*b2*b3-d1/b3+w1+w2 ;************************************************************************

form1 proc

 

 

; Вычисление w1+w2:

 

 

xor

dx,dx

;dx=0

 

mov

ax,w1

;ax=w1

 

add

ax,w2

;ax =ax+w2=w1+w2

 

adc

dx,0

;dx=dx+0+CF

 

mov

word ptr rezult,ax

;(dx:ax)= w1+w2

 

 

 

mov

word ptr rezult+2,dx

;результат в rezult

; Вычисление b1*b2*b3

 

 

mov

al,b1

;al=b1

 

mul

b2

;ax=al*b2=b1*b2

 

mov

bl,b3

;bl=b3

 

xor

bh,bh

;bx=bl=b3

 

mul

bx

;(dx:ax)=ax*bx=b1*b2*b3

 

mov

word ptr res, ax

 

 

mov

word ptr res+2, dx

; результат в res

;

Вычисление d1/b3

 

 

mov

ax,word ptr d1

 

 

mov

dx,word ptr d1+2

 

 

mov

bL,b3

 

 

xor

bh,bh

 

 

div

bx

;(dx:ax)/bx

 

 

 

;частное в ax, остаток в dx

; можно по-другому: div bl

;ax/bl

 

mov

res1w,ax

; но частное в al, а остаток в ah

 

 

;

Вычисление res (b1*b2*b3) - d1/b3

 

 

 

 

76

 

mov

ax,word ptr res

 

 

mov

dx,word ptr res+2

;(dx:ax)=res

 

sub

ax,res1w

;ax=ax-res1w

 

sub

dx,0

 

;dx=dx-0-CF

;

mov

word ptr res,ax

;(dx:ax)= res - res1w

 

;

mov

word ptr res+2,dx

 

; Вычисление (b1*b2*b3-d1/b3) +

(w1+w2)

 

add

ax,word

ptr rezult

 

 

adc dx,word

ptr rezult+2

;прибавляем к (dx:ax) rezult

;

mov

word ptr rezult,ax

т.е. w1+w1

 

; заносим результат в rezult

 

mov

word ptr rezult+2,dx

 

; в итоге результат хранится в ячейке rezult (двойное слово) ret

form1 endp

;************************************************************************* ; Ввод и преобразование номера формулы (числа X) ;*************************************************************************

entx proc

 

 

 

 

 

Xb:

mov

ah,09

; вывод приглашения

 

 

lea

dx,soobformnum

 

 

 

 

int

21h

 

 

 

 

mov

ah,0Ah

; ввод с клавиатуры X

 

lea

dx,namepar_b

 

 

 

 

int

21h

 

 

 

 

call

stroka

 

 

 

 

call

asc2bin_byte

;перевод из ASCII в bin

 

xor

ax,ax

;переносим переведённый байт в X

 

mov

al,byte ptr binval_b

 

 

 

 

mov

X,al

 

 

 

;

mov

al,b1

;b1 сравниваем с 127

 

 

;

cmp

al,127

 

 

 

 

;

ja

Xm

 

;если >, то на метку Хm

e

Xm:

jmp

Xe

;если <= , то на метку Х

mov

ah,09

;вывод на экран

 

 

lea

dx,strerr1

;сообщения об ошибке

 

int

21h

 

 

 

Xe:

jmp

Xb

;переход на Xb

 

 

 

 

 

 

ret entx endp

;================================================================

;Процедура перевода из двоичного в ASCII

;(исправлено для перевода двойного слова...)

;чтобы преревести четверное, надо раскомментировать строчки

;================================================================

bin2asc proc

77

lea si,ascval[19]

m1:

;cmp word ptr rezult[6],0

;jne m2

;cmp word ptr rezult[4],0

;jne m2

cmp word ptr rezult[2],0 jne m2

cmp word ptr rezult,10 jnb m2

mov ax,word ptr rezult or al,30h

mov [si],al

dec si jmp m3

m2:

sub word ptr rezult,10 sbb word ptr rezult[2],0

;sbb word ptr rezult[4],0

;sbb word ptr rezult[6],0 add word ptr kol,1 adc word ptr kol[2],0

;adc word ptr kol[4],0

;adc word ptr kol[6],0 jmp m1

m3:

;cmp word ptr kol[6],0

;jne m4

;cmp word ptr kol[4],0

;jne m4

cmp word ptr kol[2],0 jne m4

cmp word ptr kol,0

jne m4

 

ret

; выход из процедуры bin2asc

m4:

mov ax,word ptr kol mov word ptr rezult,ax mov ax,word ptr kol[2] mov word ptr rezult[2],ax

;mov ax,word ptr kol[4]

;mov word ptr rezult[4],ax

;mov ax,word ptr kol[6]

;mov word ptr rezult[6],ax mov word ptr kol,0

mov word ptr kol[2],0

;mov word ptr kol[4],0

;mov word ptr kol[6],0 jmp m1

bin2asc endp

78

clrascval proc mov cx,20 mov si,19

clr1: and ascval[si],30h dec si

loop clr1 ret

clrascval endp

;=================================================================

asc2bin_byte proc

;процедура перевода из ASCII в bin для байта

mov

mult10,1

 

mov

binval_b,0

 

xor

ax,ax

 

xor

dx,dx

 

mov

cx,10

; фактор умножения

lea

si,namefld_b – 1

; адрес ascval

mov

bl,faktlen_b

; длина ascval

mov

bh,0

 

a21:

 

 

mov

al,[si+bx]

; выбрать ASCII-символ

and

ax,000Fh

; очистить зону тройки

mul

mult10

; умножить на фактор 10

add

binval_b,ax

; прибавить к двоичному

mov

ax,mult10

; вычислить следующий

mul

cx

; фактор умножения

mov

mult10,ax

 

dec

bx

; последний. ASCII-символ?

jnz

a21

; нет - продолжить

ret

 

 

asc2bin_byte endp

;================================================================

asc2bin_word proc

;процедура перевода из ASCII в bin для слова

mov

mult10,1

 

mov

binval_w,0

 

xor

ax,ax

 

xor

dx,dx

 

mov

cx,10

; фактор умножения

lea

si,namefld_w – 1

; адрес ascval

mov

bl,faktlen_w

; длина ascval

mov

bh,0

 

b20:

 

 

mov

al,[si+bx]

; выбрать ASCII-символ

and

ax,000Fh

; очистить зону тройки

mul

mult10

; умножить на фактор 10

add

binval_w,ax

; прибавить к двоичному

mov

ax,mult10

; вычислить следующий

mul

cx

; фактор умножения

mov

mult10,ax

 

 

 

79

dec

bx

; последний. ASCII-символ?

jnz

b20

; нет - продолжить

ret asc2bin_word endp

;================================================================

asc2bin_dword proc

 

 

 

 

 

 

;процедура перевода из ASCII в bin для двойного слова

comment @

mov

mult10,1

 

 

 

mov

binval_d,0

 

 

 

 

 

 

xor

ax,ax

 

 

 

 

 

 

 

 

 

 

 

 

xor

dx,dx

 

 

 

 

 

 

 

 

 

 

 

 

mov

cx,10

 

 

 

 

 

 

 

 

 

 

 

 

lea si,namefld_d-1

 

 

 

mov

bl,faktlen_d

 

 

 

 

mov

bh,0

 

 

 

 

 

 

 

 

 

abd20:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

mov

al,[si+bx]

 

 

 

 

and

ax,000fh

 

 

 

 

 

mov

DI,mult10

 

 

 

 

mul

DI

 

 

 

 

 

 

 

 

 

;mul mult10

add word ptr binval_d,ax adc word ptr binval_d+2,dx

mov

ax,mult10

mul

cx

 

 

mov

 

 

mult10,ax

dec

bx

 

 

jnz

abd20

 

ret

 

 

 

 

 

@

xor ax,ax xor bx,bx xor cx,cx xor dx,dx

mov word ptr binval_d,ax mov word ptr binval_d[2],ax mov word ptr mult10[2],ax mov word ptr mult10,1 mov al,faktlen_d

mov cl,al dec al mov si,ax

met1_d: mov bl,namefld_d[si] cmp bx,30h

jb error_d cmp bx,39h ja error_d and bl,0fh mov dx,0 mov ax,0

abd1: cmp bl,0

80

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]