Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Алгоритмы, задачи по программированию, логические игры _ Алгоритм на асемблере

Автор: tribi 5.12.2010, 14:34

Дорогие участники форума передо мной стоит такая вот нелегкая для девушки задача, мне необходимо написать на асемблере прогу(я просто этот код копирую в блокнот и сохраняю с расширением asm) с функциями Умножения и сложения знакового числа 8 бит, помогите пожалуйста хотя бы подскажите где можно почитать, вообще я нашла алгоритм по отдельности вот, но как в одну прогу объединить не под силу мне, помогите, если вдруг я вообще ошиблась в правильности то если сможtте помогите...


Раскрывающийся текст

;add_sign - процедура сложения чисел размером 1 байт с учетом знака
:Вход: summand_1и summandj? - слагаемые.
:Выход: sum_b или sum_w - значение суммы в зависимости от наличия расширения знака.
---------------------------------------------------------------------

.data
sum_w label word
summandl db ? :значения в summand_1и summand_2 нужно внести
carry db 0; расширение знака
summand_2 db ?
.code
add_sign proc
mov al ,summand_2
add summand_l.a1
jc @@cfl_ofl
jo @<acfO_ofl
:cf=0 of=0 -> результат верный :cf"l of=0 -> результат верный r_true: jmp end__p результат -> summand_1@icfl_ofl: jno
@@cfl_of0 :cf=1 of=1 -> результат неверный
mov carry.0ffh расширение знака д.б. -1, результат ->sum_w
jmp end_p
:cf=1 of=0 -> результат верный
@@cfl_of0: jmp r_true результат -> summand_1:cf=0 of=1 -> результат неверный
@@cf0_ofl: mov carry.0 .-расширение знака д.б. =0. результат ->sum_w
jmp end_p end_p: ret add_sign endp

Программа учитывает возможное переполнение результата и перенос в старшие разряды. Для этого отслеживаются условия, задаваемые флагами, и выполняются действия:

    * CF=0F=0 — результат правильный и является положительным числом;
    * CF=1 0F=0 — результат правильный и является отрицательным числом;
    * CF=0F=1 — результат неправильный и является положительным числом, хотя правильный результат должен быть отрицательным (для корректировки необходимо увеличить размер результата в два раза и заполнить это расширение нулевым значением);
    * CF=0 0F=1 — результат неправильный и является отрицательным числом, хотя правильный результат должен быть положительным (для корректировки необходимо увеличить размер результата в два раза и произвести расширение знака).






Раскрывающийся текст
Умножение чисел размером 1 байт с учетом знака

;mul_sign.asm - программа умножения чисел размером 1 байт с учетом знака;Вход: multiplier], и multiplied - множители со знаком размерностью 1 байт.;Выход: product - значение произведения.
.data значения в multiplier], и multiplied нужно внести
product label word
productj label byte
multiplierl db ?;множитель 1 (младшая часть произведения)
product_h db 0 :старшая часть произведения
multiplied db ? :множитель 2
.code
mul_sign proc
mov al.multiplierl
imul multiplied :оценить результат:
jnc no_carry :нет переполнения - на no_carry обрабатываем ситуацию переполнения
mov productji.ah :старшая часть результата, знак результата - старший бит product_h no_carry: mov productj,al :младшая часть результата, productji - расширение знвка
ret
mul_sign endp. main:
call mul_sign end main

Автор: Iron Bug 5.12.2010, 23:57

книга: Питер Абель "Ассемблер и программирование для IBM PC" - классика жанра для начинающих. там подобных примеров полно. а такого уровня задачи почти на любой платформе более-менее одинаково выглядят.

P.S. пример выглядит вполне рабочим. в чём проблема?

Автор: AD 6.12.2010, 9:26


tribi, код следует оформлять в теги "["code"]" и "["/code"]" (без кавычек)! К ОФФТОПУ код не относится!

Автор: tribi 6.12.2010, 21:34

