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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2012, 01:08   #1
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию Проблема с процедурой

Здравствуйте. Мне необходимо написать процедуру Big2sSub, которая бы находила разницу двух больших чисел M1=M1-M2, M1,M2 - байтовые массивы длинной len; Должны использоваться команды для 32-розрядных данных. Если длина не кратна 4, то для суммы последних байт использовать команды для 8-разрядных данных.
Кусок кода модуля процедуры:

Код:
Big2sSub proc ;void Big2sSub(byte* M1, byte* M2, short len); // – М1=М1-М2
; @M1 - *адрес байтового массива
@M1         equ         [ebp+8] 
; @M2 - адрес байтового массива
@M2        equ         [ebp+12] 
len	   equ		   [ebp+14]

		push    ebp
		mov     ebp,esp        ; базовый адрес фактических параметров

...................
...................


pop ebp
		ret
Big2sSub endp
end
У меня возник вопрос как в Assembler обращаться к элементам массивов, если в процедуру они передаються в виде &M1,&M2, т.е. передаються адреса массивов?

А также что за команды должны использоватся для отнимания 32-разрядных данных и для 8-разрядных данных? Я знаю лишь SUB, но она для всех одинакова насколько я знаю.

Спасибо большое!
eymar вне форума Ответить с цитированием
Старый 14.12.2012, 01:58   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
У меня возник вопрос как в Assembler обращаться к элементам массивов, если в процедуру они передаються в виде &M1,&M2, т.е. передаються адреса массивов?
Как это делают компиляторы, скрывая мелочи для удобства. Включаем голову... Что такое массив? Это ряд (последовательность) ящиков. Теперь - мы значаем где начало этого ряда (адрес массива), как найти начало второго ящика?
p51x вне форума Ответить с цитированием
Старый 14.12.2012, 23:42   #3
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию

Я попытался организовать это так:

Код:
mov ebx,@M1				; записываю адресс первого массива
		lea ebx,[ebx+ecx*4]-4	; записываю адресс последнего элемента первого массива
		mov esi,dword ptr[ebx]	; записываю последние 4 байта первого массива
И это все в цыкле loop, только вот оно не работает, выдает сообщение о том что заверешена работа программы. Но если закоментировать mov esi,dword ptr[ebx], тогда программа не завершается. Т.е. у меня вот как раз не верно организовано обращение к элементам. Подправьте, пожалуйста.
eymar вне форума Ответить с цитированием
Старый 15.12.2012, 01:09   #4
eymar
Пользователь
 
Регистрация: 23.09.2012
Сообщений: 17
По умолчанию

Очень сильно прошу подсказку. Просто уже второй день это мне не дает продвигаться дальше.
eymar вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Здраствуйте! проблема с процедурой. хлебец Помощь студентам 0 31.05.2011 19:23
Проблема с хранимой процедурой в Delphi Innnni Помощь студентам 0 01.05.2011 18:54
Проблема с дочерней процедурой reser Помощь студентам 5 10.08.2010 21:03
Проблема с процедурой Gettime erazer89 Паскаль, Turbo Pascal, PascalABC.NET 0 09.09.2009 17:57
Проблема с хранимой процедурой Lion-Tiger БД в Delphi 6 08.06.2009 13:32