Zum neuen Informatik-Forum >>
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Intell x86 Assambler in QNX

 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Assembler
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Klausi
Gast





BeitragVerfasst am: 26. Apr 2006 20:02    Titel: Intell x86 Assambler in QNX Antworten mit Zitat

Moin Moin

Ich habe ein Problem mit einer Assambler Aufgabe.

Ziel ist es ein vorgegebenes Feld "DataList" nach größe zu sortieren .

Im folgenden erst mal der Code den ich dafür getippt habe :

# *****************************************************************************
# Autor: Gimm, Klaus
# Mat.Nr: xxxxx
# GSP - SS 2006 Gruppe 3
# Praktikumsaufgabe 04 von Meisel
# Kontakt: [email protected]
# Datei: aufgabe_4.s
# Version: 0.1 - Grundlegende Strukur
# 0.2 - Programm in Pseudocode
# 0.3 - erste Versuche von Code
# 0.4 - kompiliert vollständig
# 0.5 - sortiert nicht !!!!
# 0.6 - Anweisung 24 Überschreibt Speicher Elemente
# 0.7 - Testen und kommentieren
# 0.8 - Sprungbedingungen sind nicht korrekt
#
# Aufgabe: Ein Assembler Programm welches ein Array von 10 Zahlen sortiert
# Erklärungen: EAX - Register für temporäre Inhalte
# EBX - Addresse des ersten Elements
# ECX - Addresse des letzten Elements
# EDX - Enthält 1 wenn ein Element getauscht wurde, sonst 0
# ESI - Pointer auf die Elemente
# EDI - Pointer auf die Elemente
#
# EBP - Nicht verwendet
# *****************************************************************************


.globl main
# *****************************************************************************
# * Konstantendefinition
# *****************************************************************************
.equ LEN,0x000A #Länge der Tabelle


# *****************************************************************************
# * Initialisierung der globalen Daten
# *****************************************************************************
.section .data

#Diese DataList soll von dem Programm sortiert werden
//DataList: .byte 35, -1, 13, -12, 100, 101, -3, -5, 0, -7

#Alternativate DataList fuer Testzwecke
DataList: .byte 35, 1, 13, 12, 100, 101, 3, 5, 0, 7

# *****************************************************************************
# * UNKNOWN SEGMENT
# *****************************************************************************
.section .bss



# *****************************************************************************
# * Hauptprogramm
# *****************************************************************************
.section .text

main:
#Schreibt die Addresse des ersten Elements nach Register B
mov $DataList,%ebx # Anweisung 1

#Schreibt die Addresse des ersten Elements nach Register C
mov $DataList,%ecx # Anweisung 2

#Addiert die Länge des Feldes auf die Address im Register ecx
#damit es auf das letze Element zeigt
add $LEN, %ecx # Anweisung 3

#Setze Getauscht auf JA (= 1) nach Register D
mov $0x0001,%edx # Anweisung 4


#Bedingung der ersten While Schleife
while_01: #Frage ob Getauscht NEIN (=0) ist
cmp $0x0000,%edx # Anweisung 5

#Ist getauscht NEIN (=0), springe zu ENDE
je Ende # Anweisung 6


#Anweisungen der ersten While Schleife
do_01: #Setze Getauscht auf NEIN (=0)
mov $0x0000,%edx # Anweisung 7

#Setze einen Zeiger auf das erste Element
mov %ebx,%esi # Anweisung 8


#Bedingung der zweiten While Schleife
while_02: #Frage ob der Zeiger auf dem letzen Element sitzt
cmp %ecx, %esi # Anweisung 9

#Wenn Zeiger auf das letze Element zeigt oder bereits darüber hinaus
#springe nach while_01 Konstrukt
jge while_01 # Anweisung 10


#Anweisungen der zweiten While Schleife
do_02:

#Bedingungen der If_01 Konstruktion
BeginIF_01: #Schreibe den Inhalt der Addresse aus Register ESI nach Register EAX
mov (%esi),%eax # Anweisung 11

#Schreibe den Inhalt von Register ESI nach Register EDI
mov %esi,%edi # Anweisung 12

#Erhöhe den Inhalt von EDI um auf das nächste Element zu zeigen
add $0x0001,%edi # Anweisung 13

#Vergleiche den aktuellen Wert mit dem Folgenden Wert
cmp %eax,(%edi) # Anweisung 14

#Lösche Register A in dem 0 hineingeschrieben wird
mov $0x0000, %eax # Anweisung 15