Iron Bug все дело что это не просто типичная функция а mmx регистры(

Автор: Iron Bug 7.12.2010, 10:26

а что, для сложения и умножения двух байтов уже mmx понадобился? какая разница, где хранить, если там больше двойного слова результат ну никак не получится?
читайте Абеля и будет вам счастье. для байтовых операций mmx необязателен совершенно.

Автор: tribi 7.12.2010, 17:57

Так лаба у меня такая, задания там, поэтому обязательно необходим mmx, вот смотрите:

Раскрывающийся текст
Лабораторная работа
«Интерфейс с ассемблером. Использование регистров MMX»

Содержание работы
Для демонстрации скорости работы регистров MMX написать две программы, реализующие одинаковую логику и выводящие время своей работы.

Методические указания к выполнению работы
Шаблон ассемблерной DLL выглядит следующим образом.
.586 ; разрешает непривилегированные
; команды Pentium
.XMM ; разрешает команды SSE
.MODEL FLAT ; задает модель памяти
PUBLIC _nameF@XX ; имя экспортируемой функции
.CODE ; сегмент кода

_start@12: ; точка входа в DLL mov al, 1; надо вернуть ненулевое число в EAX ret 12 ; очистить стек (передано три параметра)

_nameF@XX PROC ; заголовок функции
push ebp ; создаем стековый
mov ebp, esp ; кадр
; тело функции
pop ebp
ret
_nameF@XX ENDP ; завершение функции
END _start@12 ; точка выхода из DLL

Для компиляции используется Microsoft Macro Assembler v6.15.8803 (ml.exe), с ключами: /c /coff /Cp /D_MASM_, создающий объектный файл из файла с текстом на языке ассемблера. Для линкования используется Microsoft Incremental Linker v5.12.8278 (link32.exe), создающий файлы с расширениями *.exp, *.lib и *.dll, из файлов с расширениями *.obj и *.lnk. Файл с расширением *.lnk содержит инструкции линкера, следующего вида:
/DLL
/entry:start
/subsystem:windows
/export:nameF
Для автоматизации компиляции и линкования, рекомендуется создать командный файл, например:
rem go.bat
d:\work\asm\ml.exe /c /coff /Cp /D_MASM_ %1.asm
d:\work\asm\link32.exe %1.obj @%1.lnk
содержащий путь к исполняемым файлам, ключи компиляции и имена исходных файлов.
Macro Assembler искажает имена функций, следующим образом: перед именем вставляется символ подчеркивания, а после имени символ @ и размер области стека в байтах, которую занимают переданные параметры.
Ниже приведен пример создания DLL на ассемблере, содержащей функцию dMMX. Функция складывает содержимое массивов source и target, получает три параметра (размер массивов и адреса входного и выходного массивов), результат помещает в массив source.

.586
.XMM
.MODEL FLAT
PUBLIC _dMMX@12
.CODE
_start@12:
mov al, 1
ret 12

_dMMX@12 PROC
push ebp
mov ebp, esp

mov eax, [ebp+8] ;в eax - размер массивов
mov esi, [ebp+0Ch] ;в esi - адрес массива source
mov edi, [ebp+10h] ;в edi - адрес массива target
the_loop:
movq mm0, [esi] ;поместить в регистр mm0
;элемент массива source
movq mm1, [edi] ;поместить в регистр mm1
;элемент массива target
paddb mm0, mm1 ;сложить регистры mm0 и mm1
add esi, 8 ;следующие 4-ре элемента
add edi, 8 ;следующие 4-ре элемента
sub eax, 4 ;уменьшить значения счетчика
jnz short the_loop ;конец цикла?
emms

pop ebp
ret
_dMMX@12 ENDP

END _start@12


Варианты заданий на лабораторную работу

Сравнить скорость работы программ, написанных на «чистом» Си и с использованием ассемблера. Для этого по собственному номеру в группе (см. таблицу), выбрать последовательность ассемблерных команд и эквивалентную им математическую формулу.
Программу, написанную на Си необходимо компилировать с оптимизацией по скорости.

Ассемблерная команда 8 бит
sig*

умножение и сложение 4
* - sig – знаковое число, uns – число без знака

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)