Почему флаг V, показанный в дополнении на языке ассемблера ниже, установлен в 1 вместо 0? Почему происходит переполнение? - PullRequest
0 голосов
/ 12 февраля 2020

Вот вопрос о практическом тесте, который я сделал, но я не понимаю, почему флаг V равен 1.

enter image description here

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

$ 83 = –125
$ 74 = 116

–125 - 116 = –241, что не вписывается в 8 бит. (Диапазон 8-разрядного числа со знаком от –128 до +127.) Поскольку результат не подходит, вы получаете переполнение со знаком, которое устанавливает бит V.

0 голосов
/ 12 февраля 2020

$ 83 - $ 74 = $ 83 + (- $ 74) = $ 83 + (~ $ 74) + 1

Вот как логика c видит это.

          1
   10000011
+  10001011
==============

fini sh

  100000111
   10000011
+  10001011
==============
   00001111

Два эквивалентных способа определения флага v, если перенос и вынос msbit не совпадают, тогда устанавливается флаг v, иначе не устанавливается. Другой способ, если msbit операндов (не забудьте инвертировать и добавить один, так как это сложение в логах c, а не вычитание) одинаковы, а результирующий msbit отличается от двух совпадающих операндов, тогда это переполнение, в противном случае, если все три одинаковы, или два мсбита операнда отличаются, тогда v = 0.

Это - то, как, чтобы понять почему, смотрите ответ prl, ответ не вписывается в число доступных битов.

Флаг C указывает c архитектуре, чтобы вычитать вы инвертируете второй операнд и инвертируете перенос (сделайте его 1) на входе, на выходе некоторые архитектуры инвертируют выполнение сделав это немного, другие оставят все как есть. Часто не документируется, поэтому вы должны экспериментировать, чтобы выяснить, что делает архитектура.

...