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

 
 
> Знаковое сравнение в PIC18, в PIC16 тоже интересно :)
s.qwertyuiop
сообщение Jun 17 2009, 07:13
Сообщение #1





Группа: Новичок
Сообщений: 7
Регистрация: 17-06-09
Пользователь №: 50 370



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

А также - как это сделать в PIC16 в котором нет даже бита переполнения, но это уже чисто из любопытства, надеюсь на нем работать не придется...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SKov
сообщение Jun 17 2009, 07:31
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(s.qwertyuiop @ Jun 17 2009, 11:13) *
Каким образом можно сравнить два знаковых числа и выполнить переход если одно из них больше? Хотя бы однобайтовые, хотя многобайтовые тоже интересны.

А также - как это сделать в PIC16 в котором нет даже бита переполнения, но это уже чисто из любопытства, надеюсь на нем работать не придется...


Самый простой ответ - пишите программу на Си, и компилятор все сам сделает wink.gif
Если все-таки интересно на ассемблере, то тоже очень просто. ПИК не знает , что такое знаковое число и что такое беззнаковое число.
У него есть две команды - сложить (тут все понятно, при переполнении взводится флаг С в регистре статуса) и вычитание.
С вычитанием есть маленькая хитрость. Флаг С взводится, если при вычитании НЕ произошел заем за границей разрядной сетки.
А вообще, смотрите описание ассемблерной команды вычитания - там все четко написано.
Так что бит переполнения есть - это флаг С.
Go to the top of the page
 
+Quote Post
s.qwertyuiop
сообщение Jun 17 2009, 07:48
Сообщение #3





Группа: Новичок
Сообщений: 7
Регистрация: 17-06-09
Пользователь №: 50 370



Цитата(SKov @ Jun 17 2009, 11:31) *
Самый простой ответ - пишите программу на Си, и компилятор все сам сделает wink.gif

Интересный совет, осталось найти Си-компилятор...
Цитата(SKov @ Jun 17 2009, 11:31) *
Если все-таки интересно на ассемблере, то тоже очень просто. ПИК не знает , что такое знаковое число и что такое беззнаковое число.
У него есть две команды - сложить (тут все понятно, при переполнении взводится флаг С в регистре статуса) и вычитание.
С вычитанием есть маленькая хитрость. Флаг С взводится, если при вычитании НЕ произошел заем за границей разрядной сетки.

То есть при вычитании C инверсный? Спасибо, не знал.
Цитата(SKov @ Jun 17 2009, 11:31) *
А вообще, смотрите описание ассемблерной команды вычитания - там все четко написано.
Так что бит переполнения есть - это флаг С.

Спасибо, это все рассказывают в школе на уроках информатики. Флаг C устанавливается если произошел перенос из самого старшего бита, следовательно он является переполнением при беззнаковом сравнении. Для знакового же переполнением является перенос из предпоследнего разряда в последний, при этом устанавливается бит OV. Но признаком перехода по больше/меньше является не он, а "исключающее или" переполнения и знака. Обычно в процессорах есть либо такой флаг, либо команда перехода по значению этого "исключающего или". В пике я не нашел ни того, ни другого. Как же работать со знаковыми числами?
Go to the top of the page
 
+Quote Post
SKov
сообщение Jun 17 2009, 08:14
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 812
Регистрация: 22-01-05
Из: SPb
Пользователь №: 2 119



Цитата(s.qwertyuiop @ Jun 17 2009, 11:48) *
Интересный совет, осталось найти Си-компилятор...

То есть при вычитании C инверсный? Спасибо, не знал.

Спасибо, это все рассказывают в школе на уроках информатики. Флаг C устанавливается если произошел перенос из самого старшего бита, следовательно он является переполнением при беззнаковом сравнении. Для знакового же переполнением является перенос из предпоследнего разряда в последний, при этом устанавливается бит OV. Но признаком перехода по больше/меньше является не он, а "исключающее или" переполнения и знака. Обычно в процессорах есть либо такой флаг, либо команда перехода по значению этого "исключающего или". В пике я не нашел ни того, ни другого. Как же работать со знаковыми числами?


Да, такого флага там нет. Как известно из школьных уроков информатики, знаковые отрицательные числа удобно хранить
в дополнительном коде, в этом случае все операции выполняются через сложение.
В этом случае при сложении чисел с разным знаковым разрядом переполнение невозможно, а при сложении чисел с одинаковым
знаковым разрядом признаком переполнения может служить факт изменения знака у результата по сравнению с исходными слагаемыми.
Очевидно, этот механизм можно использовать и в ПИКах.
Относительно "где взять компилятор Си" - то для новичка этого форума простительно не знать, что бесплатный компилятор
входит в последние версии MPLABа. wink.gif Кстати, это очень удобный инструмент для поиска ответов на многие вопросы типа
"а как это делает ПИК". Вы пишите интересующую вас операцию на Си, потом переходите в окошко дизассемблерного варианта вашей программы
и смотрите как те или иные конструкции языка Си реализуются компилятором.
Go to the top of the page
 
+Quote Post
s.qwertyuiop
сообщение Jun 17 2009, 09:31
Сообщение #5





Группа: Новичок
Сообщений: 7
Регистрация: 17-06-09
Пользователь №: 50 370



Цитата(SKov @ Jun 17 2009, 12:14) *
Относительно "где взять компилятор Си" - то для новичка этого форума простительно не знать, что бесплатный компилятор
входит в последние версии MPLABа. wink.gif

Я слышал об этом smile.gif Но сделать проект на Си пока не удалось. Сейчас попробую еще.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 05:15
Рейтинг@Mail.ru


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