2016-09-02 14 views
0

Так как процессоры следуют за соглашением о представлении чисел в качестве дополнения 2, как узнать, является ли это число результатом добавление двух положительных чисел остается положительным и не отрицательным.Как процессор (esp. ARM) интерпретирует результат переполнения на более позднем этапе выполнения, когда результат возвращается в память

Например, если добавить два числа 32bit:

Пусть r2 содержит ценностно 0x50192E32

Пример кода:

add r1, r2, #0x6F06410C 
str r1, [r3] 

Здесь Переполнение флаг установлен , Теперь, если я хочу использовать сохраненный результат из памяти в последующих командах (где-то в коде ... и теперь из-за различные инструкции пусть процессоры CPSR был изменен), как показано ниже:

ldr r5, [r3] 
add r7, r5 

в результате первой команды добавить имеет в это MSB ienow r5 имеет 1 в его MSB как процессор интерпретировать значение. Так как правильный результат при добавлении двух положительных чисел положителен. Это просто потому, что у MSB есть 1, он интерпретируется как отрицательное число? В этом случае мы получаем разные результаты от ожидаемого.

Пусть, например, в 4 битной машине:

2 дополнением: 4 = 0100 и 5 = 0101; -4 = 1100 и -5 = 1011

Теперь 4 + 5 = 9 и если она хранится в регистре/памяти как 1001, а затем, если доступ к нему осуществляется с помощью другой инструкции и с учетом процессор хранит номера в формате дополнения 2 и проверяет MSB и считает, что он отрицательный 7.

Если все зависит от программиста, то как сохранить правильные результаты в регистре/памяти. Есть ли в любом случае, что мы можем сделать с нашим кодом, чтобы сохранить правильные результаты?

+2

Я не совсем понимаю, что вы спрашиваете. Дополнение от 2 означает, что подпись не имеет отношения к арифметическим операциям, поэтому 'add' просто добавляет числа. Ничто не интерпретируется как подписанное _or_ unsigned здесь, потому что ни один код не тестирует флаги каким-либо образом (обратите внимание также, что ничто даже не устанавливает их, это будет 'добавление'). – Notlikethat

+0

Я согласен, что неясно. Я думаю, что между комментарием notlikethat и ответом Джейсонхарпера это просто охватывает все интерпретации. – rjp

+0

В зависимости от того, какой синтаксис ни один из тех, кто касается флагов, часто вам нужно добавить S, добавляет vs add. –

ответ

2

Если вам небезразличны условия переполнения, вам необходимо проверить флаг переполнения, прежде чем регистр состояния будет перезаписан другой операцией - в зависимости от языка, это может привести к генерированию исключения или к операции повторное использование с использованием более длинного целочисленного типа. Однако многие языки (например, C) НЕ заботятся о переполнении - если результат выходит за пределы допустимого диапазона, вы получаете неверный результат. Если программа, написанная на таком языке, должна обнаруживать переполнение, она должна была бы реализовать сам тест - например, в случае сложения, если операнды имеют один и тот же знак, но результат другой, произошел переполнение.

2

Я знаю, что я это много раз освещал, как и другие.

Флаг переноса можно считать флагом неподписанного переполнения для добавления, это также флаг заимствования или не брать флаг вычитания в зависимости от вашей архитектуры. Флаг v представляет собой подписанный флаг переполнения для сложения (вычитания). Вы единственный, кто знает или заботится о том, подписано или не подписано дополнение, что касается сложения/вычитания, это не имеет значения.

Не имеет значения, какой флаг это или какая архитектура, вы должны убедиться, что, если вы заботитесь о результате (будь то результат или флаг), вы сохраняете эту информацию до тех пор, пока вам нужно, пока вам нужно использовать его, это не задача процессоров, чтобы сделать это, ни набор команд, ни архитектура в целом. Он подходит для ответов в регистрах, как и для флагов, все это на вас программист. Просто сохраните это состояние, если вам все равно. Этот вопрос, как говорят, как вы решить эту проблему:

if(a==b) 
{ 
} 
stuff; 
stuff; 
I want to do the if a == b thing now. 

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

 Смежные вопросы

  • Нет связанных вопросов^_^