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
Alex S. schrieb: > 10000100 > 00000111 (hat man zur 0x06 einfach Carry Bit addiert?) > --------- > 10001011 Hier hast du nicht das Komplement addiert, sondern das Original.
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 | ;--------------------------------------- |
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.
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.
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)
@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.
@Eric, genau so habe ich auch gerechnet und bin auch auf 0x7D gekommen. Ist das also richtig?
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. ;-)
> 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..
Da hier wohl keiner ausser dir den Fachschaftstext kennt, ist deine Ausdrucksweise weiterhin unverständlich.
> 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 <-----
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
> Überprüfe deine Ausgangszahlen > 0x84 = 0b 1000 0100 > 0x06 = 0b 0000 0110 <----- Hallo Chris, da hat man wohl noch Carry Bit dazu addiert.
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.
> 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.
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.
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
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...
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
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.
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...
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)
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. \./
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.