Вопрос к знатокам семейства 51. Так как же сравнивать числа со знаком?
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Bill 03 декабря 2002 г. 09:57

Вчера вечером завязалась маленькая дискуссия по поводу сравнения различных систем команд (51 и AVR). Я задал простой, на первый взгляд, вопрос: как будет выглядеть процедура сравнения байтовых чисел со знаком, причем сравнения типа <=, >=, < и >. Для простоты - некоторой переменной и -1. Не будучи знатоком 51, я просто хотел знать как это делается у данного семейства. К сожалению, из-за позднего времени (меня попросили очистить помещение) мне пришлось покинуть дискуссию, а сегодня просмотрев сообщения участников, я понял, что мой вопрос остался без ответа. Когда я почитал дома доступную литературу по семейству 51, то вопросов появилось еще больше.
Большое спасибо уважаемым Elektronik, SM, BH, просто так за ответы, но тем не менее...
Операция сравнения двух операндов выполняется путем вычитания одного операнда из другого без сохранения результата. Меняются только флажки признаков в регистре состояния. В 51 процессоре при выполнении комады cjne меняется только признак переноса C. Данный флаг позволяет правильно интерпретировать условия < и >= только для БЕЗЗНАКОВЫХ операндов, о чем собственно и говорится в описании команды. Далее, поскольку операция сравнения важна не сама по себе, а служит для организации ветвления в программе, то после команды сравнения обычно следуют команды условных переходов по тем или иным признакам. У 51-го, как я понял, есть следующие команды переходов: jb, jc, jnb, jnc, jnz, jz.
Для сравнения AVR имеет целый набор признаков для выполнения операций со знаком: C, Z, V, N, S и соответствующий набор команд условных переходов. Поэтому сравнение чисел со знаком или без знака выполняется просто:
cpi r16, -1 ; Сравнение
brlt _slt ; если < (со знаком)

brlo _ult ; если < (без знака)
и т.д.
Причем в качестве условия для переходов, часто служит не просто состояние того или иного признака, а комбинация нескольких признаков.
К сведению уважаемых Elektonika и просто так, в моем примере нет ничего притянутого за уши, ибо ВСЕ операции в AVR выполняются ТОЛЬКО с регистрами и я умышленно не добавил команды условного перехода. В конце концов совершенно неважно где находятся операнды для сравнения, как они туда попали и какие команды условного перехода требуются для ветвления. Для меня важно знать КАК ИМЕННО можно выполнить саму операцию сравнения чисел со знаком.
Теперь собственно вопросы.
1. Каким образом можно выполнить операцию сравнения операндов со знаком (последовательность команд, подпрограмма)и каким условным переходом можно воспользоваться после этого, скажем для условий < и >=. Скажем код может выглядеть примерно так:
acall SCOMP ; Сравнить
jxxx _lt ; Переход если меньше

jxxx _ge ; Переход если больше или равно
Конечно же можно взять компилятор и, пропустив соответствующую программу через него, посмотреть какой код будет сгенерирован в этом случае. Но, к сожалению, у меня нет никакого компилятора для x51.
2. Вопрос специфический. У x51 есть флажок переполнения O, но просмотрев систему команд, я не нашел ни одной команды, где бы он использовался. Там сказано, данный флаг изменяется при выполнении команд сложения и вычитания. А что дальше? Как я мог бы его использовать?
Заранее благодарен всем, у кого хватило терпения дочитать мое сообщение до конца и пожелавшим ответить на него. Возможно это выглядит как флейм, но кто знает ...

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru