Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2012, 13:06   #1
Dawar
Новичок
Джуниор
 
Регистрация: 05.06.2012
Сообщений: 2
По умолчанию [Assembler]Работа с записью. Трехмерный вектор.

Вообщем есть задание
Реализуйте векторную алгебру в трехмерном пространстве (сложение, вычитание, скалярное и векторное произведение векторов). Вектор представляется как запись с полями, соответствующими координатам.

И вот есть программа:
Код:
.model small
.386
.stack 100h
;**********************************************************
.data
;**********************************************************
vector record x:2=0, y:2=0, z:2=0
va vector <>
vb vector <>
vc vector <>
bva equ byte ptr va
bvb equ byte ptr vb
bvc equ byte ptr vc
ova equ offset va
ovb equ offset vb
ovc equ offset vc
masks db mask x, mask y, mask z
vectors dw ova,ovb,ovc
shifts db x,y,z
tmp db ?
ermsg 		db 0, "Неправильный формат числа$"
stout 		db 10, 13, 6 dup (" "), "$"
msg1 		db 10, 13, "Введите "
msg1char 	db " :$"
msg2 		db 10, 13, "Вектор " 
msg2char 	db " :$"
msgsum		db 10, 13, "A+B = $"
msgsub		db 10, 13, "A-B = $"
msgscal		db 10, 13, "(A,B) = $"
msgvect		db 10, 13, "[A,B] = $"
;**********************************************************
.code
;**********************************************************
;Ожидание нажатия клавиши
readkey	proc	near
	push ax
	mov ah,0ch
	mov al,08h
	int 21h
	pop ax
	ret
readkey endp
;**********************************************************
;vc:=va+vb
vsum	proc	near
	pusha
	mov cx,3
	lea si,masks
VSUM1:
	mov bl, [si]
	mov ah, bva
	and ah,bl
	mov al, bvb
	and al,bl
	add ah,al
	and ah,bl
	not bl
	and bvc,bl
	add bvc,ah
	add si,1
	loop VSUM1

	popa
	ret
vsum	endp
;**********************************************************
;vc:=va-vb
vsub	proc	near
	pusha
	mov cx,3
	lea si,masks
VSUB1:
	mov bl, [si]
	mov ah, bva
	and ah,bl
	mov al, bvb
	and al,bl
	sub ah,al
	and ah,bl
	not bl
	and bvc,bl
	add bvc,ah
	inc si
	loop VSUB1
	popa
	ret
vsub	endp
;**********************************************************
;al=(va,vb)
scalar	proc	near
	push bx
	push cx
	push dx
	push si
	push di
	xor al,al
	mov cx,3
	lea si,masks
	lea di,shifts
SCALAR1:
	mov dx,ax
	mov bl,[si]
	mov al,bva
	and al,bl
	mov ah,bvb
	and ah,bl
	push cx
	mov cl,[di]
	shr al,cl
	shr ah,cl
	pop cx
	mul ah
	add ax,dx
	inc si
	inc di
	loop SCALAR1
	pop di
	pop si
	pop dx
	pop cx
	pop bx
	ret
scalar	endp
;**********************************************************
;vc=[va,vb]
Dawar вне форума Ответить с цитированием
Старый 05.06.2012, 13:07   #2
Dawar
Новичок
Джуниор
 
Регистрация: 05.06.2012
Сообщений: 2
По умолчанию

Код:
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бит на поле...
Dawar вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверить, упорядочен ли вектор (Assembler) Vate Помощь студентам 3 04.01.2012 21:50
Работа с объектами типа вектор, в каждом классе должны быть методы сохранения и загрузки объектов mavar Помощь студентам 0 03.05.2011 16:35
Работа с записью в файлы, циклы. Укажите где ошибка! Bulkin Помощь студентам 1 24.11.2010 12:44
Работа программы с БД с ограниченной учетной записью пользователя Windows Стас БД в Delphi 3 11.12.2009 14:35
Создание класса "Трехмерный вектор" steel_may Помощь студентам 1 09.05.2009 12:29