Приложение 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
jz abd2
add ax,word ptr mult10 adc dx,word ptr mult10[2] dec bl
jmp abd1
abd2: add word ptr binval_d,ax adc word ptr binval_d[2],dx mov bl,9
mov dx,word ptr mult10[2] mov ax, word ptr mult10
abd3: cmp bl,0 jz abd4
add word ptr mult10,ax adc word ptr mult10[2],dx dec bl
jmp abd3 abd4: dec si
loop met1_d
mov dx,word ptr binval_d[2] mov ax,word ptr binval_d jmp end_error_d
error_d:
call stroka mov ah,09h lea dx,strerr3 int 21h
;mov osh_v,1 end_error_d:
ret asc2bin_dword endp
;*************************************************************************
;Перевод из ASCII в bin числа b1 ;*************************************************************************
entb1 proc b1b:
; |
вывод сообщения 'b1= ' |
|
||
|
mov ah,09 |
|
||
|
lea dx,soob2 |
|
||
|
int 21h |
|
||
; |
ввод с клавиатуры b1 |
|
||
|
mov ah,0Ah |
|
||
|
lea dx,namepar_b |
|
||
|
int 21h |
|
||
|
call stroka |
|
||
|
call asc2bin_byte |
;перевод из ASCII в bin |
||
|
xor ax,ax |
;переносим переведённый байт в b1 |
||
|
mov al,byte ptr binval_b |
|
||
|
mov b1,al |
|
||
|
; |
mov al,b1 |
|
;b1 сравниваем с 127 |
|
cmp al,127 |
|
||
|
|
|
|
81 |
ja b1m |
;если >, то на метку b1m |
jmp b1e |
;если <= , то на метку b1e |
b1m: |
|
mov ah,09 |
;вывод на экран |
lea dx,strerr1 |
;сообщения об ошибке |
int 21h |
|
jmp b1b |
; переход на B1B |
b1e: |
|
ret entb1 endp
;************************************************************************* ; Перевод из ASCII в bin числа b2 ;*************************************************************************
entb2 proc |
|
b2b: |
|
mov ah,09 |
; вывод сообщения: 'b2= ' |
lea dx,soob3 |
|
int 21h |
|
;ввод с клавиатуры b2 mov ah,0Ah
lea dx,namepar_b int 21h
;mov mult10,1
call stroka |
|
||
call asc2bin_byte |
;перевод из ASCII в bin |
||
xor ax,ax |
;переносим переведённый байт в b2 |
||
mov al,byte ptr binval_b |
|
||
mov b2,al |
|
||
; |
mov al,b2 |
|
;b2 сравниваем с 127 |
cmp al,127 |
|
||
ja b2m |
;если >, то на метку b2m |
||
jmp b2e |
;если <= , то на метку b2e |
||
b2m: |
|
|
|
mov ah,09 |
;вывод на экран |
||
lea dx,strerr1 |
;сообщения об ошибке |
||
int 21h |
|
||
jmp b2b |
; переход на b2b |
||
b2e: |
|
|
|
ret entb2 endp
;************************************************************************ ; Перевод из ASCII в bin числа b3 ;************************************************************************
entb3 proc |
|
b3b: |
|
mov ah,09 |
; вывод сообщения 'b3= ' |
lea dx,soob4 |
|
int 21h |
|
; ввод с клавиатуры b3 |
|
mov ah,0Ah |
|
|
82 |
lea dx,namepar_b int 21h
call stroka
;mov mult10,1
;перевод из ASCII в bin
call asc2bin_byte
; переносим переведённый байт в b3 xor ax,ax
mov al,byte ptr binval_b mov b3,al
;mov al,b3
cmp al,127 |
;b3 сравниваем с 127 |
ja b3m |
;если >, то на метку b3m |
jmp b3e |
;если <= , то на метку b3e |
b3m: |
|
mov ah,09 |
;вывод на экран |
lea dx,strerr1 |
;сообщения об ошибке |
int 21h |
|
jmp b3b |
; переход на b3b |
b3e: |
|
ret entb3 endp
;************************************************************************ ; Перевод из ASCII в bin числа b13 ;************************************************************************ entb13 proc
b13b:
;вывод сообщения 'b13= ' mov ah,09
lea dx,soob5 int 21h
;ввод с клавиатуры b13 mov ah,0Ah
lea dx,namepar_b int 21h
call stroka |
|
||
call asc2bin_byte |
;перевод из ASCII в bin |
||
xor ax,ax |
;переносим переведённый байт в b13 |
||
mov al,byte ptr binval_b |
|
||
mov b13,al |
|
||
; |
mov al,b13 |
|
;b13 сравниваем с 127 |
cmp al,127 |
|
||
ja b13m |
;если >, то на метку b13m |
||
jmp b13e |
;если <=, то на метку b13e |
||
b13m: |
|
|
|
mov ah,09 |
;вывод на экран |
||
lea dx,strerr1 |
;сообщения об ошибке |
||
int 21h |
|
|
|
jmp b13b |
; переход на b13b |
||
b13e: |
|
|
|
|
|
|
83 |
ret entb13 endp
;************************************************************************ ; Перевод из ASCII в bin числа b16 ;************************************************************************ entb16 proc
b16b:
;вывод сообщения 'b16= ' mov ah,09
lea dx,soob6 int 21h
;ввод с клавиатуры b16 mov ah,0Ah
lea dx,namepar_b int 21h
call stroka |
|
||
call asc2bin_byte |
;перевод из ASCII в bin |
||
xor ax,ax |
;переносим переведённый байт в b16 |
||
mov al,byte ptr binval_b |
|
||
mov b16,al |
|
||
; |
mov al,b16 |
|
;b16 сравниваем с 127 |
cmp al,127 |
|
||
ja b16m |
|
|
;если >, то на метку b16m |
jmp b16e |
;если <= , то на метку b16e |
||
b16m: |
|
|
|
mov ah,09 |
;вывод на экран |
||
lea dx,strerr1 |
;сообщения об ошибке |
||
int 21h |
|
|
|
jmp b16b |
; переход на b16b |
||
b16e: |
|
|
|
ret entb16 endp
;************************************************************************ ; Перевод из ASCII в bin числа w1 ;************************************************************************
entw1 proc |
|
|
|
|
w1b: |
|
|
|
|
mov ah,09 |
; вывод сообщения 'w1= ' |
|||
lea dx,soob7 |
|
|||
int 21h |
|
|||
; ввод с клавиатуры w1 |
|
|||
mov ah,0ah |
|
|||
lea dx,namepar_w |
|
|||
int 21h |
|
|||
call stroka |
|
|||
;mov mult10,1 |
|
|
;перевод из ASCII в bin |
|
call asc2bin_word |
||||
; |
xor ax,ax |
|
|
|
mov |
ax,binval_w |
;переносим переведённое значение в w1 |
||
mov w1,ax |
|
|||
|
|
|
|
84 |
;mov ax,w1
cmp ax,32767 |
;w1 сравниваем с 32767 |
ja w1m |
;если >, то на метку w1m |
jmp w1e |
;если <= , то на метку w1e |
w1m: |
|
mov ah,09 |
;вывод на экран |
lea dx,strerr2 |
;сообщения об ошибке |
int 21h |
|
jmp w1b |
; переход на w1b |
w1e: |
|
ret entw1 endp
;************************************************************************
; Перевод из ASCII в bin числа w2 ;************************************************************************
entw2 proc |
|
|
|
|
w2b: |
|
|
|
|
mov ah,09 |
; вывод сообщения 'w2= ' |
|||
lea dx,soob8 |
|
|||
int 21h |
|
|||
; ввод с клавиатуры w2 |
|
|||
mov ah,0Ah |
|
|||
lea dx,namepar_w |
|
|||
int 21h |
|
|||
call stroka |
|
|||
;mov mult10,1 |
|
|
;перевод из ASCII B BIN |
|
call asc2bin_word |
||||
xor ax,ax |
;переносим переведённый байт в w2 |
|||
mov ax, binval_w |
|
|||
mov w2,ax |
|
|||
; |
mov ax,w2 |
|
|
|
cmp |
ax,32767 |
|
;w2 сравниваем с 32767 |
|
ja w2m |
;если >, то на метку w2m |
|||
jmp w2e |
;если <= , то на метку w2e |
|||
w2m: |
|
|
|
|
mov ah,09 |
;вывод на экран |
|||
lea dx,strerr2 |
;сообщения об ошибке |
|||
int 21h |
|
|||
jmp w2b |
; переход на w2b |
|||
w2e: |
|
|
|
|
ret entw2 endp
;************************************************************************ ; Перевод из ASCII в bin числа w13 ;************************************************************************
entw13 proc |
|
w13b: |
|
mov ah,09 |
; вывод сообщения 'w13= ' |
lea dx,soob7 |
|
int 21h |
|
|
85 |
; ввод с клавиатуры w13 |
|
|||
mov ah,0Ah |
|
|||
lea dx,namepar_w |
|
|||
int 21h |
|
|||
call stroka |
|
|||
;mov mult10,1 |
|
|
;перевод из ASCII в bin |
|
call asc2bin_word |
||||
; |
xor ax,ax |
|
|
|
mov |
ax,binval_ |
w |
;переносим переведённый байт в w1 |
|
mov w1,ax |
|
;mov ax,w1
cmp ax,32767 |
;w13 сравниваем с 32767 |
ja w13m |
;если >, то на метку w13m |
jmp w13e |
;если <=, то на метку w13e |
w13m: |
|
mov ah,09 |
;вывод на экран |
lea dx,strerr2 |
;сообщения об ошибке |
int 21h |
|
jmp w1b |
; переход на w1b |
w13e: |
|
ret entw13 endp
;************************************************************************ ; Перевод из ASCII в bin числа w19 ;************************************************************************
entw19 proc |
|
|
|
|
w19b: |
|
|
|
|
mov ah,09 |
; вывод сообщения 'w19= ' |
|||
lea dx,soob7 |
|
|||
int 21h |
|
|||
; ввод с клавиатуры w19 |
|
|||
mov ah,0Ah |
|
|||
lea dx,namepar_w |
|
|||
int 21h |
|
|||
call stroka |
|
|||
;mov mult10,1 |
|
|
;перевод из ASCII в bin |
|
call asc2bin_word |
||||
xor ax,ax |
;переносим переведённое значение в w19 |
|||
mov ax,binval_w |
|
|||
mov w19,ax |
|
|||
; |
mov ax,w19 |
|
|
|
cmp |
ax,32767 |
|
;w19 сравниваем с 32767 |
|
ja w19m |
;если >, то на метку w19m |
|||
jmp w19e |
;если <= , то на метку w19e |
|||
w19m: |
|
|
|
|
mov ah,09 |
;вывод на экран |
|||
lea dx,strerr2 |
;сообщения об ошибке |
|||
int 21h |
|
|||
jmp w19b |
; переход на w19b |
|||
w19e: |
|
|
|
|
|
|
|
|
86 |
ret entw19 endp
;************************************************************************ ; Перевод из ASCII в bin числа w21 ;************************************************************************
entw21 proc |
|
|
|
|
w21b: |
|
|
|
|
mov ah,09 |
; вывод сообщения 'w21= ' |
|||
lea dx,soob8 |
|
|||
int 21h |
|
|||
;ввод с клавиатуры w21 |
|
|||
mov ah,0ah |
|
|||
lea dx,namepar_w |
|
|||
int 21h |
|
|||
call stroka |
|
|||
;mov mult10,1 |
|
|
;перевод из ASCII в bin |
|
call asc2bin_word |
||||
xor ax,ax |
;переносим переведённое значение в w2 |
|||
mov ax, binval_w |
|
|||
mov w21,ax |
|
|||
; |
mov ax,w21 |
|
|
|
cmp |
ax,32767 |
|
;w21 сравниваем с 32767 |
|
ja w21m |
;если >, то на метку w21m |
|||
jmp w21e |
;если <=, то на метку w21e |
|||
w21m: |
|
|
|
|
mov ah,09 |
;вывод на экран |
|||
lea dx,strerr2 |
;сообщения об ошибке |
|||
int 21h |
|
|||
jmp w21b |
; переход на w21b |
|||
w21e: |
|
|
|
|
ret entw21 endp
;************************************************************************ ; Перевод из ASCII в bin числа d1 ;************************************************************************
entd1 proc |
|
|
|
|
|
d1b: |
|
|
|
|
|
mov ah,09 |
; вывод сообщения 'd1= ' |
||||
lea dx,soob11 |
|
||||
int 21h |
|
||||
mov ah,0ah |
; ввод с клавиатуры d1 |
||||
lea dx,namepar_d |
|
||||
int 21h |
|
||||
call stroka |
|
||||
;mov mult10,1 |
|
|
|
;перевод из ASCII в bin |
|
call asc2bin_dword |
|||||
; |
xor ax,ax |
|
|
|
|
xor bx,bx |
|
|
|
||
xor cx,cx |
|
||||
; |
xor dx,dx |
|
|
||
|
|
|
|
|
87 |
mov ax,word ptr binval_d |
;переносим переведённое значение в d1 |
||
mov dx,word ptr binval_d+2 |
|
|
|
mov word ptr d1,ax |
|
|
|
mov word ptr d1+2,dx |
|
|
|
; cmp dx,21474 |
;dx сравниваем с 21474 |
|
|
; ja d1m |
;если >, то на метку d1m |
|
|
jmp d1e |
;если <= , то на метку d1e |
||
d1m: |
|
|
|
mov ah,09 |
;вывод на экран |
||
lea dx,strerr3 |
;сообщения об ошибке |
||
int 21h |
|
|
|
jmp d1b |
; переход на d1b |
||
d1e: |
|
|
|
ret |
|
|
|
entd1 endp
;************************************************************************ ; Процедура перевода строки
;************************************************************************
stroka proc near |
;процедура перевода курсора на новую строку |
|
push |
|
|
inc |
ln |
|
mov |
ah,02 |
|
mov |
bh,00 |
|
mov |
dh,ln |
|
mov |
dl,00 |
|
int |
10h |
|
pop |
|
|
ret |
|
|
stroka endp |
|
|
printCF proc |
|
|
shr |
CFval,1 |
|
mov |
ah,09h |
|
jnc |
mcf0 |
|
lea |
dx,soobcfval1 |
|
jmp |
mcfe |
|
mcf0: lea |
dx,soobcfval0 |
|
mcfe: int |
21h |
|
call |
stroka |
|
ret |
|
|
printcf endp |
|
|
entcf proc |
|
|
CFb: |
|
|
mov |
ah,09h |
; вывод приглашения |
lea |
dx,soobcfent |
|
int |
21h |
|
mov |
ah,0ah |
; ввод с клавиатуры X |
lea |
dx,namepar_b |
|
int |
21h |
|
|
|
88 |
call |
stroka |
|
call |
asc2bin_byte |
;перевод из ASCII в bin |
;xor ax,ax
mov |
al,byte ptr binval_b |
|||
mov |
CFval,al |
|
;переносим переведённый байт в CFval |
|
cmp |
al,1 |
|
|
|
jna |
CFe |
|
|
|
mov |
ah,09 |
|
|
|
lea |
dx,strerr4 |
|||
int |
21h |
|
|
|
call |
stroka |
|
|
|
jmp |
Xb |
|
|
|
CFe: |
|
|
|
|
ret |
|
|
|
|
entcf endp |
|
|
|
|
; #34 |
|
w1 or w2 |
||
form34 proc |
ax,w1 |
|
|
|
mov |
|
|
|
|
or |
ax,w2 |
|
|
|
mov |
word ptr rezult,ax |
|||
mov |
word ptr rezult+2,0000h |
|||
ret |
|
|
|
|
form34 endp |
w1 xor |
w2 |
||
; #35 |
||||
form35 proc |
ax,w1 |
|
|
|
mov |
|
|
|
|
xor |
ax,w2 |
|
|
|
mov |
word ptr rezult,ax |
|||
mov |
word ptr rezult+2,0000h |
|||
ret |
|
|
|
|
form35 endp |
|
|
|
|
; #49 |
w13 and |
b13 |
||
form49 proc |
|
|
|
|
; |
xor |
ax,ax |
|
|
mov |
ax,w13 |
|
|
|
and |
al,b13 |
|
|
|
xor |
ah,ah |
|
|
|
mov |
word ptr rezult,ax |
|||
mov |
word ptr rezult+2,0000h |
|||
ret |
|
|
|
|
form49 endp |
w19 |
and |
not(b16) |
|
; #57 |
||||
form57 proc |
b16 |
|
|
|
not |
|
|
|
|
mov |
ax,w19 |
|
|
|
and |
al,b16 |
|
|
|
xor |
ah,ah |
|
|
|
mov |
word ptr rezult,ax |
|||
mov |
word ptr rezult+2,0000h |
|||
ret |
|
|
|
|
form57 endp |
w21 and neg(w2) |
|||
; #62 |
||||
form62 proc |
|
|
|
|
|
|
|
89 |
|
neg |
w2 |
|
mov |
ax,w21 |
|
and |
ax,w2 |
|
mov |
word ptr rezult,ax |
|
mov |
word ptr rezult+2,0000h |
|
ret |
|
form62 endp |
логический сдвиг слова влево на 2 |
|
; #3 |
|
|
form3 proc |
ax,w1 |
|
|
mov |
|
|
shl |
ax,1 |
|
shl |
ax,1 |
|
mov |
word ptr rezult,ax |
|
ret |
|
form3 endp |
арифметический сдвиг двойного слова вправо на 3 |
|
; #4 |
|
|
form4 proc |
ax,word ptr d1 |
|
|
mov |
|
|
mov |
dx,word ptr d1+2 |
f4b: |
mov |
cx,3 |
clc |
dx,1 |
|
|
sar |
|
|
jnc |
f4e |
|
shr |
ax,1 |
|
or |
ah,10000000b |
f4e: |
jmp |
f4ee |
shr |
ax,1 |
|
f4ee: |
loop |
f4b |
|
mov |
word ptr rezult,ax |
|
mov |
word ptr rezult+2,dx |
|
ret |
|
form4 endp |
циклический сдвиг байта влево на 4 |
|
; #5 |
|
form5 proc
;xor ax,ax
mov |
al,b1 |
|
|
; |
xor |
cx,cx |
|
mov |
cl,4 |
|
|
rol |
al,cl |
|
|
mov |
byte ptr rezult,al |
||
ret |
|
|
|
form5 endp |
логический сдвиг слова вправо через флаг переноса на 5 |
||
; #6 |
|||
form6 proc |
CFval,1 |
||
shr |
|||
mov |
ax,w1 |
|
|
mov |
cl,5 |
|
|
rcr |
ax,cl |
|
|
mov |
word ptr rezult,ax |
||
rcl |
CFval,1 |
||
ret |
|
|
|
form6 endp |
|
|
;конец сегмента кода |
codesg ends |
|
|
|
end start |
|
|
|
|
|
|
|
90