Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.90/31: Рейтинг темы: голосов - 31, средняя оценка - 4.90
Отпрыск ChatGPT
30 / 27 / 4
Регистрация: 18.06.2019
Сообщений: 136
1

CMP и флаг переноса

30.06.2019, 08:16. Показов 6036. Ответов 7
Метки arm (Все метки)

Author24 — интернет-сервис помощи студентам
Я не могу понять, почему ставится флаг арифметического переноса (Carry bit) в CPSR, если второй операнд CMP меньше и не отрицателен. Причем значения такие, которые явно не выходят за границы 32-битного числа, вроде:
Assembler
1
2
MOV R0, #4  ; cpsr = 0x000001D3
CMP R0, #0  ; cpsr = 0x200001D3, включился бит Carry
Но вот когда второй операнд все так же меньше, но число уже отрицательное, то флаг переноса не ставится:
Assembler
1
2
MOV R0, #4  ; cpsr = 0x000001D3
CMP R0, #-1 ; cpsr = 0x000001D3
Какой перенос дают операции вроде 4-0 или 3-1, они же вроде настолько простые, не должны давать никакого переноса? Почему тогда ставится флаг C?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2019, 08:16
Ответы с готовыми решениями:

Флаг переполнения и переноса
Объясните, пожалуйста в чем разница, не совсем понимаю. И как записать последовательность двух...

Флаг переноса и таймеры
Помогите пожалуйста подправить в программе у меня проблема с флагом переноса и таймерами. не...

Вспомогательный флаг переноса (AF)
Доброго всем дня. Буду краток. Требуется Сегодня вдруг с удивлением обнаружил что нет условного...

Сдвига через флаг переноса, где ОШИБКА ?
Добрый вечер всем ! Необходима консультация. Написал прогу и не могу понять, правильно ли она...

7
3219 / 2362 / 540
Регистрация: 11.09.2009
Сообщений: 8,605
30.06.2019, 10:01 2
Цитата Сообщение от Azawa Посмотреть сообщение
почему ставится флаг арифметического переноса...
Откройте систему команд вашего контроллера. Там написано, что делает каждая команда и как интерпретируются числа в регистрах. Написаная в ассемблерном тексте "#-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
Syntax
CMP{cond} Rn, Operand2
where
Rn is the ARM register holding the first operand.
Operand2 is a flexible second operand.

Operation
These instructions compare the value in a register with Operand2. They update the condition flags on the result, but do not place the result in any register.
The CMP instruction subtracts the value of Operand2 from the value in Rn. This is the same as a SUBS instruction, except that the result is discarded.
Цитата Сообщение от ValeryS Посмотреть сообщение
0-4
А почему 0-4, когда
Assembler
1
CMP R1, #0 ; R1 = #4
Цитата Сообщение от i8085 Посмотреть сообщение
Написаная в ассемблерном тексте "#-1" - это всего лишь все единицы в бинарном коде (максимальное число в регистре).
Да, про представление знаковых чисел я знаю, в них старший бит ставится и поэтому в беззнаковом представлении отрицательные числа больше.
Поэтому я и спросил, почему при вычитании в беззнаковом представлении меньшего числа из большего - ставится флаг переноса, хотя там никаких заимствований при вычитании не требуется:
Код
 0000 0100
-0000 0001
 _________
 0000 0011
Да даже когда вычитается ноль, флаг переноса все равно ставится! Как так?

А при вычитании наоборот большего числа в беззнаковом представлении (но все еще меньшего в знаковом), флаг переноса не ставится, когда хоть число и меньше, но при таком вычитании произойдет заимствование единичек из ниоткуда и поэтому вроде в этом случае и должен поставиться флаг переноса.
Код
 0000 0100
-1111 1111
 _________
 1111 1011
Цитата Сообщение от ValeryS Посмотреть сообщение
4294967295( тоже что и -1) -4
будет переполнение или нет?
Да! Но флаг не ставится... Будто все происходит ровно наоборот.


Цитата Сообщение от i8085 Посмотреть сообщение
Откройте систему команд вашего контроллера. Там написано, что делает каждая команда и как интерпретируются числа в регистрах.
Было бы здорово, но в инструкциях по 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
Цитата Сообщение от Ethereal Посмотреть сообщение
- это вызвано прямолинейной реализацией вычитания в АЛУ по формуле
A - B = A + ~B + 1
легко видеть, что при такой реализации вычитания вычитание сводится к инвертированию B и исполнению adc положив carry=1. Вот если флаги после такой операции оставить такими как они получились после adc, то флаг переноса после вычитания и сравнения окажется строго наоборотным
Да, действительно, с точки зрения реализации архитектуры это имеет смысл, т.к. достаточно просто и быстро.

Вообщем, все же я нашел строку в документации. Я был не прав, сказав что пояснении этому случаю нет:
Цитата Сообщение от ARM Information Center: Carry flag
For an addition, including the comparison instruction CMN, C is set to 1 if the addition produced a carry (that is, an unsigned overflow), and to 0 otherwise.

For a subtraction, including the comparison instruction CMP, C is set to 0 if the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise.
В случае с показанием наличия заимствования - флаг carry действительно работает точно наоборот.
Хотя до ответа Ethereal казалось совершенно логичным, что положение флага должно быть одинаковым для обоих случаев что для переноса, что для заимствования. Однако, такой вот неочевидный момент.
1
3219 / 2362 / 540
Регистрация: 11.09.2009
Сообщений: 8,605
30.06.2019, 22:26 7
Цитата Сообщение от Azawa Посмотреть сообщение
казалось совершенно логичным ... Однако, такой вот неочевидный момент.
Поэтому и был дан совет
Цитата Сообщение от i8085 Посмотреть сообщение
Откройте систему команд вашего контроллера.
Ведь именно там вы всё нашли.
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.07.2019, 05:09
Помогаю со студенческими работами здесь

Почему если флаг состояния потока eof поднят, то флаг good опущен?
Почему если флаг состояния потока eof поднят, то флаг good опущен? Это нонсенс, друзья. Здесь...

Нарисовать на экране дисплея флаг РФ, Японский флаг
Нарисовать на экране дисплея флаг РФ, Японский флаг 300*200px Добавлено через 22 часа 20 минут ...

Как реализовать флаг cat -v флаг в си?
мне предстоит задача которую не знаю как правильно реализовать. и первый вопрос который у меня...

Наследование в CMP
Отзовитесь кто решал подобную проблему. есть таблицы person (ID, NAME, PERSON_TYPE);...

Помощь по PK и CMP
На самом деле уже как-то поднимал этот вопрос, но остался без ответа. Может щас кто че подскажет...

Проверка с cmp
;... cmp eax, ;-число jne C1 ;...Если мне нужно занулить eax после проверки, то можно написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru