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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2014, 17:11   #1
dorr
Пользователь
 
Регистрация: 26.12.2011
Сообщений: 13
По умолчанию Консультация по коду

Добрый день! Прошу вашей помощи в решении задачи. Нужно посчитать вот такую штуку: Σ (|Ai | * |Bi |), где Ai и Bi элементы массива размера три. Реализовать как ассемблерную вставку. У меня вышел вот такой вот код:

Код:
	int result = 0;
	int a[3] = { 1, 2, 3 };
	int b[3] = { 4, 5, 6 };

	_asm {
		xor ecx, ecx;
		xor esi, esi;
		xor ebx, ebx;

	cycle: 
		//Σ (|Ai | * |Bi |)

		//get elem from a
		lea ebx, dword ptr[a + ecx];

		//module Ai
		cmp ebx, 0;
		jns posa;
		neg ebx;

	posa:

		//get elem from b
		lea esi, dword ptr[b + ecx];

		//module Bi
		cmp esi, 0;
		jns posb;
		neg esi;

	posb:
		//Ai + Bi
		mov eax, esi;
		mul ebx;
		
		add result, ebx;

		//condition
		inc ecx;
		cmp ecx, 3;
		jne cycle;
	}

	return result;
Проблема в том, что он некорректно считает значения, выводит рандомное число. Думаю проблема с каким-то из регистров. Буду благодарен за помощь. Также интересно будет послушать замечания по коду. Спасибо!
dorr вне форума Ответить с цитированием
Старый 16.02.2014, 21:09   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

mov вместо lea; ecx в адресе элемента массива надо умножать на размер int'а; ebx и esi надо сохранять и восстанавливать; результат умножения в (edx:)eax, а не в ebx; модуль можно брать после умножения.

Последний раз редактировалось Somebody; 16.02.2014 в 21:11.
Somebody вне форума Ответить с цитированием
Старый 16.02.2014, 23:25   #3
dorr
Пользователь
 
Регистрация: 26.12.2011
Сообщений: 13
По умолчанию

Somebody, спасибо! Насколько я понимаю, для перемещения по элемента массива вместо :
Код:
mov ebx, dword ptr[a + ecx*4];
можно использовать конструкцию вроде:
Код:
lea ebx, a+ecx*4
, никаких принципиальных различий ведь нет?

Цитата:
ebx и esi надо сохранять и восстанавливать
Не пойму, зачем здесь это делать?

Ещё такой вопрос: если вдруг во время умножения результат разместился в edx:eax, выходит, int переполнился, и результат, который представлен уже 64мя битами, вывести в int возможным не представляется. Как можно предотвратить вылет программы из-за такого рода ошибок?
dorr вне форума Ответить с цитированием
Старый 17.02.2014, 11:19   #4
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

mov - копирование из одного места в другое; lea - просто расчёт выражения:
Код:
mov reg, [addr]
; это как
lea tmp, [addr]
mov reg, [tmp]
; или, если адрес - константа
mov tmp, addr
mov reg, [tmp]
; просто арифметика:
lea eax, [ecx + edx*2 + 3] ; eax = ecx + edx*2 + 3
Насчёт ebx и esi - надо смотреть документацию к компилятору. Например, про VS2013 написано, что сохраняются компилятором. А вообще обычно можно менять eax, ecd, edx, а остальное надо сохранять (там могут быть какие-то переменные или что-то ещё).
Цитата:
Ещё такой вопрос: если вдруг во время умножения результат разместился в edx:eax, выходит, int переполнился, и результат, который представлен уже 64мя битами, вывести в int возможным не представляется. Как можно предотвратить вылет программы из-за такого рода ошибок?
Так причин для вылета тут нет. Кстати, вообще-то с int'ами надо imul использовать, а если тут mul (так как результат неотрицательный), то тогда лучше unsigned. Если хочется получить весь результат, используй 64-битный тип.
Somebody вне форума Ответить с цитированием
Старый 17.02.2014, 15:52   #5
dorr
Пользователь
 
Регистрация: 26.12.2011
Сообщений: 13
По умолчанию

В VS2013 странное умножение какое-то, кстати. По идее mul не должен учитывать знака, насколько я знаю. Но отрицательные он нормально себе умножает.
dorr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужна консультация... Aralegi Компьютерное железо 16 10.08.2011 15:46
консультация по коду в с++ билдер 5 fidot Помощь студентам 0 04.03.2011 23:27
Нужна консультация NoVeto Помощь студентам 3 29.01.2010 00:10
нужна консультация =( ShuraFK Софт 3 27.04.2009 16:43
Необходима консультация Бегиннер Общие вопросы по Java, Java SE, Kotlin 3 17.02.2009 08:25