Forum: Mikrocontroller und Digitale Elektronik Assembler Befehl sbc unklar


von Florian S. (sirius7)


Lesenswert?

Hallo,

wie ich aus der Arithmetik8 verstanden habe, muss man bei 
sbc-Subtraktion mit 2-er Komplement addieren (Subtraktion)+Carry. Nun 
wollte ich ein Beispiel nachrechnen, der bei uns auf der 
Fachschaftsseite rumliegt, jedoch komme ich nicht auf den gleichen 
Ergebnis.

Wie dort gerechnet wurde:
R1=0x84, R2=0x06 Flags davor: C=1, Z=0,N=1, V=1
sbc

1.

10000100
00000111 (hat man zur 0x06 einfach Carry Bit addiert?)
---------
10001011

R1=0x8b

wie ich rechnen würde:
1. 1 Komplement bilden + Carry bit addieren:
0x06->00000110->1K->11111001->+Carry->11111010

nun:

10000100
11111010
---------
01111110 = 0x7e

was ist denn davon richtig? könnte mir bitte jemand auf die Sprünge 
helfen? habe bisher keine eindeutige Beispiele gefunden.

Vielen Dank im Voraus

von (prx) A. K. (prx)


Lesenswert?

Alex S. schrieb:
> 10000100
> 00000111 (hat man zur 0x06 einfach Carry Bit addiert?)
> ---------
> 10001011

Hier hast du nicht das Komplement addiert, sondern das Original.

von Karl M. (Gast)


Lesenswert?

Hallo Alex,

ich habe hier einige Macros, die zur Bildung des 2 Komplement für 
verschiedene Datentypen verwenden.

Bei den Macros wird das erste Argument mit @0, referenziert und sas 
zweite Argument mit @1, usw.

Also
1
_2er_Complement8 R16
 wird zu
1
neg R16
 expandiert.
1
_2er_Complement16 R17,R16
 wird zu
1
com  @R17
2
neg  R16
3
sbci  @R17,0xff
  expandiert.
1
;---------------------------------------
2
.macro _2er_Complement8
3
neg  @0
4
.endmacro
5
;---------------------------------------
6
.macro _2er_Complement16
7
com  @0
8
neg  @1
9
sbci  @0,0xff
10
.endmacro
11
;---------------------------------------
12
.macro _2er_Complement24
13
com  @0
14
com  @1
15
com  @2
16
subi  @2,byte1(-1)
17
sbci  @1,byte2(-1)
18
sbci  @0,byte3(-1)
19
.endmacro
20
;---------------------------------------
21
.macro _2er_Complement32
22
com  @0
23
com  @1
24
com  @2
25
com  @3
26
subi  @3,byte1(-1)
27
sbci  @2,byte2(-1)
28
sbci  @1,byte3(-1)
29
sbci  @0,byte4(-1)
30
.endmacro
31
;---------------------------------------

von (prx) A. K. (prx)


Lesenswert?

Alex S. schrieb:
> der bei uns auf der Fachschaftsseite rumliegt,

Es ergibt wenig Sinn, im Forum auf deine Fachschaftsseite zu verweisen. 
Die dortige Beispielrechnung kennt hier niemand.

von (prx) A. K. (prx)


Lesenswert?

Um etwas zur Verwirrung beizutragen: Es gibt bei der Subtraktion zwei 
verschiedene Wege, die sich letzlich in der Darstellung von Carry/Borrow 
unterscheiden. Der technisch einfachere addiert das Einerkomplement 
zusammen mit dem normalen Carry. Bei C=1 erhält man dann eine 
Subtraktion ohne Borrow, bei C=0 mit Borrow, d.h. das Borrow einer 
Subtraktion ist invers zum Carry einer Addition. Der andere Weg 
komplementiert das Carry-Flag um dieses invertierte Borrow zu vermeiden. 
In realen Prozessoren findet man mal die eine und mal die andere 
Methode.

von Eric B. (beric)


Lesenswert?

Alex S. schrieb:
> 10000100
> 00000111 (hat man zur 0x06 einfach Carry Bit addiert?)

Ja

> ---------
> 10001011

Das ist aber die Summe, nicht der Differenz!


1000 0100    0x84  (132)
0000 0111 -  0x07  (  6 + carry)
---------
0111 1101    0x7D  (125)

von Florian S. (sirius7)


Lesenswert?

@A.K.
genau das ist auch mein Gedanke. Aber trotzdem bin ich mir in diesem 
Fall nicht sicher, ob man wirklich den 2K addieren muss, oder Carry zum 
Original.. bin verwirrt

@Karl M
Hallo Karl, Vielen Dank!

@ A.K
ja, wollte damit nur deutlich machen, dass die Quelle durchaus 
fehlerbehaftet sein kann und ich mir da nicht wirklich sicher sein kann, 
dass die Rechnung so stimmt.

von Florian S. (sirius7)


Lesenswert?

@Eric,
genau so habe ich auch gerechnet und bin auch auf 0x7D gekommen. Ist das 
also richtig?

von (prx) A. K. (prx)


