PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : welche Unterschied



Valentiano
06.12.2007, 01:43
1) Syntax: RETLW k ; k ist ein Zahlenwert von 0 ... 255
a) retlw 1 ; in w: 0000 0001
b) retlw '1' ; Frage: '1' ist ein Zahl oder ein Zeichen?
Zahlenwert in W?

dennisstrehl
06.12.2007, 02:16
'1' ist das Zeichen 1, der Zahlenwert ist 49.

Mit Zeichen kann man übrigens auch rechnen:
'0'+1 ist das gleiche wie '1' (gleichbedeutend mit '0'+1 = 48+1 = 49 = '1').
'1'-'0' ergibt dann 1 als Zahlenwert.

Valentiano
06.12.2007, 03:06
verstehe ich noch nicht, warum '0' = 48?

PICture
06.12.2007, 03:51
Hallo!

Das Assemblerprogramm nimmt alles zwischen ´´ als ASCII Koden und 48 bedeutet ein Zeichen 0 (Null).

MfG

Valentiano
06.12.2007, 04:30
dank PICture,

jetzt alles klar!
D'48' = 0x30 ASCII Code ist '0'.



ich habe noch eine Frage:

ich habe gerade PIC datesheets gelesen. man kann eine Dezimalzahl nur so schreiben: D'123' oder .123
aber folgendes Befehl: ini equ 8 ; ist 8 Dezimal?

PICture
06.12.2007, 05:13
die Zahlen zwischen 0 bis 9 sind für beide Zahlsysteme (hex und dec) gleich. Nur für alle grössere Zahlen, so wie in Deinem ersten Beispiel D´123´, gibt es zwischen den Zahlen ein Unterschied.

Du hast also schlechte Zahl für deine Frage genommen. :)

MfG

phaidros
06.12.2007, 21:18
Man kann auch beim Assembler am Anfang die Zeile

list r=dec

einfügen.
Dann sind alle Zahlen, die nicht ausdrücklich anders codiert werden, dezimal zu verstehen.

Enrock
07.12.2007, 07:33
Als weiter bitte...
Ich kann da echt noch was lernen!

Mit

Test equ 32 kann doch entweder die dezimale Zahl 32 gemeint sein oder ebenso die Speicherzelle 0x032. Habe ichd as richtig verstanden? Also je nachdem ob ich schreibe

addlw Test ; dann addiere ich 32dezi auf w

oder

movwf Test ; hier speichere ich w in Test an der Adresse 0x032

richtig?

Gruß

phaidros
10.12.2007, 01:17
Nein.

Du legst dich am Anfang des Programms fest, welches Zahlensystem gelten soll. Wenn man gar nichts angibt, gilt glaube ich Hex als default. Ich schreibe immer "list r=dec" am Anfang meines Programms, damit ich nicht durcheinander komme.

Die Zeile

Test equ 32
ist eindeutig.
Je nach Basis ist Test entweder 32 (r=dec) oder 50 (r=hex)

Ob Test im Programm als Zahlenwert (literal) oder als Adresse angewendet wird, ist dem Assembler egal. Er ersetzt immer Test durch den Zahlenwert, den er bei der entsprechenden "equ" Anweisung gesehen und entsprechend der dann gültigen Basis interpretiert hat.
Es gibt auch noch die "Set"-Anweisung. Die weist Test nur vorläufig einen Wert zu, den man später wieder ändern kann. Z.B. so:

Test SET Test+1

Achtung! Es kommt noch schlimmer. Man kann die Basis auf verschiedene Arten einstellen. Es gibt neben der "List"-Anweisung noch die "RADIX"-Anweisung und zumindest bei einem Assembler kann man noch per Kommandozeilen-Parameter die Default-Basis einstellen. Die Basis kann auch noch auf oktal oder binär eingestellt werden und jederzeit mitten im Programm geändert werden.

Das alles kann dazu beitragen, im besten Fall ein Programm komplett unverständlich zu machen und im schlimmsten Fall einen so subtilen Fehler zu produzieren, dass man ihn nicht mehr findet.

Also mein Rat: Eine feste Basis am Anfang einstellen, und die bei allen Programmen gleich, damit man weiß, woran man ist. Alle Zahlen, die nicht in dieser Basis sind, dann mit dem entsprechenden Code präfixen.