Код:
vecmul proc near
pusha
mov bvc,0
mov al,bva
mov ah,bvb
and al,mask y
and ah,mask z
shr al,y
shr ah,z
mul ah
shl al,x
and al,mask x
mov dl,al ;dl=ay*bz|x
mov al,bva
mov ah,bvb
and al,mask z
and ah,mask y
shr al,z
shr ah,y
mul ah
shl al,x
and al,mask x
sub dl,al
and dl,mask x ;dl=ay*bz-by*az|x
add bvc,dl
mov al,bva
mov ah,bvb
and al,mask z
and ah,mask x
shr al,z
shr ah,x
mul ah
shl al,y
and al,mask y
mov dl,al ;dl=az*bx|y
mov al,bva
mov ah,bvb
and al,mask x
and ah,mask z
shr al,x
shr ah,z
mul ah
shl al,y
and al,mask y
sub dl,al
and dl,mask y ;dl=az*bx-ax*bz|y
add bvc,dl
mov al,bva
mov ah,bvb
and al,mask x
and ah,mask y
shr al,x
shr ah,y
mul ah
shl al,z
and al,mask z
mov dl,al ;dl=ax*by|z
mov al,bva
mov ah,bvb
and al,mask y
and ah,mask x
shr al,y
shr ah,x
mul ah
shl al,z
and al,mask z
sub dl,al
and dl,mask z ;dl=ax*by-by*ax|z
add bvc,dl
popa
ret
vecmul endp
;**********************************************************
error proc near
;Вывод сообщения об ошибке и выход из программы
mov ah,09h
mov dx,offset ermsg
int 21h
mov ah,0ah
int 21h
mov ax,4c00h
int 21h
error endp
;**********************************************************
;Обрабатывает строку по адресу DS:DX (преобразование в число)
;DS:DX+1 - длина
;DS:DX+2 - строка
;Результат - AL
convert proc near
push bx
push cx
push dx
push si
mov si,dx
xor ax,ax
xor cx,cx
inc si
mov cl,[si]
C1: inc si
mov dl,0ah
mul dl
mov bl,[si]
sub bl,30h
cmp bl,0ah
jge C2
add al,bl
loop C1
pop si
pop dx
pop cx
pop bx
ret
C2: call error
convert endp
;Выводит AX
output proc near
push ax
push bx
push si
push dx
xor ah,ah
mov bx,ax
mov si,offset stout+6
cmp ax,0
jge O1
neg ax
mov bx,ax
mov byte ptr [si-4],"-"
O1:
xor dx,dx
mov ax,bx
mov bx,0ah
div bx
xchg ax,dx
mov bx,dx
add ax,30h
mov [si],al
dec si
cmp bx,0
jne O1
mov ah,09h
mov dx,offset stout
int 21h
pop dx
pop si
pop bx
pop ax
ret
output endp
;Вывод строки DS:DX (конец строки - $)
prnstr proc near
push ax
mov ah,09h
int 21h
pop ax
ret
prnstr endp
;Очистка экрана
clrscr proc near
push ax
push cx
push dx
push ds
push cs
pop ds
lea dx, CRLF
mov ah,09
mov cx,50
CS1:
int 21h
loop CS1
pop ds
pop dx
pop cx
pop ax
ret
CRLF db 10, 13, "$"
clrscr endp
;Ввод с клавиатуры байта в BL
input proc near
push ax
push dx
push ds
mov ax,cs
mov ds,ax
lea dx,strng
mov ah,0ah
int 21h
call convert
pop ds
mov bl,al
pop dx
pop ax
ret
strng db 7, 7 dup (0)
input endp
;Вывод вектора VC
writec proc near
push ax
push bx
push cx
push di
push si
mov cx,3
lea si,shifts
lea di,masks
xor ah,ah
WRITEC1:
mov al,bvc
mov bh,[di]
and al,bh
push cx
mov cl,[si]
shr al,cl
pop cx
inc di
inc si
call output
loop WRITEC1
pop si
pop di
pop cx
pop bx
pop ax
ret
writec endp
main:
;Инициализация
mov ax,@data
mov ds,ax
call clrscr
;********ЦИКЛ ВВОДА******
mov cx,2
lea si,vectors
lea di,masks
M1:
;Вывод строки "Vector i:" i="A","B"
lea dx,msg2
mov al,cl
neg al
add al,"C"
mov msg2char,al
call prnstr
push cx
mov cx,3
M2:
;Вывод строки "Enter j:" j="X","Y","Z"
lea dx,msg1
mov al,cl
neg al
add al,"Z"+1
mov msg1char,al
call prnstr
;Ввод vi:j
lea bx,tmp
call input
push cx
sub di,offset masks
add di,offset shifts
mov cl,[di]
shl bl,cl
sub di,offset shifts
add di,offset masks
and bl,[di]
push si
mov si,[si]
add [si],bl
pop si
pop cx
inc di
cmp di,offset masks+3
jl NORM
sub di,3
NORM:
loop M2
add si,2
pop cx
loop M1
;****КОНЕЦ ЦИКЛА ВВОДА****
;Вывод суммы
lea dx,msgsum
call prnstr
call vsum
call writec
;Вывод разности
lea dx,msgsub
call prnstr
call vsub
call writec
;Вывод скалярного произведения
lea dx,msgscal
call prnstr
call scalar
call output
;Вывод векторного произведения
lea dx,msgvect
call prnstr
call vecmul
call writec
;Завершение программы
call readkey
mov ax,4c00h
int 21h
end main
Но берет она числа только от 0 до 3(Я так понял это изза того что размер поля в записи всего 2 бита) Не могу переделать под 8бит на поле...