epd629
.pdfПриложение 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