Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: знаковая арифметика в асме
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Старый Бабай
Подскажите как лучше организовать сложение и сравнение двух 16-ти разрядных чисел в асме.
А то совсем запутался
haker_fox
hi_byte1, hi_byte2 - старшие байты 2-х чисел
lo_byte1, lo_byte2 - младшие байты 2-х чисел

Если не ошибаюсь, то так:

Сложение:
add lo_byte1, lo_byte2 ;складываем младшие байты
adc hi_byte1, hi_byte2 ;складываем старшие байты + перенос от сложения младших байтов

Сравнение:
cp lo_byte1, lo_byte2
cpc hi_byte1, hi_byte2

Не помню точно, то вроде так...
IgorKossak
Со сравнением точнее так:
Код
; Compare r3:r2 with r1:r0
cp r2,r0; Compare low byte
cpc r3,r1; Compare high byte
brne noteq; Branch if not equal
...
noteq: nop; Branch destination (do nothing)
mse
Цитата
Со сравнением точнее так

;О) Совсем наоборот. Ключевое слово в вопросе - "знаковое".
$ffff<$0001(-1<1), а казалось бы...
Надо разделять сравнение по операндам. "+" всегда > "-". А дальше, "+" и "-" каждый по своему. В смысле, проццедура одна - cp-cpc, но чтобы знаки были одинаковы.
IgorKossak
Цитата(mse @ Dec 13 2005, 11:55) *
...В смысле, проццедура одна - cp-cpc, но чтобы знаки были одинаковы.

Как раз таки совсем не обязательно, чтобы знаки были одинаковыми.
Главное, соблюсти знаковость как таковую. Т. е. оба операнда должны быть либо знаковыми, либо беззнаковыми.
Для сравнения знаковых и беззнаковых операндов существуют различные ИНСТРУКЦИИ СРАВНЕНИЯ. См. AVR Instruction Set документ на сайте Atmel.
mse
Цитата
Как раз таки совсем не обязательно, чтобы знаки были одинаковыми.

Интересно, как это? В особенности
Цитата
Главное, соблюсти знаковость как таковую.

Что это значит?
Я-ж дал пример:"-1" и"1", $ffff и 0001, соотвецтвенно. Как сравнить эту пару напрямую, без прямого предварительного анализа знаков?
А если знаки одинаковы, то никакой "знаковости" соблюдать и не надо: "-2" < "-1" , $fffe<$ffff, соотвецтвенно. Как и "0" < "1", 0000<0001. Это решается обычной связкой CP...CPC. Шо знаковой, шо беззнаковой. Тонкость имана при РАЗНЫХ знаках.


Цитата
Для сравнения знаковых и беззнаковых операндов существуют различные ИНСТРУКЦИИ СРАВНЕНИЯ.

Оба-на! ;О) Видать, давно я не заглядывал в
Цитата
AVR Instruction Set документ на сайте Atmel.
IgorKossak
Цитата(mse @ Dec 13 2005, 12:42) *
... Я-ж дал пример:"-1" и"1", $ffff и 0001, соотвецтвенно. Как сравнить эту пару напрямую, без прямого предварительного анализа знаков?...

Вот так:
Код
; Compare r3:r2 with r1:r0
; r3:r2 = Rd
; r1:r0 = Rs
; Сравниваем, например на меньше Rd < Rs

; Для знаковых
    cp r2,r0; Compare low byte
    cpc r3,r1; Compare high byte
    brlt lower; Branch if r3:r2 lower then r1:r0
    ...
lower:
    nop; Branch destination (do nothing)

;Для беззнаковых
; ...
    brlo lower; Branch if r3:r2 lower then r1:r0
; ...

И никаких дополнительных анализов.
Ещё раз рекомендую почитать AVR Instruction Set
mse
Ну, блин... хороша команда сравнения brlt. ;О) хотя, да, забыл про неё.
Старый Бабай
Спасибо за разъяснения
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.