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

2591

.pdf
Скачиваний:
2
Добавлен:
07.01.2021
Размер:
25.15 Mб
Скачать

xor 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

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