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

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

C

Установите в 1, когда операция привела к переносу, в противном случае сбросьте в 0.

и

Выполняется перенос:

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

(Очевидно, что результат должен рассматриваться как число со знаком; в противном случае перенос будет всегда выполняться с вычитаниями).

Я знаю, что флаг переноса "инвертирован" в ARM. Таким образом, если вычитание требует заимствования, тогда флаг переноса не устанавливается, даже если логически было выполнено «перенос» (т. Е. Без знака без знака).

Это имеет смысл для этого сценария:

CMP 3,5

Это сделает 3-5. Начиная с 3 < 5, происходит потеря значения без знака, и флаг переноса не будет установлен в ARM. Используя логику в документации ARM, 3-5 приводит к -2, что отрицательно, поэтому перенос не происходит и, следовательно, флаг переноса не устанавливается.

Теперь, согласно документации ARM, связанной выше, код условия LO (он же CC) в ARM, который представляет сравнение «без знака, нижнее», равен true, когда флаг переноса не установлен в ARM (то есть C == 0). Таким образом, для приведенного выше примера код условия LO будет истинным. Это также имеет смысл, поскольку 3 меньше 5, если рассматривать их как числа без знака.

========

Теперь рассмотрим этот сценарий:

CMP -1,0

Это будет делать -1-0, то есть 0xffffffff - 0x00000000. Логически, начиная с 0xffffffff > 0x00000000, не происходит потери значения без знака и устанавливается флаг переноса.

Но посмотрите, что написано в документации ARM:

Выполняется перенос:

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

В соответствии с документацией выше , поскольку -1-0 приводит к -1, что отрицательно, перенос не происходит и, следовательно, флаг переноса не устанавливается. Но это означает, что код условия LO имеет значение true, что означает, что -1 меньше, чем 0, когда обрабатывает их обоих как числа без знака (точно так же, как 3 было ниже, чем 5, когда мы обрабатывали их обоих как числа без знака в предыдущем сценарии). Очевидно, что это не так с 0xffffffff > 0x00000000.

Как объяснить это противоречие, когда я пытаюсь вычислить логику флага переноса, основываясь на том, что говорится в документации?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

CC / LO НЕ ПОДПИСАНО ниже, НЕ ПОДПИСАНО ниже. Нет беззнакового числа -1, это 2 ^ 32-1, 2 ^ 32-1 - 0 = 2 ^ 32-1 и 0 определенно меньше 2 ^ 32-1.

Теперь, если вы хотите сравнить -1 с 0, тогда это сравнение со знаком, вернитесь к этой таблице и посмотрите на флаги, относящиеся к подписанным результатам.

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

-3 - -4 = -3 + 4

 11000
  1101
+ 0100
=======
  0001

N = 0 В = 0

Если N == V, то пение больше или одинаково, и это правда -3 больше, чем -4

1100 GT Подписано больше, чем N == V

-1 - 0 = -1 + (-0) = -1 + 0

 0000 
  111
 +000
=====
  111

N = 1 В = 0

Или что, если -1 + (-0)

  1111
   111
 + 111
=======
   111

N = 1, V = 0

1011 LT Подписано меньше, чем N! = V

и это правда -1 меньше нуля.

и кстати

3 - 5

 00111
  0011
 +1010
=======
  1110

Без знака 3 - без знака 5 - очень большое число 0xFFFFFFFE, два стесняющихся 2 ^ 32

C = 1, N = 1, V = 0, Z = 0

Быть без знака C = 1 означает

0010 CS / HS Переносить набор / без знака выше или же

И это правда, 5 больше, чем 3

Если вы хотите, чтобы без знака было выше, но не то же самое, тогда вы также смотрите на флаг Z

1000 HI Набор без знака выше C и Z clear

Теперь вы пытались утверждать, что 3 - 5 = -2, это явно ПОДПИСАННАЯ математика, НЕ ПОДПИСАННАЯ математика. так V == Z

1100 GT Подписано больше

знак 5 больше, чем знак 3, как и

0010 CS / HS Перенос набора / без знака выше или того же набора C

без знака 5 больше без знака 3

3 - 5 = 0xFFFFFFFE

(набор переноса - это, кстати, переполнение без знака, и, по крайней мере, в этом случае оно работает)

0 голосов
/ 05 ноября 2018

Ваша кавычка имеет смысл, только если входные значения считаются беззнаковыми, вместе с полным (33-битным) выводом. Обратите внимание, что прилагаемое описание относится к выходам больше 2 ^ 32.

...