Lesenswert?

Alex S. schrieb:
> genau das ist auch mein Gedanke. Aber trotzdem bin ich mir in diesem
> Fall nicht sicher, ob man wirklich den 2K addieren muss, oder Carry zum
> Original.. bin verwirrt

Bahnhof.

Du solltest zumindest versuchen, dich so auszudrücken, das der Leser 
deines Beitrags nicht ebenfalls verwirrt ist. ;-)

von Florian S. (sirius7)


Lesenswert?

> Du solltest zumindest versuchen, dich so auszudrücken, das der Leser
> deines Beitrags nicht ebenfalls verwirrt ist. ;-)

ich versuchs mal: also ich bin mir nicht wirklich sicher, wie man beim 
sbc Befehl in diesem konkreten Fall genau vorgehen muss. Vielleicht hat 
man in der Fachschaft richtig gerechnet und mann soll hier einfach 
Carry-Bit zur R2 addieren und nicht mit 2-er Komplement rechnen. Ich 
habe das halt so verstanden, aber ob ich richtig verstanden habe, bin 
ich mir auch nicht sicher..

von (prx) A. K. (prx)


Lesenswert?

Da hier wohl keiner ausser dir den Fachschaftstext kennt, ist deine 
Ausdrucksweise weiterhin unverständlich.

von chris (Gast)


Lesenswert?

> Wie dort gerechnet wurde:
> R1=0x84, R2=0x06 Flags davor: C=1, Z=0,N=1, V=1
> sbc

> 1.

> 10000100
> 00000111 (hat man zur 0x06 einfach Carry Bit addiert?)
> ---------
> 10001011 <----- = 0x07

Überprüfe deine Ausgangszahlen
 0x84 = 0b 1000 0100
 0x06 = 0b 0000 0110 <-----

von Florian S. (sirius7)


Lesenswert?

ja, Ausdrucksweise ist leider nicht mein Ding. Es würde mir reichen, 
wenn jemand einfach sagt, welche der Rechnungen richtig ist. Die von mir 
mit 1er Komplement+Carry oder die von Fachschaftsseite mit Original + 
carry

von Florian S. (sirius7)


Lesenswert?

> Überprüfe deine Ausgangszahlen
>  0x84 = 0b 1000 0100
>  0x06 = 0b 0000 0110 <-----

Hallo Chris, da hat man wohl noch Carry Bit dazu addiert.

von Peter D. (peda)


Lesenswert?

Alex S. schrieb:
> welche der Rechnungen richtig ist.

Dazu müßte man die original Aufgabe kennen.

von (prx) A. K. (prx)


Lesenswert?

Alex S. schrieb:
> ja, Ausdrucksweise ist leider nicht mein Ding.

Es ist Teil des Studiums, sich ausdrücken zu können.
Prima Gelegenheit, das hier zu üben.

von Florian S. (sirius7)


Lesenswert?

> Es ist Teil des Studiums, sich ausdrücken zu können.

leider nicht nur Studiums, auch Voraussetzung für die Ausbildung. Und 
genau aus diesem Grund habe ich keine bekommen. so stand ich vor der 
Wahl, Studium oder lebenslang Harz 4. Habe mich dann doch fürs Studium 
entschlossen, um der Staat gegenüber fair zu sein.

von Route_66 H. (route_66)


Lesenswert?

Alex S. schrieb:
> Es würde mir reichen,
> wenn jemand einfach sagt, welche der Rechnungen richtig ist.

Deine Lösung ist korrekt.
Subtrahiere von 84h einfach 6. Dann hast Du 7Eh. Jetzt noch Carry 
abziehen,  denn es ist ja gesetzt, ergibt 7Dh. Fertig.

von chris (Gast)


Lesenswert?

Alex S. schrieb:
> Hallo Chris, da hat man wohl noch Carry Bit dazu addiert.

mmhh ok aber solange es zwei 8bit Zahlen sind brauch ich kein Carry 
außer <0.

Zur Subtraktion selber geht's eigentlich wie folgt

  C
   1000 0100
 - 0000 0110---> 1erKompl. = 1111 1001 also nur negieren
                                     |---> 2erKomplment ist Negation = 
+1
                           C
                            1111 1001
                          + 0000 0001
                          = 1111 1010 < **
  C
   1000 0100
 + 1111 1010 **
 =10111 1110---> und jetzt kommts, in der Spalte C= Carry lässt man die 
1 einfach weg und raus kommt
 = 0111 1110 = 7e ist Richtig

Und was du meinst wahrscheinlich das borgen von einsen so wie man es 
dezimal auch macht.

Das ist alles

