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

 
 
 
Reply to this topicStart new topic
> Знаковое сравнение в 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
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
s.qwertyuiop
сообщение Jun 17 2009, 12:55
Сообщение #6





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



С-компилятор найти так и не удалось. Как я понял, нужны файлы из пакета Microchip C18 Toolsuite (mcc18.exe и иже с ними). Но найти их нигде не удалось, хотя при установке MPLAB я вроде бы ставил все опции. Где это все искать?
Go to the top of the page
 
+Quote Post
Herz
сообщение Jun 17 2009, 16:52
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(s.qwertyuiop @ Jun 17 2009, 14:55) *
С-компилятор найти так и не удалось. Как я понял, нужны файлы из пакета Microchip C18 Toolsuite (mcc18.exe и иже с ними). Но найти их нигде не удалось, хотя при установке MPLAB я вроде бы ставил все опции. Где это все искать?

Есть ли у Вас в \Program Files папка HI-TECH Software ?
Go to the top of the page
 
+Quote Post
s.qwertyuiop
сообщение Jun 18 2009, 07:23
Сообщение #8





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



Цитата(Herz @ Jun 17 2009, 20:52) *
Есть ли у Вас в \Program Files папка HI-TECH Software ?

Спасибо, нашел. Я почему-то думал, что всё должно быть в \Program Files\Microchip
Выбрал HI-TECH ANSI C-Compiler, это правильно? На сравнение signed char-ов он сгенерил:
Код
   129                          ;test.c: 9: if(x > y)
   130  003FEC  50E9                   movf    fsr0l,w,c
   131  003FEE  0A80                   xorlw    128
   132  003FF0  6E00                   movwf    ??_main& (0+255),c
   133  003FF2  50D9                   movf    fsr2l,w,c
   134  003FF4  0A80                   xorlw    128
   135  003FF6  5C00                   subwf    ??_main,w,c
   136  003FF8  A0D8                   btfss    status,0,c
   137  003FFA  EF00  F000             goto    start

Это что, нормально? А бит переполнения (ov) нельзя как-то использовать? Его же наверное не зря ввели в 18 серию?
Go to the top of the page
 
+Quote Post

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

 


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


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