Forum: Mikrocontroller und Digitale Elektronik 8051 arithmetische befehle : bsp aufgabe, bitte um korrektion


von Peter S. (Firma: hund ag) (rattenkind1)


Lesenswert?

Hi ich bin noch sehr neu in sachen Assembler Programmierung:
Ich habe eine Aufgabe bekommen, welche ich nur mit folgenden Befehlen 
lösen kann:

ADD,ADDC,INC,DA,SUBB,DEC,MUL,DIV;

Die Aufgabe lautet:

Schreiben sie ein Programm,das die Quersumme einer 8bit BCD-Zahl, die an 
Port 4 eingelesen wird berechnet und als BCD-Zahl auf Port 5 ausgibt.


Sooo dazu habe ich mir folgendes ueberlegt:
beliebiges BCD Bitmuster 0001 0010 B (18D) wird eingelesen in Port 4.
Nun wird die Quersumme wie folgt gebildet:

Wir wissen, dass die höchste BCD Kombination eine 1001 1001 ist, da 
keine hoehere zahl als 99 angezeigt werden können auf den 
anzeigetafeln(xD).

Somit beschränken wir uns auf 10er und 1er, welche wir für die Quersumme 
zusammenaddieren müssen.

Wie bekomme ich nun heraus wieviele 10er und 1er in einer Binärzahl 
sind?

18/10 = 1(,8). Also muss ich die Binärzahl auch durch 10 teilen!

=> 0001 0010 / 0000 1010 = 0000 0001 // :D
nun haben wir die anzahl der 10er in unserer Zahl.

Damit wir die Quersumme berechnen können müssen wir einfach noch alle 
zehner von der zahl abziehn un dann haben wir direkt die anzahl der 1er.

alle zehner erhalten wir durch die multiplikation der anzahl der zehner 
mit zehn.

also: 0000 0001 * 0000 1010 = 0000 1010
das ziehn wir jetzt von unserer anfangszahl ab und erhalten so die 
einer:
0001 0010 -0000 1010= 0000 1000.

Soooo
und jetzt können wir die beiden schön zusammenrechnen:
1 +8 bzw. 0000 0001 + 0000 1000 = 9 bzw 0000 1001
puh das war ma ne schreibarbeit!!

jetzt muss ich das ganze nur als bcd format wieder ausgeben können^^
also wieder rausfinden wieviele zehner drin sind und wieviele einer drin 
sind......
durch multiplikation bekomme ich das denke ich mal hin da MUL AB ein 
ergebnis aus 2bytes liefert, wobei in A das higher byte is un B das 
lower byte....bin mir sicher das klappt.



DIE FRAGE IST: IST DAS SO RICHTIG??ODER ETWA TOTAL UNNÖTIG UND GEHT AUCH 
LEICHTER..ODER IST DAS TOTAL FALSCH?
BITTE ANTWORTET MIR!!!!!!!!!!!!!!!!!!!

thx!

von Pieter (Gast)


Lesenswert?

moin moin,

brüll nicht so rum.
Um bei einer BCD-Zahl die 10ner Stelle in die 1ner Stelle zu schieben 
must Du durch 16 dividieren oder swap a nutzen.
In Deinem Beispiel:
  Mov A, P4
  Mov B, A
  Swap A
  ANL A, #0FH
  XCH A, B
  ANL A, #0FH
  ADD A, B
  DAA
  Mov P5, A

Die Komentare darfst Du erstellen.

MfG
Pieter

von Peter D. (peda)


Lesenswert?

Ich hab außer der Aufgabe nix verstanden.
Du mußt beide Nibble extrahieren, addieren und packed BCD korrigieren:
1
  mov  a, p4
2
  mov  b, #16
3
  div  ab
4
  add  a, b
5
  da   a
6
  mov  p5, a

Peter

von Peter S. (Firma: hund ag) (rattenkind1)


Lesenswert?

jo hört sich gut an.
hat mir echt viel geholfen :D

  mov  a, p4
  mov  b, #16
  div  ab
  add  a, b
  da   a
  mov  p5, a

kann mir jemand evtl. mal den da befehl erklären, macht der sowas?:
0000 1111 DA BEFEHL!!!! => 0001 0101  ?? also sozusagen von 0F H zu 15 H
wäre echt ne coole sache dann könnte ich mir die ganze sache mit den 
10ern un einer sparen xD
-------------------------------------------------------------------
und kann mir jemand mal folgende aufgabe erklären:

in den adressen 4400H bis 4404H sind von HighByte bis LowByte die 4 Byte 
einer Ip Adresse abgelegt (zB. 192.168.20.5).
Die subnet mask ist fest auf 255.255.255.224 eingestellt.
das programm soll die sich ergebende host adresse als 8bitmuster auf 
port 4 ausgeben.
...

Folgende befehle sind erlaubt: ANL,ORL,XRL,CPL,SETB

so.. meines wissens nach.. was höchstwahrscheinlich an beschränktheit 
leidet, muss die ip adresse mit der subnet mask mit UND verknüpft 
werden.
nur leider bekomme ich ja dann einige bits mehr als 8 heraus..
was die ausgabe mit 8 bits auf port 4 für einen vollamateur wie mich 
unwahscheinlich erschwert.......

hoffentlich kann mir da jemand weiterhelfen..wäre gut weil ich wie man 
sieht die totale aufgabe nicht verstehe^^

---------

danke für eure hilfe!!!!!!

von Peter D. (peda)


Lesenswert?

Peter Struck schrieb:
> kann mir jemand evtl. mal den da befehl erklären

"DA A adjusts the eight-bit value in the Accumulator resulting from the 
earlier addition of two variables (each in
packed-BCD format), producing two four-bit digits. Any ADD or ADDC 
instruction may have been used to
perform the addition."


> das programm soll die sich ergebende host adresse als 8bitmuster auf
> port 4 ausgeben.
> ...
> nur leider bekomme ich ja dann einige bits mehr als 8 heraus..

Vielleicht ist nur ein Byte die host adresse. Ich kenn mich damit 
überhaupt nicht aus.


Peter

von Benjamin S. (recycler)


Lesenswert?

192.168.20.5 ist die IP Adresse
255.255.255.224 ist die Submaske

-> 192.168.20.0 ist der Netzwerkteil
-> 0.0.0.5 ist der Geräteteil alias Hostadresse

Du musst beides in eine 32 bit Zahl überführen und mit AND verbinden. 
Die Aufgabe ist nicht umsonst so gestellt, dass nur der letzte Teil als 
Hostadresse ausgegeben werden kann.

Kann hier nachgelesen werden: http://de.wikipedia.org/wiki/IP-Adresse

Schreiben kannst du jetzt dein Programm selber. Die Grundlagen stehen im 
Assemblerbuch.

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.