2016-12-20 6 views
0

Je ne comprends pas SBC et des instructions ARM RSCJe ne comprends pas certaines instructions ARM: SBC, RSC

Je sais que les deux traitent avec le drapeau de transport (C)

Je pense qu'il est sens en ajoutant le résultat le report (ADC) comme:

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

Mais soustraction/inverse soustrayant le report ... Je ne peux pas comprendre ce qui se passe :(

Pouvez-vous me donner un exemple en utilisant SBC et RSC?

+0

'SBC' est la même logique que' ADC', il ne fait que propager le report. 'RSC' est alors le même que' SBC' sauf qu'il échange les opérandes. – Jester

+0

Merci pour la réponse ... mais je ne reçois toujours pas ... – Spacey

+0

Le report sera 0 ou 1 ... alors il sera soustrait des registres? – Spacey

Répondre

3

Compte tenu du complément à deux, la soustraction peut simplement être transformé en plus:

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

ce qui le rend plus facile d'examiner comment le drapeau de transport est mis dans cette situation, à savoir par 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 

D'où la valeur de l'indicateur C est nB ("ne pas emprunter"), donc sbc comme "soustraire avec carry" signifie "soustraire avec ne pas emprunter", ou en d'autres termes:

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

Merci beaucoup pour l'explication, l'homme :) – Spacey

+0

hein, je ne savais pas le drapeau de portage ARM était en face de x86 pour la soustraction. x86 définit CF pour '0 - 1', et [SBB fait' dest - = (SRC + CF) '] (http://felixcloutier.com/x86/SBB.html). Donc, je suppose que vous devez faire attention si vous portez quelque chose qui utilise 'sbb' pour obtenir un comportement basé sur CF après avoir défini le drapeau de transport d'autre chose. –