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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2010, 23:15   #1
Alexander_Volk
 
Регистрация: 18.10.2010
Сообщений: 7
По умолчанию Проблема с теорией (умножение, сумма, Пифагор)

Нужно всего-то написать программу для подсчёта a*a+b*b=вывод на экран
a и b вводятся с клавиатуры. Вроде всё просто, да как-то не получается.

Максимум чего я смог добиться стабильно работающего и близкое к заданию это просто целочисленный ввод a и b (с их проверкой) в массивы и красивый их вывод на экран.
Дальше проблемы:
1. Как можно организовать умножение массива
1.1. Проблема при переводе числа из массива в регистр
2. И по всей видимости умножает и складывает он в 16ой системе, а перевести в 10ую не получается по схожей причине как в п. 1.1.

Прошу прощение, если это где уже рассмотрено. Но поиск по форуму не дал желаемого результата.

Вот что есть на данный момент:
Код:
.model small ;модель памяти
.stack
.data
input_msg1 db 0dh,0ah,'Введи число a: $'
input_msg2 db 0dh,0ah,'Введи число b: $'

error_msg db 0dh,0ah,'Вы ввели неверное значение. $'

answer_msg db 0dh,0ah,'Значение a: '
stringA db 10 dup (20h) ;строка для ввода 9 цифр и знака для 'a'
db 0dh,0ah,'Значение b: '
stringB db 10 dup (20h) ;строка для ввода 9 цифр и знака для 'b'

db 0dh,0ah,'$'

.code

start:
	mov	ax,@data	;начало процедуры main
	mov	ds,ax		;заносим адрес сегмента данных в регистр ах
	mov	ah,9		;ах в ds
	lea	dx,input_msg1
	int	21h		;вывод сообщения на экран
	mov 	bl,1		;если bl=1 заносим элементы в массив stringA
				;иначе в массив stringB

first_step:	
	xor	si,si		;подготовка регистров
	xor	ax,ax
	
	call GetNextChar	;ввод первого символа в al

	cmp	al,'+'
	je	next_step
	cmp	al,'-'
	je	next_step
	cmp	al,30h
	jb	bad_end	
	cmp	al,39h
	ja	bad_end
next_step:
	cmp	bl,1			;проверяем в какой массив заносить
	jne	var_b1
	mov	stringA[si],al
var_b1:
	mov	stringB[si],al
	inc	si

while1:
	cmp	si,9				;пока si<=9 читаем с клавиатуры элементы
						;и заносим в массив
	jae	end_while1			
	call	GetNextChar
	cmp	al,0dh			;если нажат ввод, то конец ввода чисел
	je	end_while1
	cmp	al,39h			;если выше чем 9 по коду, то выводим ошибку
	ja	bad_end
	cmp	al,30h			;если меньше 0 по коду, то выводим ошибку
	jb	bad_end
	cmp	bl,1				;проверка в какой массив заносить
	jne	var_b2			
	mov	stringA[si],al
var_b2:
	mov	stringB[si],al
	inc	si
	jmp	while1
end_while1:
	
	cmp	bl,1				;переключаем массив для ввода
	jne	last_step
	mov	bl,2
	mov	ah,9		
	lea	dx,input_msg2
	int	21h
	jmp	first_step			;и всё по новой, но для массива b


last_step:

	mov 	ah,9
	lea	dx,answer_msg
	int	21h 			; вывод сообщения good luck_message на экран
	jmp	exit_prog

bad_end:
	mov	ah,9
	lea	dx,error_msg
	int	21h			;вывод сообщения message_Invalid_Number на экран
exit_prog:
;	call	GetNextChar		;задержка до ввода любого символа

	mov 	ah,4ch
	int	21h

GetNextChar:
	mov	ah,01h	;чтение символа из стандартного ввода
	int	21h		;символ в al
	ret

end start

Последний раз редактировалось Stilet; 21.10.2010 в 08:52.
Alexander_Volk вне форума Ответить с цитированием
Старый 19.10.2010, 01:09   #2
Vergo
Пользователь
 
Регистрация: 20.09.2010
Сообщений: 38
По умолчанию

Под девятизначное десятичное число нужно отводить как минимум пару 16-битных регистров (операнд типа DWORD). Воспользоваться командой MUL в этом режиме вы не сможете, так как она позволяет умножить максимум WORD на WORD и поместить результат в пару регистров DX:AX. Тут нужен либо сопроцессор, либо 32-битные регистры, либо написать подпрограмму умножения.

Последний раз редактировалось Vergo; 19.10.2010 в 03:31.
Vergo вне форума Ответить с цитированием
Старый 19.10.2010, 01:56   #3
Alexander_Volk
 
Регистрация: 18.10.2010
Сообщений: 7
По умолчанию