#Lösche Register EDI in dem 0 hineingeschrieben wird
mov $0x0000, %edi # Anweisung 16

#Sind die Werte gleich, oder der aktuelle Wert kleiner als der
#folgende Wert so springe zu EndIF_01
jle EndIF_01 # Anweisung 17

// IM SEGMENT BeginIF_01 MUSS EIN FEHLER SEIN !!!!!

#Anweisungen der If_01 Konstuktion
ThenIF_01: #Tausche Tabelleneinträge
#Kopiere den Inhalt der Addresse von Register ESI (aktuelles
#Element) in Register EAX
mov (%esi),%eax # Anweisung 18

#Erhöhe den Inhalt von Register ESI um auf das nächste
#Element zu zeigen
add $0x0001,%esi # Anweisung 19

#Rette den Inhalt von Register EDX auf den Stack
push %edx # Anweisung 20

#Kopiere den Inhalt der Address von Register ESI(nächster
#Wert) in Register EDX
mov (%esi),%edx # Anweisung 21

#Verringere den Inhalt von Register ESI um wieder auf das
#aktuelle Element zu zeigen
sub $0x0001,%esi # Anweisung 22

#Kopiere das folgende Element an die aktuelle Stelle
#in Byte Format um nicht andere Elemente zu überschreiben
movb %dl,(%esi) # Anweisung 23

#Erhöhe den Inhalt von Register ESI um auf das nächste
#Element zu zeigen
add $0x0001,%esi # Anweisung 24

#Kopiere das Element von Register A an die folgende Stelle
#in Byte Format um nicht andere Elemente zu überschreiben
movb %al, (%esi) # Anweisung 25

#Verringere den Inhalt von Register ESI um auf das aktuelle
#Element zu zeigen
sub $0x0001,%esi # Anweisung 26

#Lösche Register EAX in dem 0 hineingeschrieben wird
mov $0x0000, %eax # Anweisung 27

#Rette den Inhalt von EDX vom Stack
pop %edx # Anweisung 28

#Setze Getauscht auf JA(=1) in Register EDX
mov $0x0001,%edx # Anweisung 29


#Ende der If Konstruktion
EndIF_01: #Setze den Zeiger auf das nächste Element
add $0x0001, %esi # Anweisung 30

#Springe zurück nach while_02
jmp while_02 # Anweisung 31


#Ende der zweiten While Schleife
end_02:

#Ende der ersten While Schleife
end_01:

# *****************************************************************************
# * Ende
# *****************************************************************************
Ende: nop
ret # Anweisung 32


---------------------------------------------------------------
Code Ende.

Hoffe das ist einigermaßen lesbar, auf dem Bildschirm siehts ganz ok aus.

Problem ist folgendes: es funktioniert nicht.
So, um ein bisschen spezifischer zu sein: Ich habe mit dem Debugger rumgespielt und es sieht so aus als wenn der Code Teil der die Zahlen der Kette Tauscht, funktioniert.
Wo Probleme zu sein scheinen sind die Bedingten sprünge :
Z. B. Anweisung 17 .... die begreife ich nicht. Eigentlich muesste es nach meinem verständnis JGE heißen. Verwende ich das aber werden die ersten beiden Zahlen schon mal nicht sortiert. Und auch später werden Sortierungen nicht durchgeführt.

Anweisung 10 scheint auch nicht correct, hin und wieder laufe ich im Debugger über die Feldlänge hinaus. Warum kann ich nicht sagen. Es wird also, so sieht es für mich aus ein 11. Element sortiert.

Und das programm laeuft ewig, es kommt also nicht zum schluss. dass liegt aber glaube ich daran das die jumps nicht korrekt funktionieren.

Hat da jemand eine IDee was man da tun kann ?

mfg

Tec
Nach oben
TMSearcher



Anmeldungsdatum: 19.05.2005
Beiträge: 270
Wohnort: Bremen

BeitragVerfasst am: 29. Mai 2006 11:32    Titel: Antworten mit Zitat

Hi,
wahrscheinlich ist das Thema nicht mehr aktuell, aber ich glaube es währe günstiger, wenn du erst mal einen Programmablaufplan gepostet hättest und dann den Quelltext. Man erkennt darin Logikfehler wesentlich besser als so. Deshalb wahrscheinlich auch die geringe Resonanz Augenzwinkern .

Gruß
TMS

_________________
Intelligent life is so very rare,
the rarest thing in creation
and the most precious
This is Earth Calling..
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    Informatikerboard.de Foren-Übersicht -> Assembler Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum nicht herunterladen