Как было сказано выше, существует полная симметрия между действиями сложения и вычитания беззнаковых и знаковых чисел (последние, естественно, должны быть представлены в дополнительном коде). Это означает, что для знаковых вычислений можно использовать те же самые инструкции процессора, что и для беззнаковых. Более того, сами арифметические действия оказываются взаимозаменяемыми.
Очевидно, что
X – Y = X + (-Y) и X + Y = X - (-Y).
Отыскание разности X – Y равносильно добавлению к X числа Y взятого с противоположным знаком, а отыскание суммы X – Y может быть сведено к вычитанию из X числа противоположного по знаку Y.
Это очень сильный вычислительный прием, который при программировании AVR чаще всего используется в следующем контексте.
В их системе команд имеются инструкции вычитания константы из регистра subi Rd,K и sbсi Rd,K (вычитание с заемом), но отсутствуют такие же инструкции сложения регистра с константой. Поэтому добавить число к регистру можно только следующим образом
ldi R17,10 ;R17 = 10 add R16,R17 ;R16 = R16 + R17 = R16 + 10.
Число 10 заносится в промежуточный регистр R17, после чего используется команда сложения двух регистров add Rd,Rr. Однако благодаря использованию дополнительного кода тоже действие будет выглядеть как
subi R16, -10 ;R16 = R16 – (-10) = R16 + 10
Точно также к регистровой паре можно добавить 2-байтовое смещение
subi XL,low(-0x1234) ; XH:XL + 0x1234 = XH:XL – (-0x1234) sbсi XH,high(-0x1234)
Перейти к следующей части: Умножение и деление
Комментарии (0)
|
Я собрал (0) |
Подписаться
Для добавления Вашей сборки необходима регистрация