Количество знаков можно уменьшить и до трёх
Насчёт подпрограммы умножения можно поподробнее?
И как занести всё это под умножение?
Alexander_Volk вне форума Ответить с цитированием
Старый 19.10.2010, 09:00   #4
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Alexander_Volk
судя по ключевому слову Пифагор придется еще считать квадратный корень от суммы квадратов a и b
если к этому подойти творчески, то a²+b²=(a+b)² - 2ab
Код:
mov ax,a
add ax,b;            ax=a+b
mul ax;           dx:ax=(a+b)²
mov bx,dx
mov cx,ax
mov ax,a
mul b;                 dx:ax=a•b
add ax,ax 
adc dx,dx;           dx:ax=2•a•b
sub cx,ax
sbb bx,dx;           bx:cx=a²+b²

Последний раз редактировалось Mikl___; 20.10.2010 в 05:20.
Mikl___ вне форума Ответить с цитированием
Старый 19.10.2010, 09:22   #5
xrnd
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 18
По умолчанию

Для начала неплохо понять, с какими числами тебе надо производить вычисления.
Если это двоичные целые со знаком, размером слово (16 бит), то вводить надо максимум 5 цифр и знак, причем следить за диапазоном представления числа (от -32 768 до 32 767).
Числа со знаком умножать надо командой IMUL. Результат умножения будет двойным словом или словом (но с возможной потерей значащих разрядов).

Хотя зачем тебе числа со знаком вводить, если все равно ты их возводишь в квадрат?

Последний раз редактировалось xrnd; 19.10.2010 в 09:24.
xrnd вне форума Ответить с цитированием
Старый 20.10.2010, 05:19   #6
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Alexander_Volk
еще один способ посчитать a² + b²
a² + b² = ((a + b)² + (a - b)²)/2

Цитата:
Сообщение от xrnd
Хотя зачем тебе числа со знаком вводить, если все равно ты их возводишь в квадрат?
не бывает сторон треугольников с отрицательными длинами

Последний раз редактировалось Mikl___; 20.10.2010 в 05:26.
Mikl___ вне форума Ответить с цитированием
Старый 20.10.2010, 18:09   #7
xrnd
Пользователь
 
Регистрация: 27.09.2010
Сообщений: 18
По умолчанию

Mikl___
Почему тогда написано
Цитата:
stringA db 10 dup (20h) ;строка для ввода 9 цифр и знака для 'a'
И зачем такие сложности для вычисления суммы квадратов?
Код:
    mov ax,a
    mul ax
    mov bx,ax
    mov cx,dx
    mov ax,b
    mul ax
    add ax,bx
    adc dx,cx
xrnd вне форума Ответить с цитированием
Старый 21.10.2010, 03:49   #8
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Цитата:
Сообщение от xrnd
Почему тогда написано stringA db 10 dup (20h) ;строка для ввода 9 цифр и знака для 'a'
Потому и написано, что Alexander_Volk не разбирается в программе сам, а дергает по кусочку из разных мест, наверняка, задание в оригинале звучало так: "Написать программу для вычисления длины гипотенузы прямоугольного треугольника по известным длинам катетов. Длины катетов вводятся с клавиатуры"
Цитата:
И зачем такие сложности для вычисления суммы квадратов?
Я же написал "если к этому подойти творчески"
Mikl___ вне форума Ответить с цитированием
Старый 22.10.2010, 10:50   #9
Alexander_Volk
 
Регистрация: 18.10.2010
Сообщений: 7
По умолчанию

Приношу глубочайшие извинения, что некоторое время ничего не писал. Так как произошла большая проблема с винтом на моём ноуте и только недавно его восстановил.

По теме:
Насчёт того, что минус - это требование к работе программы.
Но за это время выяснилось следующее: преподаватель требует возможность вводить числа любой длины (сколько позволяет памяти) и дал подсказку на использоване BCD чисел и умножением проводить как в школе столбиком. Также просил вывести результат в файл. Но с файлом я как-нить сам разберусь.
А вот работу с BCD числами подскажите как выполнять в конкретном примере. Немного теории нашёл что и как, но нужен небольшой толчок.

P.S. Обращаться к преподавателю за помощью не смогу, т.к. все ответы у него: "не знаю", "забыл", *улыбка*. Хотя спрашивает прилично и если получилось сдать ему лабу, то и объясняет хорошо.
Alexander_Volk вне форума Ответить с цитированием
Старый 22.10.2010, 11:17   #10
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Alexander_Volk
по поводу BCD чисел -- если с клавиатуры введено число 1234 то в памяти оно сохраняются в виде 31h, 32h, 33h, 34h, где 31h код "1", 34h = код "4" то есть отбрасываешь первую 3 и сцепляешь по две цифры между собой 12h,34h это BCD- эквивалент твоего числа введенного с клавиатуры а вот двоичный эквивалент 1234=4D2h получив BCD-число и поместив его в переменную X можешь воспользоваться командами сопроцессора, который переводит BCD-число в шестнадцатеричное число и шестнадцатеричное число в BCD
Mikl___ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Умножение panuta Microsoft Office Excel 3 31.05.2010 17:42
С теорией я разобрался незнаю как реализовать Valerii Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 26.01.2010 15:35
Умножение KoBRaAndrey Общие вопросы Delphi 4 03.10.2009 12:23
умножение PAWLO1993 Паскаль, Turbo Pascal, PascalABC.NET 4 29.07.2008 18:55
помогите с теорией в паскале Vitas1234 Помощь студентам 1 25.05.2008 17:55