Как сравнить два 16-разрядных числа?

Обсуждаем контроллеры компании Atmel.
Ответить
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

Подскажите, как сравнить два 16-разрядных числа?
В регистре r16 - старший байт первого числа, в r17 - младший байт первого числа.
В регистре r18 - старший байт второго числа, в r19 - младший байт второго числа.
И если второе число больше первого - переход на первую метку (дальше в программе), а если второе меньше первого - на вторую.

То, что я сам пытаюсь придумать, состоит из большого числа команд. Может быть, можно делать такое сравнение быстро и эффективно?
Нашел такой код:

Код: Выделить всё

;сравнение 16-разрядных чисел
;вход:	Temp1-Temp2 первый аргумент от H к L
;		Temp3-Temp4 второй аргумент от H к L
;выход:	смотри флаги

;		cp		Temp2, Temp4
;		cpc		Temp1, Temp3
Запутался с флагами - они выставляются в зависимости от чисел: задаю такие-то числа, поднимаются одни флаги, задаю другие - поднимаются другие флаги. Не улавливаю системы. :facepalm:
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Код: Выделить всё

uint16_t a,b;
if(a>b) { ... } else {...};
И не мучать опу.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ

Сообщение просто КОТ »

Полагаю, речь об ассемблере.
Изображение
И ты врёшь!!! © Vladisman
Изображение
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Сообщение uldemir »

Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Реклама
Эиком - электронные компоненты и радиодетали
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

Да, речь об ассемблере, а не Си.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вы правда думаете что я асм от Си не отличаю? Говорю же - не мучайте опу! Пишите на человеческих языках. Скорость разработки выше, ошибок меньше, итоговый результат лучше.
Реклама
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

VladislavS, я понял, спасибо.

А по приведенному мной коду в первом посте - может там обращать внимание только на флаги Z и C? Z - если равны, а С - если второе число больше. А если никакие флаги не поднялись - второе число меньше.
А флаги H, S, N - в опу? :))
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

http://easyelectronics.ru/avr-uchebnyj-kurs-flagi.html

Для случая 16 бит надо их вычесть друг из друга и дальше действовать как описано по ссылке.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Не надо ничего вычитать; в приведенном коде правильно. Только почему-то закомментировано.

Код: Выделить всё

;сравнение 16-разрядных чисел
;вход:   Temp1-Temp2 первый аргумент от H к L
;      Temp3-Temp4 второй аргумент от H к L
;выход:   смотри флаги
      cp      Temp2, Temp4
      cpc      Temp1, Temp3
      BRNE  GO_BRNE
;действия при равенстве чисел
GO_BRNE:
Кстати, можно сравнивать числа большей разрядности
LDI R20,BYTE4(-1)
LDI R21,BYTE3(-1)
LDI R22,BYTE2(-1)
LDI R23,BYTE1(-1)

CP R3,R23
CPC R2,R22
CPC R1,R21
CPC R0,R20
BRMI
BRGE т.д.
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

Я тут варианты пробовал, забыл комментирование снять.
Мне нужно так: если второе число больше первого - переход на первую метку (дальше в программе), а если второе меньше первого - на вторую.
Тут еще подумал - а если равны - на третью.
По флагам я правильно думаю - только на С и на Z ориентироваться?
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Прошу обратить внимание. В ДШ не обозначено как устанавливается флаг Z командой сpc, а только сам факт что она влияет на Z, надо смотреть отдельный документ. Смысл в том, что если флаг Z был сброшен перед выполнением этой команды, то он останется сброшенным в любом случае. Именно это позволяет проводить такое сравнение в три команды.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Собутыльник Кота
Аватара пользователя
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Согласен, если регистры нельзя портить, то последовательное cp и cpc. Но по сути это то же вычитание, только результат выкидывается, остаются только флаги.
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Код: Выделить всё

      cp      Temp2, Temp4
      cpc      Temp1, Temp3
      BREQ  GO1
      BRCS GO2
      BRCC GO3
Конечно последний условный переход избыточен, но код понятнее смотрится.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

Да, именно так. Значит С и Z. Всем спасибо!

Добавлено after 5 minutes 41 second:
[uquote="uldemir",url="/forum/viewtopic.php?p=3506573#p3506573"]Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же[/uquote]
Наоборот - если есть перенос, то второе число больше. Зеро - равны. Нет поднятых флагов - второе число меньше первого.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Не вижу проблемы. От слова вообще. Покупаете или скачиваете книгу, где расписана система команд. В интернете много сайтов, где также расписана система команд. Или вам трудно самому поискать, надо участников форума напрячь этой простой задачей?
Вы жертва упадка образования? Не умеете искать информацию?
К примеру, один из сайтов: gaw.ru система команд
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 6322
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.
Изображение
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Demiurg писал(а): надо участников форума напрячь этой простой задачей?
Хотите расскажу Вам одну тайну, никто у Вас тут не напрягает и не отнимает время. Вы сами себя напрягаете или отнимаете у себя время, по собственному желанию. Для кого то банальные решения, кажутся трудновыполнимой задачей. А по Вашей логике надо закрывать форум вообще. ТС выложил свй код и спросил, именно для этого форум и сделан.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

[uquote="Jack_A",url="/forum/viewtopic.php?p=3507220#p3507220"]Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.[/uquote]
Никогда об этом не задумывался. Спасибо, приму к сведению.
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

[uquote="Z_h_e",url="/forum/viewtopic.php?p=3507241#p3507241"]Хотите расскажу Вам одну тайну[/uquote]
Хотите, я вам тоже одну тайну скажу. Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.
Контактная информация:
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Чт июл 11, 2013 12:37:39

Сообщение Vlad_RK »

[uquote="Demiurg",url="/forum/viewtopic.php?p=3507262#p3507262"]Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.[/uquote]
Так и сделал в 2004, когда начинал. К книге (Голубцов М.С. Микроконтроллеры AVR. От простого к сложному (2004)) прилагался CD с AVR Studio 4.06 и пр. Отладочную плату сделал сам.
В 2006 надобность в МК отпала, свой проект я сделал (успешно), дальше занимался другими вещами.
Прошло 12 лет, опять появилась потребность в МК. Очень многое забылось, но наверстал довольно быстро.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.
Мне никогда не приходилось сравнивать двухбайтные числа, вот и спросил. И не лень. Мне не нужно, чтобы всю нужную мне программу за меня кто-нибудь написал, я это сделаю сам, но иногда возникает нужда в алгоритмах, с которыми я дела не имел.

P.S. Чего ты ко мне прицепился?
Ответить

Вернуться в «AVR»