реклама на сайте
подробности

 
 
> знаковая арифметика в асме, знаковое сложение и сравнение.
Старый Бабай
сообщение Dec 13 2005, 09:07
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 104
Регистрация: 5-12-05
Из: Екатеринбург
Пользователь №: 11 823



Подскажите как лучше организовать сложение и сравнение двух 16-ти разрядных чисел в асме.
А то совсем запутался
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 8)
haker_fox
сообщение Dec 13 2005, 09:15
Сообщение #2


Познающий...
******

Группа: Свой
Сообщений: 2 963
Регистрация: 1-09-05
Из: г. Иркутск
Пользователь №: 8 125



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

Не помню точно, то вроде так...


--------------------
Выбор.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 13 2005, 09:29
Сообщение #3


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Со сравнением точнее так:
Код
; 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)
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 13 2005, 09:55
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата
Со сравнением точнее так

;О) Совсем наоборот. Ключевое слово в вопросе - "знаковое".
$ffff<$0001(-1<1), а казалось бы...
Надо разделять сравнение по операндам. "+" всегда > "-". А дальше, "+" и "-" каждый по своему. В смысле, проццедура одна - cp-cpc, но чтобы знаки были одинаковы.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 13 2005, 10:21
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(mse @ Dec 13 2005, 11:55) *
...В смысле, проццедура одна - cp-cpc, но чтобы знаки были одинаковы.

Как раз таки совсем не обязательно, чтобы знаки были одинаковыми.
Главное, соблюсти знаковость как таковую. Т. е. оба операнда должны быть либо знаковыми, либо беззнаковыми.
Для сравнения знаковых и беззнаковых операндов существуют различные ИНСТРУКЦИИ СРАВНЕНИЯ. См. AVR Instruction Set документ на сайте Atmel.
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 13 2005, 10:46
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата
Как раз таки совсем не обязательно, чтобы знаки были одинаковыми.

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

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


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

Оба-на! ;О) Видать, давно я не заглядывал в
Цитата
AVR Instruction Set документ на сайте Atmel.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Dec 13 2005, 10:57
Сообщение #7


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(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
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 13 2005, 11:05
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Ну, блин... хороша команда сравнения brlt. ;О) хотя, да, забыл про неё.
Go to the top of the page
 
+Quote Post
Старый Бабай
сообщение Dec 13 2005, 12:00
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 104
Регистрация: 5-12-05
Из: Екатеринбург
Пользователь №: 11 823



Спасибо за разъяснения
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 21:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01462 секунд с 7
ELECTRONIX ©2004-2016