2591
.pdfxor ax,ax |
|
;ax=0 |
mov ax,binval_b |
;поместить в al число b3 |
|
mov b3,al |
|
;поместить в переменную b3 число b3 |
call cursor |
|
|
xor ax,ax |
|
|
mov al,b3 |
|
;поместить в al число b3 |
cbw |
|
|
cmp ax,127 |
|
;сравнение числа b3 с 127 |
ja eb3 |
|
;если b3>127, то на метку eb3 |
xor ax,ax |
|
|
jmp form |
|
;если b3<=127, то на метку form |
eb3: mov ah,09h |
|
;сообщение об ошибке |
lea dx,soob_error_b |
|
|
int 21h |
|
|
call cursor |
|
;вызов процедуры перевода курсора |
jmp lb3 |
;переход на метку lb3 |
;************************************************************** ; w1*w2+d1/b1-(w3+b2+b3) ;************************************************************** form: xor ax,ax
xor bx,bx xor cx,cx xor dx,dx
mov ax,w1 |
|
;ax:=w1 |
mul w2 |
;ax:=w1*w2 |
|
mov word ptr rez_1,ax |
;rez_1:=w1*w2 |
|
mov word ptr rez_1[2],dx |
|
mov al,b1 mov ah,0 cbw mov bx,ax
mov ax,word ptr d1 mov dx,word ptr d1+2 idiv bx
mov rez_2,ax
xor ax,ax xor bx,bx xor dx,dx mov al,b2 cbw
;al:=b1
;ah:=0
;ax:=b1
;bx:=b1
;поместить первую d1 часть в ax ;поместить вторую d1 часть в dx ;d1/b1, целая часть в ax, остаток в dx
;rez_2:=d1/b1
;al:=b2
;ax:=b2
111
mov bx,ax |
|
;bx:=b2 |
|
xor ax,ax |
|
;ax:=0 |
|
mov al,b3 |
|
;al:=b3 |
|
cbw |
|
|
;ax:=b3 |
add ax,bx |
|
;ax:=b1+b3 |
|
add ax,w3 |
|
;ax:=w3+b1+b3 |
|
mov rez_3,ax |
|
;rez_3:=w3+b1+b3 |
|
xor ax,ax |
|
|
|
xor bx,bx |
|
|
|
xor dx,dx |
|
|
|
mov ax,word ptr rez_1 |
;ax:=rez_1 |
||
mov dx,word ptr rez_1+2 |
;dx:=rez_1+2 |
||
mov bx,rez_2 |
|
;bx:=rez_2 |
|
add ax,bx |
|
;ax:=ax+bx, с переносом |
|
adc dx,cx |
|
;dx:=dx+cx |
|
mov bx,rez_3 |
|
;bx:=rez_3 |
|
sub ax,bx |
|
;ax:=ax-bx, с заемом |
|
sbb dx,cx |
|
;dx:=dx-cx |
|
mov word ptr rezult,ax |
|
||
mov word ptr rezult[2],dx |
|
||
mov ten,0 |
|
|
|
call bin_ascii |
|
|
|
xor ax,ax |
|
|
|
mov ah,09h |
|
|
|
lea dx,ascval |
|
|
|
int 21h |
|
|
|
call cursor |
|
|
|
mov ah,09h |
;функция вывода на экран |
||
lea dx,soobe_1;загрузить адрес начала сообщения в dx |
|||
int 21h |
|
;передача управления в DOS |
|
call cursor |
;вызов процедуры перевода курсора |
||
mov ah,09h |
;функция вывода на экран |
||
lea dx,soobe_2;загрузить адрес начала сообщения в dx |
|||
int 21h |
|
;передача управления в DOS |
|
call cursor |
;вызов процедуры перевода курсора |
||
vvod_e: |
mov ah,0ah |
|
|
lea dx,namepar |
|
|
|
|
|
|
112 |
int 21h
xor ax,ax lea si,namefld mov al,[si] and al,00fh mov binval,ax call cursor
cmp binval,1 je jump cmp binval,2 je dos
mov ah,09h lea dx,soob0_err int 21h
call cursor jmp vvod_e
jump: jmp beg
dos: RET ;возврат в DOS
begin endp ;********************************************************************* ; PROCEDURE ;*********************************************************************
cursor proc |
;\ |
|
|начало процедуры |
mov ah,02 |
; \ |
|установка курсора |
|
mov bh,00 |
; |
\ |
|номер экрана |
mov dh,num_ln |
; процедура |номер строки |
||
inc num_ln |
; |
перевода |
|увеличение номера строки на 1 |
mov dl,00 |
; |
курсора |
|номер столбца |
int 10h |
; |
/ |
|передача управления в BIOS |
ret |
; / |
|возврат в основную программу |
|
cursor endp |
;/ |
|
|конец прцедуры |
;*************************************************************************** symbol_w proc ;процедура проверки на введение символьной переменной для слова
mov err,1 xor ax,ax xor cx,cx
mov al,faktlen_w mov cl,al
dec al mov si,ax
turn_w: mov al,namefld_w[si] cbw
cmp ax,30h
113
jb error_w |
;если ASCII < 30h, то переход на метку error_w |
cmp ax,39h |
|
ja error_w |
;если ASCII > 39h, то переход на метку error_w |
dec si |
|
loop turn_w |
|
jmp gw |
;переход на метку gw |
error_w: call cursor |
|
mov ah,09h |
;вывод сообщения об ошибке |
lea dx,soob_error |
|
int 21h |
|
call cursor |
|
mov err,0 |
;err=0 |
gw: ret |
|
symbol_w endp |
|
;***************************************************************************
symbol_d proc |
;процедура проверки на введение символьной переменной |
; |
для двойного слова |
mov err,1 |
|
xor ax,ax |
|
xor cx,cx |
|
mov al,faktlen_d |
|
mov cx,ax |
|
dec al |
|
mov si,ax |
|
turn_d:mov al,namefld_d[si]
|
cbw |
|
|
cmp ax,30h |
|
|
jb error_d |
;если ASCII < 30h, то переход на метку error_d |
|
cmp ax,39h |
|
|
ja error_d |
;если ASCII > 39h, то переход на метку error_d |
|
dec si |
|
|
loop turn_d |
|
|
jmp gd |
;переход на метку gd |
error_d: call cursor |
|
|
|
mov ah,09h |
;вывод сообщения об ошибке |
|
lea dx,soob_error |
|
|
int 21h |
|
|
call cursor |
|
|
mov err,0 |
;err=0 |
gd: |
ret |
|
symbol_d endp ;***************************************************************************
symbol_b proc |
;процедура проверки на введение символьной переменной для байта |
mov err,1 |
|
xor ax,ax |
|
xor cx,cx
mov al,faktlen_b
114
|
mov cx,ax |
|
|
dec al |
|
|
mov si,ax |
|
turn_b:mov al,namefld_b[si] |
|
|
|
cbw |
|
|
cmp ax,30h |
|
|
jb error_b |
;если ASCII < 30h, то переход на метку error_b |
|
cmp ax,39h |
|
|
ja error_b |
;если ASCII > 39h, то переход на метку error_b |
|
dec si |
|
|
loop turn_b |
|
|
jmp gb |
;переход на метку gb |
error_b: call cursor |
|
|
|
mov ah,09h |
;вывод сообщения об ошибке |
|
lea dx,soob_error |
|
|
int 21h |
|
|
call cursor |
|
|
mov err,0 |
;err=0 |
gb: |
ret |
|
symbol_b endp ;***************************************************************************
ASCII_binb 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 |
|
|
|
ASCII_binb ENDP ;***************************************************************************
ASCII_binw PROC |
; процедура перевода из ASCII в bin для слова |
|
mov |
mult10,1 |
|
MOV |
BINVAL_W,0 |
|
XOR |
AX,AX |
|
|
|
115 |
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 |
|
DEC |
BX |
; последний. ASCII-символ? |
JNZ |
B20 |
; если нет – продолжить |
ret |
|
|
ASCII_binw ENDP ;***************************************************************************
ascii_bind proc |
;процедура перевода из ASCII в bin для двойного слова |
|
mov mult10,1 |
|
|
mov word ptr BINVAL_d,0 |
||
mov word ptr BINVAL_d[2],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 |
|
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 |
|
|
ascii_bind endp ;*********************************************************************
clrascval proc |
;процедура очистки ASCVAL |
mov cx,32 |
|
mov si,31 |
|
clr1: and ascval[si],30h |
|
dec si |
|
|
116 |
loop clr1 ret
clrascval endp ;********************************************************************* bin_ascii proc
call clrascval lea si,ascval[31] xor cx,cx
xor bx,bx mov ten,0
mov ax,word ptr rezult mov dx,word ptr rezult+2
met1: cmp dx,0 jne met5 cmp ax,10 jbe met2
met5: sub ax,10 sbb dx,0 add bx,1 adc cx,0 jmp met1
met2: add al,ten mov ten,0 cmp al,10 je met2_1 jmp met2_2
met2_1: mov al,0 inc ten
met2_2: or al,30h mov [si],al
dec si cmp cx,0 je met3 jmp met4
met3: cmp bx,0 jne met4 ret
met4: mov ax,bx mov dx,cx xor bx,bx xor cx,cx jmp met1
bin_ascii endp
117
;*****************************************************
clrscr proc |
|
|
mov ax,0600h ;\ |
|al=00 (весь экран), ah=06 (прокрутка) |
|
mov bh,07 |
; \ |
|чёрно-белый |
mov cx,0000 |
; очистка экрана |
|левая верхняя позиция |
mov dx,314fh |
; / |
|правая нижняя позиция |
int 10h |
;/ |
|передача управления в BIOS |
mov num_ln,0 clrscr endp
;*************************************************************************** bin_bin proc
call clrascval lea si,ascval[31] xor cx,cx
xor bx,bx
mov ax,word ptr rezult mov dx,word ptr rezult+2
metb1: cmp dx,0 jne metb5 cmp ax,2 jb metb2
metb5: sub ax,2 sbb dx,0 add bx,1 adc cx,0 jmp metb1
metb2: or al,30h mov [si],al dec si cmp cx,0 je metb3 jmp metb4
metb3: cmp bx,0 jne metb4 ret
metb4: mov ax,bx mov dx,cx xor bx,bx xor cx,cx jmp metb1
bin_bin endp ;*******************************************************
CODESG ENDS |
;конец сегмента данных |
END begin |
;конец основной процедуры |
|
118 |
===================================================================
;l_2_2kln.asm КАЛИНИН МИХАИЛ, БИ11, 2004г. (лабораторная работа №2, модуль 2)
extrn soobe_1:byte,soobe_2:byte,soob0_err:byte,soob_b1:byte,soob_b2:byte,soob_d1:byte,soo b_d2:byte,b1:byte,b2:byte,d1:dword,d2:dword
extrn binval_d:dword,binval:word,binval_b:word,binval_w:word extrn mult10:word,rezult:dword,ten:byte,ascval:byte,num_ln:byte extrn
soob0_3:byte,soobl_err:byte,soobl:byte,soobl_1:byte,soobl_2:byte,soobl_3:byte,soobl_4: byte,soobl_5:byte,soobl_n1:byte,soobl_n2:byte,soobl_n3:byte,soobl_n4:byte,soobl_n5:by te
extrn namepar_b:byte,maxlen_b:byte,faktlen_b:byte,namefld_b:byte,namepar_w:byte,maxlen _w:byte,faktlen_w:byte,namefld_w:byte,namepar_d:byte,maxlen_d:byte,faktlen_d:byte, namefld_d:byte,namepar:byte,maxlen:byte,faktlen:byte,namefld:byte
public main
CODESEG SEGMENT PARA 'CODE' |
;начало сегмента кода |
||
assume cs:codeseg |
|
|
|
MAIN PROC FAR |
|
;начало основной процедуры |
|
bg: |
call clrscr |
|
|
|
call cursor |
;вызов процедуры перевода курсора |
|
|
mov ah,09h |
;функция вывода на экран |
|
|
lea dx,soobl |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
;передача управления в DOS |
|
|
call cursor |
;вызов процедуры перевода курсора |
|
|
mov ah,09h |
;функция вывода на экран |
|
|
lea dx,soobl_n1 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
;передача управления в DOS |
|
|
call cursor |
;вызов процедуры перевода курсора |
|
|
mov ah,09h |
;функция вывода на экран |
|
|
lea dx,soobl_n2 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
;передача управления в DOS |
|
|
call cursor |
;вызов процедуры перевода курсора |
|
|
mov ah,09h |
;функция вывода на экран |
|
|
lea dx,soobl_n3 |
;загрузить адрес начала сообщения в dx |
|
|
int 21h |
;передача управления в DOS |
|
|
|
|
119 |
call cursor |
;вызов процедуры перевода курсора |
|
mov ah,09h |
;функция вывода на экран |
|
lea dx,soobl_n4 |
;загрузить адрес начала сообщения в dx |
|
int 21h |
|
;передача управления в DOS |
call cursor |
;вызов процедуры перевода курсора |
|
mov ah,09h |
;функция вывода на экран |
|
lea dx,soobl_n5 |
;загрузить адрес начала сообщения в dx |
|
int 21h |
|
;передача управления в DOS |
call cursor |
;вызов процедуры перевода курсора |
|
vvod_l: |
mov ah,0ah |
|
lea dx,namepar |
|
|
int 21h |
|
|
xor ax,ax |
|
|
lea si,namefld |
|
|
mov al,[si] |
|
|
and al,00fh |
|
|
mov binval,ax |
|
|
cmp binval,1 |
|
|
je f1 |
|
|
cmp binval,2 |
|
|
je jmp_f2 |
|
|
cmp binval,3 |
|
|
je jmp_f3 |
|
|
cmp binval,4 |
|
|
je jmp_f4 |
|
|
cmp binval,5 |
|
|
je jmp_f5 |
|
|
mov ah,09h |
|
|
lea dx,soobl_err |
|
|
int 21h |
|
|
call cursor |
|
|
jmp vvod_l |
|
|
jmp_f2: |
jmp f2 |
|
jmp_f3: |
jmp f3 |
|
jmp_f4: |
jmp f4 |
|
jmp_f5: |
jmp f5 |
|
;================================================================
f1: |
;b1 or b2 |
|
120 |