Тут всё зависит от реализации операции вычитания в АЛУ. В одних случаях выполняется именно вычитание, в других случаях вычитание заменяется сложением с дополнительным кодом вычитаемого. Например, операция 1-1 = 0.Lavr wrote:Опять я споткнулся об эти флаги, программируя 6502...Lavr wrote:Действительно...Shaos wrote:ну просто видимо при сложении C должен быть прямой флаг, а при вычитании - инверсный
P.S. вот тут устами самого интела говорится, что после вычитания флаг инвертируется (стр.46 в PDF или 2-8 на бумаге):
http://www.tramm.li/i8080/Intel%208080-8085%20Assembly%20Language%20Programming%201977%20Intel.pdfThis is because the processors complement the carry flag at the end of a subtract operation so that it can be used as a 'borrow' flag in multibyte subtractionsОднако если такие операции проводятся микропроцессорами i8080 или i8085, флаг переноса будет СБРОШЕН в конце вычитания. Это происходит потому, что микропроцессоры инвертируют флаг переноса в конце операции вычитания, так чтобы он мог быть использован в дальнейшем в качестве флага «заёма» при многобайтном вычитании.![]()
Оказывается, есть просто разные подходы к интерпретации флага переноса C: от Intel и от MOS Technology
Some architectures, namely MOS 6502 and all ARM CPUs, use "true carry" subtraction implementation that Carry flag from PSW is not inverted before and after subtraction, so, C = 1 means no borrow and C = 0 means borrow.
Code: Select all
00000001 00000001
- +
00000001 11111111
С -------- С ---------
0 00000000 1 00000000