2016-12-20 16 views
0

Я не понимаю, SBC и RSC инструкции ARMя не могу понять некоторые инструкции в ARM: СБК, RSC

Я знаю, что оба имеют дело с флагом переноса (C)

Я думаю, что это делает смысл добавления результата с переносом (ADC), как:

ADC r1, r2, r3 @ r1 = r2 + r3 + Carry

Но вычитая/реверс вычитание с переносом ... я не могу понять, что происходит :(

Можете ли вы, ребята, дать мне пример, используя SBC и RSC?

+0

'SBC' - та же логика, что и' ADC', он просто передает перенос. «RSC» тогда совпадает с «SBC», за исключением того, что он обменивает операнды. – Jester

+0

Спасибо за ответ ... но я до сих пор не получаю ... – Spacey

+0

Носитель будет 0 или 1 ... тогда он будет вычитаться из регистров? – Spacey

ответ

3

Учитывая двоичное дополнение, вычитание просто может быть преобразован в дополнение:

z = y - x 
    = y + (-x) 
    = y + ~x + 1 

, что делает его легче рассматривать как флаг переноса установлен в этой ситуации, т.е. subs:

z = 0 - 0 
    = 0 + ffffffff + 1 
C:z = 1:00000000  // no borrow, C = 1 

    z = 0 - 1 
    = 0 + fffffffe + 1 
C:z = 0:ffffffff  // borrow, C = 0 

Следовательно, значение флага C является nB («не занимать»), поэтому sbc как «вычесть с переносом» означает «вычесть без заимствования», или другими словами:

z = y + ~x + C   // i.e. adc with the second operand inverted 
    = y - (x - 1) - (~C + 1) 
    = y - x - ~C 
+0

Большое спасибо за объяснение, человек :) – Spacey

+0

huh, я не знал, что флаг переноса ARM был противоположным x86 для вычитания. x86 устанавливает CF для '0 - 1' и [SBB делает' dest - = (SRC + CF) '] (http://felixcloutier.com/x86/SBB.html). Поэтому я думаю, вы должны быть осторожны, если портируете что-то, что использует 'sbb', чтобы получить поведение на основе CF после установки флага переноса из чего-то другого. –