Подскажите, как сравнить два 16-разрядных числа?
В регистре r16 - старший байт первого числа, в r17 - младший байт первого числа.
В регистре r18 - старший байт второго числа, в r19 - младший байт второго числа.
И если второе число больше первого - переход на первую метку (дальше в программе), а если второе меньше первого - на вторую.
То, что я сам пытаюсь придумать, состоит из большого числа команд. Может быть, можно делать такое сравнение быстро и эффективно?
Нашел такой код:
;сравнение 16-разрядных чисел
;вход: Temp1-Temp2 первый аргумент от H к L
; Temp3-Temp4 второй аргумент от H к L
;выход: смотри флаги
; cp Temp2, Temp4
; cpc Temp1, Temp3
Запутался с флагами - они выставляются в зависимости от чисел: задаю такие-то числа, поднимаются одни флаги, задаю другие - поднимаются другие флаги. Не улавливаю системы.
Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Вы правда думаете что я асм от Си не отличаю? Говорю же - не мучайте опу! Пишите на человеческих языках. Скорость разработки выше, ошибок меньше, итоговый результат лучше.
А по приведенному мной коду в первом посте - может там обращать внимание только на флаги Z и C? Z - если равны, а С - если второе число больше. А если никакие флаги не поднялись - второе число меньше.
А флаги H, S, N - в опу?
;сравнение 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)
Я тут варианты пробовал, забыл комментирование снять.
Мне нужно так: если второе число больше первого - переход на первую метку (дальше в программе), а если второе меньше первого - на вторую.
Тут еще подумал - а если равны - на третью.
По флагам я правильно думаю - только на С и на Z ориентироваться?
Прошу обратить внимание. В ДШ не обозначено как устанавливается флаг Z командой сpc, а только сам факт что она влияет на Z, надо смотреть отдельный документ. Смысл в том, что если флаг Z был сброшен перед выполнением этой команды, то он останется сброшенным в любом случае. Именно это позволяет проводить такое сравнение в три команды.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Согласен, если регистры нельзя портить, то последовательное cp и cpc. Но по сути это то же вычитание, только результат выкидывается, остаются только флаги.
Добавлено after 5 minutes 41 second:
[uquote="uldemir",url="/forum/viewtopic.php?p=3506573#p3506573"]Не скажу как в авр, но в пиках, делается так же как на старом 8080 - из одного числа вычитается второе. результат можно не сохранять, а пользоваться флагами результата - есть перенос, значит меньше, есть зеро - значит равны. нет ни одного, ни второго - тогда больше.
Думаю, в авр можно делать так же[/uquote]
Наоборот - если есть перенос, то второе число больше. Зеро - равны. Нет поднятых флагов - второе число меньше первого.
Не вижу проблемы. От слова вообще. Покупаете или скачиваете книгу, где расписана система команд. В интернете много сайтов, где также расписана система команд. Или вам трудно самому поискать, надо участников форума напрячь этой простой задачей?
Вы жертва упадка образования? Не умеете искать информацию?
К примеру, один из сайтов: gaw.ru система команд
Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.
Demiurg писал(а): надо участников форума напрячь этой простой задачей?
Хотите расскажу Вам одну тайну, никто у Вас тут не напрягает и не отнимает время. Вы сами себя напрягаете или отнимаете у себя время, по собственному желанию. Для кого то банальные решения, кажутся трудновыполнимой задачей. А по Вашей логике надо закрывать форум вообще. ТС выложил свй код и спросил, именно для этого форум и сделан.
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
[uquote="Jack_A",url="/forum/viewtopic.php?p=3507220#p3507220"]Vlad_RK Маленькое замечание: принято младшую часть размещать в четном регистре R, старшую - в R+1. Потому что команды, умеющие работать со словами (ADIW, SBIW etc) на регистрах R24..R31 -- по другому не поймут.[/uquote]
Никогда об этом не задумывался. Спасибо, приму к сведению.
[uquote="Z_h_e",url="/forum/viewtopic.php?p=3507241#p3507241"]Хотите расскажу Вам одну тайну[/uquote]
Хотите, я вам тоже одну тайну скажу. Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.
[uquote="Demiurg",url="/forum/viewtopic.php?p=3507262#p3507262"]Решил заниматься микроконтроллерами? Покупаешь бумажную книгу про микроконтроллерами, где подробно расписана архитектура мк, система команд, примеры. Тут же создаёшь свой первый проект. Проверяешь в симуляторе авр студио. Покупаешь отладочную плату, тут же на ней пробуешь примеры и собственные первые пробы. Это и есть настоящая учёба.[/uquote]
Так и сделал в 2004, когда начинал. К книге (Голубцов М.С. Микроконтроллеры AVR. От простого к сложному (2004)) прилагался CD с AVR Studio 4.06 и пр. Отладочную плату сделал сам.
В 2006 надобность в МК отпала, свой проект я сделал (успешно), дальше занимался другими вещами.
Прошло 12 лет, опять появилась потребность в МК. Очень многое забылось, но наверстал довольно быстро.
Вопрос тс примитивен. Это все равно что взять и спросить, как в столбик складывать двузначные числа. Этот вопрос сигнализирует о лени тс. Ему тупо лень.
Мне никогда не приходилось сравнивать двухбайтные числа, вот и спросил. И не лень. Мне не нужно, чтобы всю нужную мне программу за меня кто-нибудь написал, я это сделаю сам, но иногда возникает нужда в алгоритмах, с которыми я дела не имел.