Übungsblatt 3 - Rechnerorganisation

Gbi, Algo, Mikrorechner - alles was es eben so gibt

Übungsblatt 3 - Rechnerorganisation

Beitragvon mabl » 25.05.2009 17:30

Dieses Mal hat es etwas länger gedauert, im Anhang findet sich Aufgabe 1a). Im Teil b) habe ich einen modifizierten Bubblesort implementiert, der von der unteren Adresse aufwärts das Teil sortiert. Es kann aber durchaus sein, dass da noch der ein oder andere Logikfehler drin ist. :mrgreen:
Dateianhänge
blatt4.pdf
(21.45 KiB) 434-mal heruntergeladen
blatt4asm.pdf
Version4 des Quelltextes, jetzt noch Fehler in dem inneren Zähler und Kommentaren beseitigt.
(24.2 KiB) 350-mal heruntergeladen
Zuletzt geändert von mabl am 27.05.2009 13:02, insgesamt 4-mal geändert.
Grund: Neuer ASM Code
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon M.A. » 26.05.2009 18:05

also ich hab mal nen ganz simplen sortieralgo genommen, und zwar etwas ungefähr wie:
Code: Alles auswählen
for (i=0; i<sizeofarray; i++){
   for (k=i; k<sizeofarray; k++){
      if (array[k]-array[i]<0){
         "vertausche die Positionen a[i] und a[k]";
          }}}


a[ i] und a[k] entsprechen VAL1 und VAL2, die ich in den kommentaren a1 und a2 nenne und ARSIZE ist die Größe des Arrays. Adressen beginnen mit AD_.

Version 3 (16:18 27.05.2009)
- LDIV und STIV Fehler beseitigt
- Falscher Wert in ADSIZE (Adresse -1 statt +1) korrigiert
- Schreibfehler verbessert
- Einrückungen an vorgeschlagene Notation angepasst (was die CODE-Anzeige hier nicht ganz kapiert)

Code: Alles auswählen
* = 0x00080         ; Variablendeklaration
ZWISCHEN    DB 0    ;Zwischenspeicher
AD_VAL1    DB 0x0    ; Adresse des aktuell zu vergl Werts
AD_VAL2    DB 0x0   
VAL1       DB 0    ; Aktueller Wert
VAL2      DB 0   ; Zweiter Wert (zum vergleichen)
EINS       DB 1    ; Eins
NULL      DB 0    ; Null
AD_ARSIZE   DB 0x00040
ARSIZE      DB 0   

* = 0x00100       ;Beginn des Programmes

LDIV AD_ARSIZE
ADD EINS
STV ARSIZE    ;Adresse des ersten Elements außerhalb des Arrays

OUTERLOOP     LDIV AD_VAL1     ;
         STV VAL1       ; a[i] -> VAL1

         INNERLOOP   LDV AD_VAL1      ; Adresse holen
                  ADD EINS      ; Adresse inkrementieren
                  STV AD_VAL2      ; Neuen Wert in a2 schreiben
    
                  EQL ARSIZE       ;Prüfen, ob am Ende des Arrays
                  JNM END_INNER     ;Wenn am Ende, Innere Schleife beenden
    
                  LDV VAL2      ;
                  NOT            ; Einser-
                  ADD EINS      ; Zweierkomplement der zweiten Zahl
                  ADD VAL1      ; a1-a2
                  JMN GROESSER     ; a2 > a1
                  
                  ; a2 <= a1
                  EQL NULL      ; a1-a2=0 ?
                  JMN GLEICH      ; a1-a2=0 !
                  ; a2 < a1
                  ; TAUSCHE a1 und a2
                  LDV VAL1   
                  STV ZWISCHEN    ; a1 -> zwischen
                  LDV VAL2
                  STIV AD_VAL1     ; a2 -> a1
                  LDV ZWISCHEN
                  STIV AD_VAL2     ; zwischen -> a2
      
                  GROESSER
                  GLEICH
                  JMP INNERLOOP
   
         END_INNER
         LDV AD_VAL1
         ADD EINS       ; i++ für a[i]
         STV AD_VAL1
         EQL ARSIZE       ;Prüfen, ob am Ende des Arrays
         JNM END_OUTER
         JMP OUTERLOOP

END_OUTER   HALT

Ich glaube, das stimmt so, aber dieser doof Quellcode lässt sich echt nicht angenehm lesen, also wenn jemand einen Fehler findet... heraus damit!

Ach ja, ich ignoriere den Hinweis auf dem Blatt und fange nicht von hinten an zu sortieren.
Zuletzt geändert von M.A. am 27.05.2009 15:24, insgesamt 4-mal geändert.
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon mabl » 26.05.2009 18:14

M.A. hat geschrieben:also ich hab mal nen ganz simplen sortieralgo genommen, und zwar etwas ungefähr wie:

Der nennt sich Bubbelsort ohne Abbruchsbedingung und ist im Prinzip das gleiche wie ich gemacht habe ^^ - Nur bin ich von hinten nach vorne durch, und breche ab, wenn nichts mehr getauscht wurde. :ugeek:


Edit: Wo hast du denn den Befehl EQL her? Faszinierend auch, dass du ohne LDIV und STIV auskommst, ohne es jetzt genau angeschaut zu haben, aber ich glaube nicht dass das ohne geht.
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon M.A. » 26.05.2009 22:32

