вопрос переноса флага! - PullRequest
1 голос
/ 24 мая 2010

Предположим, AX = FFFE и BX = 1234
теперь, если мы напишем cmp ax,bx
(bx будет вычтено из топора, а соответствующие флаги будут обновлены) теперь двоичное представление чисел в ax и bx задается как

    AX =    1111    1111    1111    1110
   BX=     0001    0010    0011    0100


Поскольку bx будет вычтено из ax, мы должны отрицать bx (как Result = ax + (- bx)) поэтому отрицательный bx (дополнение 2 к bx) определяется как.

BX=    1110    1101    1100    1100

Теперь мы добавляем и топор, и bx (поскольку вычитание реализуется путем сложения в компьютере)

    AX=   1111    1111    1111    1110
   BX=   1110    1101    1100    1100
    ------------------------------------
      1  1110    1101    1100    1010 

Теперь, как вы видите, результат равен 17 битам, теперь 17-й бит должен перейти во флаг переноса, но когда я проверил его, флаг переноса равен 0, то есть CF = 0, почему?

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Нашел ссылку здесь: http://oopweb.com/Assembly/Documents/ArtOfAssembly/Volume/Chapter_6/CH06-2.html

Это как я и ожидал. Флаг переноса устанавливается только в том случае, если требуется «заимствовать». Выполняя вычитание, вы устанавливаете флаг переноса перед выполнением «вычитания», и новый флаг переноса сообщает, нужно ли брать в долг. В вашем примере опущено добавление 1 для предварительно установленного флага переноса в бите 17, что не приведет к переносу в результате.

1 голос
/ 24 мая 2010

Думайте о флаге переноса как о бите заимствования при выполнении вычитания. Он инициализируется значением 1, поэтому операция a−b−C, то есть a + not(b) + C вместо a + not(b) + 1, как вы описали. Другими словами, перенос вычитается для вычитания, поэтому его можно использовать для вычитания с множественной точностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...