Assembler Befehl sbc unklar

OP #4353382
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
Gast #4353392
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
;---------------------------------------
#4353405
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.
OP #4353416
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.
OP #4353447
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..
Gast #4353467
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 <-----
OP #4353519
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.
Gast #4353582
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
Gast #4353590
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...
OP #4353591
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
Gast #4353630
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...
OP #4353639
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)
Gast #4353656
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. \./
#4353662
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren