Обсуждаем контроллеры компании Atmel.
Ответить

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

Сб ноя 17, 2018 12:39:18

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

То, что я сам пытаюсь придумать, состоит из большого числа команд. Может быть, можно делать такое сравнение быстро и эффективно?
Нашел такой код:
Код:
;сравнение 16-разрядных чисел
;вход:   Temp1-Temp2 первый аргумент от H к L
;      Temp3-Temp4 второй аргумент от H к L
;выход:   смотри флаги

;      cp      Temp2, Temp4
;      cpc      Temp1, Temp3
Запутался с флагами - они выставляются в зависимости от чисел: задаю такие-то числа, поднимаются одни флаги, задаю другие - поднимаются другие флаги. Не улавливаю системы. :facepalm:

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

Сб ноя 17, 2018 13:10:58

Код:
uint16_t a,b;
if(a>b) { ... } else {...};

И не мучать опу.

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

Сб ноя 17, 2018 13:20:53

Полагаю, речь об ассемблере.

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

Сб ноя 17, 2018 13:27:59

Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же

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

Сб ноя 17, 2018 13:36:28

Да, речь об ассемблере, а не Си.

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

Сб ноя 17, 2018 13:50:25

Вы правда думаете что я асм от Си не отличаю? Говорю же - не мучайте опу! Пишите на человеческих языках. Скорость разработки выше, ошибок меньше, итоговый результат лучше.

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

Сб ноя 17, 2018 14:01:51

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

А по приведенному мной коду в первом посте - может там обращать внимание только на флаги Z и C? Z - если равны, а С - если второе число больше. А если никакие флаги не поднялись - второе число меньше.
А флаги H, S, N - в опу? :))

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

Сб ноя 17, 2018 14:12:13

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

Для случая 16 бит надо их вычесть друг из друга и дальше действовать как описано по ссылке.

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

Сб ноя 17, 2018 14:43:45

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

Код:
;сравнение 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 т.д.

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

Сб ноя 17, 2018 15:08:15

Я тут варианты пробовал, забыл комментирование снять.
Мне нужно так: если второе число больше первого - переход на первую метку (дальше в программе), а если второе меньше первого - на вторую.
Тут еще подумал - а если равны - на третью.
По флагам я правильно думаю - только на С и на Z ориентироваться?

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

Сб ноя 17, 2018 15:09:25

Прошу обратить внимание. В ДШ не обозначено как устанавливается флаг Z командой сpc, а только сам факт что она влияет на Z, надо смотреть отдельный документ. Смысл в том, что если флаг Z был сброшен перед выполнением этой команды, то он останется сброшенным в любом случае. Именно это позволяет проводить такое сравнение в три команды.

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

Сб ноя 17, 2018 15:10:35

Согласен, если регистры нельзя портить, то последовательное cp и cpc. Но по сути это то же вычитание, только результат выкидывается, остаются только флаги.

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

Сб ноя 17, 2018 15:13:00

Код:
      cp      Temp2, Temp4
      cpc      Temp1, Temp3
      BREQ  GO1
      BRCS GO2
      BRCC GO3

Конечно последний условный переход избыточен, но код понятнее смотрится.

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

Сб ноя 17, 2018 15:46:26

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

Добавлено after 5 minutes 41 second:
Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же

Наоборот - если есть перенос, то второе число больше. Зеро - равны. Нет поднятых флагов - второе число меньше первого.

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

Вс ноя 18, 2018 14:17:41

Не вижу проблемы. От слова вообще. Покупаете или скачиваете книгу, где расписана система команд. В интернете много сайтов, где также расписана система команд. Или вам трудно самому поискать, надо участников форума напрячь этой простой задачей?
Вы жертва упадка образования? Не умеете искать информацию?
К примеру, один из сайтов: gaw.ru система команд

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

Вс ноя 18, 2018 15:00:49

Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.

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

Вс ноя 18, 2018 15:47:08

Demiurg писал(а): надо участников форума напрячь этой простой задачей?
Хотите расскажу Вам одну тайну, никто у Вас тут не напрягает и не отнимает время. Вы сами себя напрягаете или отнимаете у себя время, по собственному желанию. Для кого то банальные решения, кажутся трудновыполнимой задачей. А по Вашей логике надо закрывать форум вообще. ТС выложил свй код и спросил, именно для этого форум и сделан.

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

Вс ноя 18, 2018 16:10:58

Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.

Никогда об этом не задумывался. Спасибо, приму к сведению.

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

Вс ноя 18, 2018 16:11:13

Хотите расскажу Вам одну тайну

Хотите, я вам тоже одну тайну скажу. Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.

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

Вс ноя 18, 2018 16:27:35

Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.

Так и сделал в 2004, когда начинал. К книге (Голубцов М.С. Микроконтроллеры AVR. От простого к сложному (2004)) прилагался CD с AVR Studio 4.06 и пр. Отладочную плату сделал сам.
В 2006 надобность в МК отпала, свой проект я сделал (успешно), дальше занимался другими вещами.
Прошло 12 лет, опять появилась потребность в МК. Очень многое забылось, но наверстал довольно быстро.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.

Мне никогда не приходилось сравнивать двухбайтные числа, вот и спросил. И не лень. Мне не нужно, чтобы всю нужную мне программу за меня кто-нибудь написал, я это сделаю сам, но иногда возникает нужда в алгоритмах, с которыми я дела не имел.

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