mabl hat geschrieben:Edit: Wo hast du denn den Befehl EQL her? Faszinierend auch, dass du ohne LDIV und STIV auskommst, ohne es jetzt genau angeschaut zu haben, aber ich glaube nicht dass das ohne geht.

Aus der Definition der MIMA von der TI-Seite, Op-Code 7. :mrgreen:
Code: Alles auswählen
7 EQL a     falls Akku = <a>: -1 -> Akku
            sonst :           0 -> Akku

Und wegen LDIV und STIV... Meinen Code hat ja noch niemand bestätigt, kann daher immer noch falsch sein. ;) Ich finde das enorm umständlich und unübersichtlich so zu programmieren, daher unterlaufen einem da wohl schnell Fehler... aber als ich das gepostet habe, schien mir alles zu passen. Ich denk mich da heut nicht nochmal rein, aber morgen. :)
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon moggi » 26.05.2009 23:07

Huhu, nachdem ich mir den Code angeschaut hab, bin ich auch der Meinung, dass da ein paar Fehler drin sind.



Code: Alles auswählen
LDV AD_ARSIZE
STV ARSIZE    ;Größe des Arrays +1 in ARSIZE


Sollte das nicht eher heißen:

Code: Alles auswählen
LDIV AD_ARSIZE
STV ARSIZE    ;Größe des Arrays -1 in ARSIZE


Du hast in AD_ARSIZE nur die Adresse des letzten Eintrags stehen, daher musst du mit LDIV auf den Wert zu greifen.

Das gleiche Problem taucht eigentlich überall dort auf, wo du selbst von Adressen redest, da wenn wir Adressen gegeben haben, wir auf den Inhalt der durch diese Adresse referenzierte Speicherzelle nur mit STIV und LDIV

EDIT: @mabl: KAnn man im CODE Bereich keine Farben benutzen?
Zuletzt geändert von moggi am 26.05.2009 23:33, insgesamt 1-mal geändert.
moggi
 
Beiträge: 60
Registriert: 10.11.2008 01:16

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon mabl » 26.05.2009 23:27

moggi hat geschrieben:EDIT: @mabl: KAnn man im CODE Bereich keine Farben benutzen?

Der Sinn und Zweck des CODE Bereichs ist es, keine Formatierung zu Verfügung zu stellen.

Ich habe jetzt auch noch ein paar Fehler in meinem Code verbessert (nutze jetzt auch wo möglich EQU), siehe die erste Post für Download. (Der alte Code war unvollständig, weil ich nur die ungeraden Seiten exportiert habe :mrgreen: )
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon miriam » 27.05.2009 10:28

hi
@ mable ich hab glaub noch ein problem in deinem code gefunden :

wenn du bei swap_f feststellts dass noch nicht vorne angekommen mit dem vergleichen springst du wieder zu loop 2 .soweit richtig. dort beginnst du wieder mit dem laden von currElemAddr, aber du musst ja jetzt im prinzip currElemAddr-1 und currElemAddr-2 vergleichen , sonst werden immer wieder die selben zahlen verglichen. also solltest du vor dem sprung noch currElemAddr-1=currElemAddr setzten. also zwische zeile 91 und 92 in deiner lösung.


noch en kleiner schreibfehler in zeile 112 steht EQU schätze sollte EQL heißen.
miriam
 
Beiträge: 96
Registriert: 30.10.2008 15:45

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon mabl » 27.05.2009 13:01

@ Miriam:
vollkommen richtige Einwände, habe dieses und noch ein paar Kommentare verbessert. Ich hoffe so stimmts jetzt endlich :D
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon M.A. » 27.05.2009 15:12

Habe auch mein Programm verbessert, siehe oben. Ich denke, jetzt sollte es stimmen.
Bild
Benutzeravatar
M.A.
 
Beiträge: 366
Registriert: 25.10.2008 16:37

Re: Übungsblatt 3 - Rechnerorganisation

Beitragvon mabl » 27.05.2009 15:53

M.A. hat geschrieben:
Code: Alles auswählen
AD_ARSIZE   DB 0x00040

Abgesehen davon, das Hexzahlen bei uns mit $ gepräfixt werden, musst du hier eine Speicheradresse für den Assembler festlegen also
Code: Alles auswählen
AD_ARSIZE = $00040


So wie du es jetzt hast wäre es ein

Code: Alles auswählen
Addresse Wert
0x00020  ;ENDE ARRAY
...
0x00040  0x000020 ;-> Adresse zum letzten Array Element
...
0x00088  0x000040 ;->Adresse zur Adresse der Adresse des letzten Elements


Ein LDIV AD_ARSIZE würde jetzt *(AD_ARSIZE) in den Akku laden, also *(0x00088)=0x000040. Also den falschen Wert. Deswegen musst du dem Assembler sagen das AD_ARSIZE gleich der Adresse 0x000040 ist, somit läd er dann *(0x000040)= 0x20 in den Speicher, die Adresse des letzten Arrayelements.

EDIT: Ok wenn du nur bis zum Wert der Adresse des letzten Array Elementes willst, geht das auch so mit LDIV und DS - aber es ist doch um einiges langsamer ;)
Benutzeravatar
mabl
Site Admin
 
Beiträge: 741
Registriert: 25.10.2008 11:28
Wohnort: Ettlingen, Karlsruhe

Nächste

Zurück zu Informatik

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron