Отпрыск ChatGPT
30 / 27 / 4
Регистрация: 18.06.2019
Сообщений: 136
|
|||||||||||
1 | |||||||||||
CMP и флаг переноса30.06.2019, 08:16. Показов 6036. Ответов 7
Я не могу понять, почему ставится флаг арифметического переноса (Carry bit) в CPSR, если второй операнд CMP меньше и не отрицателен. Причем значения такие, которые явно не выходят за границы 32-битного числа, вроде:
0
|
30.06.2019, 08:16 | |
Ответы с готовыми решениями:
7
Флаг переполнения и переноса Флаг переноса и таймеры Вспомогательный флаг переноса (AF) Сдвига через флаг переноса, где ОШИБКА ? |
3219 / 2362 / 540
Регистрация: 11.09.2009
Сообщений: 8,605
|
|
30.06.2019, 10:01 | 2 |
Откройте систему команд вашего контроллера. Там написано, что делает каждая команда и как интерпретируются числа в регистрах. Написаная в ассемблерном тексте "#-1" - это всего лишь все единицы в бинарном коде (максимальное число в регистре).
1
|
Модератор
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
|
|
30.06.2019, 10:20 | 3 |
первое CMP это команда вычитания только без записи результата
второе у микроконтроллеров нет отрицательных чисел, чаще всего они представляются в дополнительном коде число -1 это будет, у 8 битки , 255, или 11111111, для 32 бит тоже самое просто единиц больше, 32 теперь посмотри что будет 0-4 и 4294967295( тоже что и -1) -4 будет переполнение или нет?
0
|
Отпрыск ChatGPT
30 / 27 / 4
Регистрация: 18.06.2019
Сообщений: 136
|
||||||
30.06.2019, 17:15 [ТС] | 4 | |||||
Сообщение от ARM Keil Assembler User Guide: CMP and CMN
Поэтому я и спросил, почему при вычитании в беззнаковом представлении меньшего числа из большего - ставится флаг переноса, хотя там никаких заимствований при вычитании не требуется: Код
0000 0100 -0000 0001 _________ 0000 0011 А при вычитании наоборот большего числа в беззнаковом представлении (но все еще меньшего в знаковом), флаг переноса не ставится, когда хоть число и меньше, но при таком вычитании произойдет заимствование единичек из ниоткуда и поэтому вроде в этом случае и должен поставиться флаг переноса. Код
0000 0100 -1111 1111 _________ 1111 1011 Было бы здорово, но в инструкциях по ARMу только и написано, что просто задействуется такой флаг в регистре. И больше не написано как и при каких условиях. Ну и у меня нет на примете какого-то микроконтроллера в имении, я пользуюсь общим эмулятором ARMv7, cpulator который.
0
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
30.06.2019, 18:36 | 5 |
Сообщение было отмечено Azawa как решение
Решение
Я вот не писал еще для ARM, но писал для множества архитектур и знаю что.
- есть редкие архитектуры у которых флаг переноса при вычитании, а значит и при сравнении, выставляется строго наоборот нежели имеет смысл при сложении). Ну вот строго наоборот. К таким архитектурам относится микрочиповский PIC - это вызвано прямолинейной реализацией вычитания в АЛУ по формуле A - B = A + ~B + 1 легко видеть, что при такой реализации вычитания вычитание сводится к инвертированию B и исполнению adc положив carry=1. Вот если флаги после такой операции оставить такими как они получились после adc, то флаг переноса после вычитания и сравнения окажется строго наоборотным - возможно и в ARM точно такой-же строго наоборотный флаг переноса после вычитания и сравнения (нежели имеет смысл при сложении)
1
|
Отпрыск ChatGPT
30 / 27 / 4
Регистрация: 18.06.2019
Сообщений: 136
|
|
30.06.2019, 20:09 [ТС] | 6 |
Да, действительно, с точки зрения реализации архитектуры это имеет смысл, т.к. достаточно просто и быстро.
Вообщем, все же я нашел строку в документации. Я был не прав, сказав что пояснении этому случаю нет:
Сообщение от ARM Information Center: Carry flag
Хотя до ответа Ethereal казалось совершенно логичным, что положение флага должно быть одинаковым для обоих случаев что для переноса, что для заимствования. Однако, такой вот неочевидный момент.
1
|
3219 / 2362 / 540
Регистрация: 11.09.2009
Сообщений: 8,605
|
|
30.06.2019, 22:26 | 7 |
1
|
6770 / 2739 / 384
Регистрация: 17.02.2013
Сообщений: 4,048
|
|
01.07.2019, 05:09 | 8 |
Там-же и не там. Систему команд он нашел в этой книге
http://www.keil.com/support/man/docs/ARMASM/ И что-то смотрю в нее и пояснения по флагу переноса не вижу. Пояснение он нашел здесь : http://infocenter.arm.com/help... DCDHH.html А это что, следующая, 6-я версия той-же книги ? А по первой ссылке 5-я версия ? Оглавление похоже, но там где в 6-й версии главы Carry flag и Overflow flag в 5-й версии именно этих глав нет. Так-что там где он нашел, он не нашел, а нашел там-же, но не там. Да и то в другом конце книги. Чего меня это так заинтересовало, а то, что я много раз видел когда в описании самых разных систем команд нюансы опускались и их легче было выяснить методом тыка, чем где-либо вычитать. Вот только в интеловском толстенном гроссбухе по x86 я видел вполне исчерпывающее описание.
0
|
01.07.2019, 05:09 | |
01.07.2019, 05:09 | |
Помогаю со студенческими работами здесь
8
Почему если флаг состояния потока eof поднят, то флаг good опущен? Нарисовать на экране дисплея флаг РФ, Японский флаг Как реализовать флаг cat -v флаг в си? Наследование в CMP Помощь по PK и CMP Проверка с cmp Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |