Поиск:

Ответ в темуСоздание новой темы Создание опроса
> максимум двух чисел, помогите! 
:(
    Опции темы
Анютка
Дата 17.3.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 22.11.2005
Где: Моск.область

Репутация: нет
Всего: нет



помогите решить,пожалуйста:найти максимум двух чисел,не используя команд условного переда
PM MAIL   Вверх
Akina
Дата 17.3.2006, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 1
Всего: 454



а как заданы операнды? на регистрах (каких)? в памяти (где, какого размера)?
куда надо вернуть результат?

например:

Код

' сляпано на коленке - проверь                               ,
max proc 
' AX = MAX(AX,DX)
' беззнаковое сравнение
push bx
push cx
push ax
push dx
sub ax,dx
rcr
xor ax,ax
mov dx,ax
rcr dx
sub ax,dx
mov dx,ax
not dx
pop bx ' возможно, их
pop cx ' надо поменять
and bx,ax
and cx,dx
add ax,dx
pop cx
pop bx
ret
max endp



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
sgi1981
Дата 18.3.2006, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Вообще, если операнды являются беззнаковыми байтами, знаковыми двухбайтными словами, или вещественными числами короткого формата (4 байта), то реализовать код очень просто с помощью MMX - инструкций.
Но он будет работать на процессорах не ниже Pentium III smile

Максимальное значение
для целочисленных операндов - двухбайтных знаковых слов заданных в регистрах ax, dx.

Комментарии - чтобы было понятно.
Внимание - работает только на процах не ниже Pentium III.
Код

max_from_2_sign_word proc
' AX = MAX(AX,DX)
'знаковое сравнение
pinsrw xmm1,eax,0; грузим младшую часть eax в младшее двухбайтное слово MMX- регистра xmm1
; маска 0 содержит номер слова в MMX регистре, которое будет записано
pinsrw xmm2,edx,0; грузим младшую часть edx в младшее двухбайтное слово MMX- регистра xmm2
pmaxsw xmm1,xmm2; команда сразу обрабатывает четыре пары слов
;сравнивает четыре двухбайтных слова xmm1 
;с соответствующими четырьмя двухбайтными словами xmm2 и 
;возвращает в приемник xmm1 соответственно большие с учетом знака слова
pextrw eax,xmm1,0; извлечение в младшее слово регистра eax по маске 0 младшего слова xmm1
; старшее слово eax обнуляется
emms; приведение тегов устройства операций с плавающей точкой в состояние
; пригодное для выполнения команд сопроцессора
ret
max_from_2_sign_word endp


Минимальное значение
для целочисленных операндов - двухбайтных знаковых слов заданных в регистрах ax, dx.

Комментарии - чтобы было понятно.
Внимание - работает только на процах не ниже Pentium III.
Код

min_from_2_sign_word proc
' AX = MIN(AX,DX)
' знаковое сравнение
pinsrw xmm1,eax,0; грузим младшую часть eax в младшее двухбайтное слово MMX- регистра xmm1
; маска 0 содержит номер слова в MMX регистре, которое будет записано
pinsrw xmm2,edx,0; грузим младшую часть edx в младшее двухбайтное слово MMX- регистра xmm2
pminsw xmm1,xmm2; команда сразу обрабатывает четыре пары слов
;сравнивает четыре двухбайтных слова xmm1 
;с соответствующими четырьмя двухбайтными словами xmm2 и 
;возвращает в приемник xmm1 соответственно меньшие с учетом знака слова
pextrw eax,xmm1,0; извлечение в младшее слово регистра eax по маске 0 младшего слова xmm1
; старшее слово eax обнуляется
emms; приведение тегов устройства операций с плавающей точкой в состояние
; пригодное для выполнения команд сопроцессора
ret
min_from_2_sign_word endp


Максимальное значение
для целочисленных операндов - беззнаковых байтов заданных в регистрах al, dl.

Комментарии - чтобы было понятно.
Внимание - работает только на процах не ниже Pentium III.
Код

max_from_2_byte proc
' al = MAX(al,dl)
'знаковое сравнение
pinsrw xmm1,eax,0; грузим младшую часть eax в младшее двухбайтное слово MMX- регистра xmm1
; маска 0 содержит номер слова в MMX регистре, которое будет записано
pinsrw xmm2,edx,0; грузим младшую часть edx в младшее двухбайтное слово MMX- регистра xmm2
pmaxub xmm1,xmm2; команда сразу обрабатывает восемь пар байтов
;сравнивает восемь байтов xmm1 
;с соответствующими восьмюмя байтами xmm2 и 
;возвращает в приемник xmm1 соответственно большие без учета знака байты
pextrw eax,xmm1,0; извлечение в младшее слово регистра eax по маске 0 младшего слова xmm1
; старшее слово eax обнуляется
emms; приведение тегов устройства операций с плавающей точкой в состояние
; пригодное для выполнения команд сопроцессора
ret
max_from_2_byte endp


Минимальное значение
для целочисленных операндов - беззнаковых байтов заданных в регистрах al, dl.

Комментарии - чтобы было понятно.
Внимание - работает только на процах не ниже Pentium III.
Код

min_from_2_byte proc
' al = MIN(al,dl)
'знаковое сравнение
pinsrw xmm1,eax,0; грузим младшую часть eax в младшее двухбайтное слово MMX- регистра xmm1
; маска 0 содержит номер слова в MMX регистре, которое будет записано
pinsrw xmm2,edx,0; грузим младшую часть edx в младшее двухбайтное слово MMX- регистра xmm2
pminub xmm1,xmm2; команда сразу обрабатывает восемь пар байтов
;сравнивает восемь байтов xmm1 
;с соответствующими восьмюмя байтами xmm2 и 
;возвращает в приемник xmm1 соответственно меньшие без учета знака байты
pextrw eax,xmm1,0; извлечение в младшее слово регистра eax по маске 0 младшего слова xmm1
; старшее слово eax обнуляется
emms; приведение тегов устройства операций с плавающей точкой в состояние
; пригодное для выполнения команд сопроцессора
ret
min_from_2_byte endp



А теперь подпрограмма возврата максимального вещественного числа короткого формата.

Внимание ! Эта подпрограмма выполняется только на процессорах не ниже Pentium III.

Исходные операнды - вещественные числа короткого формата, расположениы в сегменте стека
Результат возвращается в регистре st(0) сопроцессора.
Подпрограмма ближнего вызова.
Код

max_from_2_float proc
push ebp
mov ebp, esp
sub esp,4;
movss xmm1, [ebp+8]; скалярная загрузка младшего числа 128 разрядного XMM-регистра 32-разрядным 
;вещественным числом
maxss xmm1, [ebp+12];сравниваем скалярно загруженное с ячейкой памяти
movss [ebp-4], xmm1;отправляем скалярно
fld dword ptr [ebp-4];грузим в вершину стека сопроцессора это число
add esp,4;
pop ebp
ret
max_from_2_float endp


И для возврата минимального значения соответственно.
Комментарии выше...
Внимание ! Эта подпрограмма выполняется только на процессорах не ниже Pentium III.

Код

min_from_2_float proc
push ebp
mov ebp, esp
sub esp,4;
movss xmm1, [ebp+8]
minss xmm1, [ebp+12]
movss [ebp-4], xmm1
fld dword ptr [ebp-4]
add esp,4;
pop ebp
ret
min_from_2_float endp



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sgi1981
Дата 18.3.2006, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 2
Всего: 10



Да, и ещё хочу напомнить.
Если ваш компилятор не распознает MMX или XMM команды, то их можно писать в машинном коде.
Коды команд

emms 00001111 : 01110111
pextrw r32, xmm, i8 00001111 : 11000101 : 11 mmx r32 : i8
pinsrw xmm, r32/m16, i8 00001111 : 11000100 : mod reg r/m : i8
pmaxub mmx, mmx/m64 00001111 : 11011110 : mod mmx r/m
pmaxsw mmx, mmx/m64 00001111 : 11101110 : mod mmx r/m
pminub mmx, mmx/m64 00001111 : 11011010 : mod mmx r/m
pminsw mmx, mmx/m64 00001111 : 11101010 : mod mmx r/m
minss xmm, xmm/m32 11110011 : 00001111 : 01011101 : mod xmm r/m
maxss xmm, xmm/m32 11110011 : 00001111 : 01011111 : mod xmm r/m
movss xmm, xmm/m32 11110011 : 00001111 : 00010000 : mod xmm r/m
movss xmm/m32, xmm 11110011 : 00001111 : 00010001 : mod xmm r/m

Операнд mmx в названии команды - MMX-регистр или XMM-регистр в зависимости от типа команды.
Поле mmx в коде команды - трехбитное число означающее номер используемого регистра
Поле r/m - трехбитное поле режима адресации операнда в памяти или номер второго регистра при использовании в качестве операндов двух регистров (в этом случае двухбайтное поле mod равно 11).
Поле mod вместе с r/m - задает режим адресации ячейки памяти.




--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.4646 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.