PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Substraktion



sahra
10.11.2010, 12:38
ich habe ein kleines Prog geschrieben, und der soll 2 Reg vergleichen, wenn reg 1>reg2 dann zeigt das richtiges Ergebnis aber andersrum(reg2>reg1) tut er nicht: zum Beispiel:


reg1 = 0x0501
reg2 = 0xA2BB

main:
mov temp1, V1 ; V1=low (reg1) in temp1 speichern
mov temp2,V2 ; V2=high(reg1) in temp2 speichern
sub temp1,V3 ; V3=low(reg2)
;(V1-V3) in temp1 speichern
sbc temp2,V4 ; V4=high(reg2)
; (V2-V4) in temp2 speichern

cp temp1, low(65531)
cp tem2, high(65531)
brsh led2_aus


cp temp1, low(5)
cp tem2, high(5)
brsl led2_aus

Cp V1,V3
Breq led1_on
Brlo led2_on
Brsh led2_aus

Led1_on:
Sbi portb,0
Rjmp main

Led2_on:
Sbi portb, 2
Rjmp main
Led2_aus:
Cbi portb2
Rjmp main



Das Ergebnis ist: temp1 = 0x63 ( das richtige Ergeb= 0xFFFFFFFFFFFFFF63)
: temp2 = 0x46 (Erg= FFFFFFFFFFFFFF46).

Wie macht man das um den richtigen Wert zu zeigen, gibt es irgend einen Befehl für den absolut Wert.
Oder wie macht man das?
danke

PicNick
10.11.2010, 13:16
Guckstu da:
http://www.rn-wissen.de/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User#.22S.22_und_.22V.22_Bit
VIelleicht hilft dir das ja.

Besserwessi
10.11.2010, 18:42
Für den Absolutbetrag gibt es keinen extra Befehl.

Es gibt da nur einen etwas verwirrenden (könnte man auch BUG nennen) Text in der Beschreibung zum Carry Falg beim CMP und SUB Befehl.
Original steht da in der Hilfe von AVRstudio, und der offiziellen Befehlsbeschreibung zum Carry Flag:
Set if the absolute value of the contents of Rr is larger than the absolute value of Rd; cleared otherwise.

Da hat das Wort absolute ist da aber falsch, richtig müßte da stattdessen "unsigned" stehen.


Bei dem Programm siehr die Subtraktion noch richtig aus, nur die Vergleiche sind muks. Die macht man fast wie die Subtraktion und schaut dann je nach Zahlen Format (mit oder ohne Vorzeichen) das V oder C-Flag an.

wkrug
10.11.2010, 20:09
bei Compares in denen die zu vergleichenden Werte in mehreren Registern stehen wird auch das Kommando CPC verwendet.
Dann stimmt das auch.

cp reg1a,reg1b
cpc reg2a,reg2b
cpc reg3a,reg3b
cpc reg4a,reg4b
brcs rega_grösser

oder
breq

oder
brne

oder
brcc

Für den Vergleich mit Immideate Werten wie CPI gibt es leider kein Kommando, das mit Carry arbeitet.
Da muß man dann den Wert schon in ein Register übertragen.