Путаница в документации ARM на флаге переноса - PullRequest
0 голосов
/ 30 октября 2018

В документации ARM здесь сказано, что:

происходит перенос:

... если результат вычитания положительный или равен нулю ...

Я знаю из этого ответа на SO , что флаг переноса устанавливается при вычитании, когда имеется недопустимый недостаток (т. Е. Вычитаемое число (вычитаемое) больше, чем вычитаемое число из (minuend) )).

Итак, рассмотрим пример:

r1 = 5
r2 = 10
CMP r1, r2

Сравнение (CMP) выполняет вычитание , как указано здесь , а затем устанавливает соответствующие флаги. В этом случае r1-r2 = 5-10 = -5. Так как у нас здесь недопустимое значение без знака (5 <10), мы ожидаем, что будет установлен флаг переноса. Но согласно документации ARM, результат (-5) не является положительным или нулевым, поэтому флаг переноса не должен быть установлен. (Предполагая, что мы смотрим на результат, подписанный; в противном случае перенос не произойдет согласно документации). </p>

Документация ARM неверна? В чем мое недоразумение?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

нам не нужны все 32 бита, чтобы показать, что происходит с вычитанием

5 - 3

из начальной школы мы знаем, что 5 - 3 = 5 + (- 3), как это делается в логике, особенность дополнения к двум состоит в том, чтобы получить -3 вы инвертировать и добавить один так

5 - 3

      1
   0101
 + 1100
=========

закончить

  11011
   0101
 + 1100
=========
   0010

в общем (не специфично для процессора) 5 - 3 = 2. оба переноса и выведения ошибочного бита равны, так что переполнение со знаком не будет установлено, выполнение равно 1. Но некоторые архитектуры так же, как и инвертирующие второй операнд и перенос (к lsbit) также инвертируют выполнение, называя его заимствованием. Некоторые не делают.

Некоторые документируют это, когда вы смотрите на такие вещи, как «больше» и «меньше» относительно определения бита переноса

5 - 4

  11111
   0101
 + 1011
=========
   0001

5 - 5

  11111
   0101
 + 1010
=========
   0000

5 - 6

  00011
   0101
 + 1001
=========
   1111

5 - 7

  00011
   0101
 + 1000
=========
   1110

То, что это показывает, - то, что, если вы посмотрите на необработанный результат, он переключается, когда операнд b равен операнду a, когда b меньше a, он устанавливается, когда b равен или больше a, это ясно. Таким образом, если архитектура оставляет ее неизменной, вы можете использовать бит переноса для беззнакового значения, большего или меньшего (но не равного) в одном из случаев, превышающих или равных, определяется этим флагом, и какое направление зависит от архитектуры (если оно инверты выполняют в заем). В другом направлении вы либо переворачиваете операнды и используете один бит, либо используете N и C, чтобы определить нечто большее или равное.

Документы о вооружении, в отличие от некоторых других, показывают для каждого из условий, что представляют собой флаги, и, зная вышеизложенное или имея возможность повторить его в простом тесте, вы можете выяснить, инвертируют они или нет. инструкция sbb вычитается с заимствованием, а не sbc вычитает с переносом, который, но не сам по себе, подразумевает, как этот набор команд интерпретирует бит.

0 голосов
/ 30 октября 2018

ARM использует инвертированный флаг переноса для заимствования (т.е. вычитание). Вот почему перенос устанавливается, когда нет заимствований, и ясно, когда есть. Это конструктивное решение делает сборку ALU несколько проще, поэтому некоторые процессоры делают это.

...