Oder aber 0-0 = 0
          0-1 = 1 ;ein im Sinn wegen Unterlauf
          1-0 = 1
          1-1 = 0

  C
   1000 0100
 - 0000 0110
   |||| ||||= 0-0        = 0
   |||| ||| = 0-1        = 1 ;eins im Sinn     "Carry"
   |||| ||  = 1-1 = 0 -1 = 1 ;wieder 1 im Sinn "Carry"
   |||| |   = 0-0 = 0 -1 = 1 ;wieder 1 im Sinn "Carry"
   ||||     = 0-0 = 0 -1 = 1 ;wieder 1 im Sinn "Carry"
   |||      = 0-0 = 0 -1 = 1 ;wieder 1 im Sinn "Carry"
   ||       = 0-0 = 0 -1 = 1 ;wieder 1 im Sinn "Carry"
   |        = 1-0 = 1 -1 = 0
                           |das ist das Ergebniss

vllt meinst du das ja mit Carry oder Übertrag oder einfach eins im Sinn

von chris (Gast)


Lesenswert?

Verdammtes Enter....

Meine Nächste Frage wäre von wo soll das Carry kommen ?

Aus einer Subtraktion von z.B.

16bit-8bit oder 16Bit-16bit??

Weil dann muss das Ergebniss nur minus 1 gerechnet werden...

von Florian S. (sirius7)


Lesenswert?

Route 6. schrieb:

> Deine Lösung ist korrekt.
> Subtrahiere von 84h einfach 6. Dann hast Du 7Eh. Jetzt noch Carry
> abziehen,  denn es ist ja gesetzt, ergibt 7Dh. Fertig.

perfekt! vielen Dank! )

@Chris

das stimmt wie du es gemacht hast. Carry muss man dazu addieren, weil es 
schon vor der Rechnung 1  ist (wurde bei Aufgabestellung angegeben), und 
speziell bei diesem Befehl sbc muss man den mitnehmen. 0x7e ist also 
richtig

von chris (Gast)


Lesenswert?

wo kommt denn das CARRY jetzt her???? 0_o

von Wolfgang R. (Firma: www.wolfgangrobel.de) (mikemcbike)


Lesenswert?

Beim 6502 (und ich denke auch anderswo) muss man vor der Subtraktion mit 
SBC erst das Carry Bit setzen...

SEC
LDA #55
SBC #11

Dann stimmt das Ergebnis. Nicht denken, Machen.

von chris (Gast)


Lesenswert?

Wolfgang R. schrieb:
> Beim 6502 (und ich denke auch anderswo) muss man vor der Subtraktion mit
> SBC erst das Carry Bit setzen...
>
> SEC
> LDA #55
> SBC #11

mmmhhh ok. Auch bei einer Subtraktion ohne jegliche Vorzeichen bzw wenn 
Minuend > Subtrahend ist ??


> Dann stimmt das Ergebnis. Nicht denken, Machen.

naja das wohl eher Situationsabhängig...

von Florian S. (sirius7)


Lesenswert?

Chris, also der Carry Bit kommt wahrscheinlich aus der vorherigen 
Rechnung (nur meine Vermutung). Bei der Subtraktion wird meines Wissens 
Carry Bit gesetzt, wenn Subtrahend größer ist, als Minuend. Jedenfalls 
ist er bei der Aufgabestellung gesetzt. (siehe Flags davor: C=1, 
Z=0,N=1, V=1)

von chris (Gast)


Lesenswert?

Alex S. schrieb:
> Chris, also der Carry Bit kommt wahrscheinlich aus der vorherigen
> Rechnung (nur meine Vermutung).

... jep sehe ich genauso. Nur möchte ich es vom Fragenden wissen!!!!!!

Es ist in den letzten Jahren eine Abart geworden mit Infos zu 
geizen!!!!!! Kommt bestimmt von den BWL'ern aber wir reduzieren deren 
Zahlensatz auch am besten nur auf 0 und 1.


> Bei der Subtraktion wird meines Wissens
> Carry Bit gesetzt, wenn Subtrahend größer ist, als Minuend.

mmhhh da ich zur AVR-Fraktion zähle, kann wenn denn nur für diese 
sprechen, bin ich der Meinung das es bei den AVR's nicht so ist.
Das Carry müsste vor Einstieg in die Subtraktion gelöscht werden, da 
sonst
ein falsches Ergebnis her rauskommen würde.
Aber was ich mir Vorstellen kann ist das man das Carry als 9tes Bit 
missbrauchen wollen würde.

Solange der Fragende schweigt mach ich jetzt auch den Schweigefuchs. \./

von (prx) A. K. (prx)


Lesenswert?

chris schrieb:
> mmmhhh ok. Auch bei einer Subtraktion ohne jegliche Vorzeichen bzw wenn
> Minuend > Subtrahend ist ??

Bei 6502 und ARM steht C=1 für kein Borrow. Vorher und nachher.
Bei 8086, AVR und den meisten anderen steht C=0 für kein Borrow.

Am einfachsten zu erkennen ist es, indem man rausfindet, ob der 
"unsigned >=" Sprungbefehl dem "carry set" oder "carry not set" 
entspricht.

von Thomas E. (picalic)


Lesenswert?

Servus,

ich finde (technisch gesehen) die C/NotBorrow Variante eigentlich 
logischer. So ist nämlich das Ergebnis, auch im C-Flag, genau gleich, 
egal, ob -X addiert oder +X subtrahiert wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.