Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zugriff auf Array's via Inline Assembler

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 24.10.2005, 14:11    Titel: Zugriff auf Array's via Inline Assembler Antworten mit Zitat

Hi Forum,

habe ein kleines Problem, hoffe es ist nur ein Denkfehler.

Habe folgendes Array Initialisiert :

Code:
dim array as integer ptr
      array = allocate ( len(integer) * 100 )

for a%=1 to 100
  array[a%] = a%
next a%


Nun möchte ich via Inlineassembler auf die einzelnen Arrayteile zugreifen und habe folgenden Test - Code dazu geschrieben :

Code:
function test (byval zeiger as integer ptr)
  asm
    mov ecx, 100
    weiter:
    add eax, [zeiger]+cx
    loop weiter
    mov [function], eax
  end asm
end function
 


Leider führt dieser Code zu einem Absturz. Weiß jemand Rat ?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 24.10.2005, 15:23    Titel: Antworten mit Zitat

deine for-schleife im ersten beispiel hinkt ziemlich..

erstens:
for a% = 0 to 99
und zweitens:
array[a%*len(integer)]=a%


vielleicht hilft das etwas?
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
chutullu



Anmeldungsdatum: 18.10.2005
Beiträge: 77

BeitragVerfasst am: 24.10.2005, 15:36    Titel: Antworten mit Zitat

Dank für den Hinweis, habe in der Eile des Gefechtes folgendes Vergessen :

Code:
dim array as integer ptr
    array = allocate ( len(integer) * 100 )

for a%=1 to 100
  array[a%-1] = a%: rem anstatt array[a%] = a%
next a%



Das Hilft mir aber nicht bei meinem eigentlichen Problem :
Code:

function test () as integer

  dim array as integer ptr
        array = allocate ( len(integer)*100 )

  for a%=1 to 100
    array[a%-1]=a%
  next a%
 
  asm
    mov ecx, 99             ' for ecx = 99 to 0 step -1
    mov eax, 0               'eax = 0
    weiter:
    add eax, [array]+ecx 'eax = eax + array[ecx]
    loop weiter                'next weiter
    mov [function],eax    'test = eax
  end asm

end function

print test


Der Code stürzt ab und ich habe keine Ahnung wieso ...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Michael712
aka anfänger, programmierer


Anmeldungsdatum: 26.03.2005
Beiträge: 1593

BeitragVerfasst am: 24.10.2005, 17:16    Titel: Antworten mit Zitat

Hallo.

Du hast loop weiter geschrieben. Heißt das nicht "jmp weiter" ??

Michael


EDIT:Mist, Doch nicht.


Zuletzt bearbeitet von Michael712 am 24.10.2005, 17:20, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 24.10.2005, 17:18    Titel: Antworten mit Zitat

du hast wieder das *len(integer) vergessen, bei der for und der asm-schleife.. aber warum das programm abstürzt weiß ich auch nicht.. ich hab aber auch gelegentlich zufällige abstürze meines programms wenn ich mit allocate arbeite, ich vermute, da ist ein bug im compiler oder sowas, ich konnte nur leider nicht rausfinden, wo oder was der fehler ist. Schau einfach mal ob dein code mit nem normalen array funktioniert..

ach genau, kanns sein, dass dein asm-code probleme macht weil du nicht dran gedacht hast, dass array ein pointer ist? das wär so das was mir noch einfällt..
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1875
Wohnort: D59192

BeitragVerfasst am: 24.10.2005, 23:26    Titel: Antworten mit Zitat

Hallo,
mir ist nicht ganz klar was du mit dem Pointer-Array machen möchtest,
darum hab ich dein Beispiel einmal etwas vereinfacht.
Code:
function test () as integer
Dim a As integer
  dim array (100) as Integer

  for a=0 To 99
    array(a)=a
  next a
 
  asm
    mov ecx, 99             ' for ecx = 99 to 0 step -1
    mov eax, 0              'eax = 0
    weiter:
    add eax, array + ecx    'eax = eax + array[ecx]
    loop weiter             'next weiter
    mov [Function],eax      'test = eax
  end asm

end function

print test
sleep

So stürzt nichts ab, und als Ergebnis kommt 4950 heraus.
Gruß
Volta
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
mjs



Anmeldungsdatum: 26.09.2005
Beiträge: 75
Wohnort: Adelheidsdorf

BeitragVerfasst am: 25.10.2005, 02:29    Titel: Antworten mit Zitat

Da gabs wohl ein Missverständnis.

0.14b: Das "* len(integer)" wird benötigt
0.15b: Das "* len(integer)" wird nicht benötigt.

Gruß,
Mark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MisterD



Anmeldungsdatum: 10.09.2004
Beiträge: 3071
Wohnort: bei Darmstadt

BeitragVerfasst am: 25.10.2005, 03:44    Titel: Antworten mit Zitat

oha, merk ich mir happy
_________________
"It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
mjs



Anmeldungsdatum: 26.09.2005
Beiträge: 75
Wohnort: Adelheidsdorf

BeitragVerfasst am: 25.10.2005, 10:25    Titel: Antworten mit Zitat

Sorry, ich habe vergessen, dass mein Posting bzgl. "* len(integer)" sich auf die FOR-Schleife bezieht, nicht auf den Assembler-Code!

Im Assembler-Code musst du statt

Code:
add eax, array + ecx


folgendes verwenden:

Code:
lea eax, [array + ecx * 4]


0.14b behandelt Indices (Offsets) von Pointern immer als Byte-Offsets, während 0.15b immer die Größe des Datentyps verwendet auf die der Pointer zeigt

Beispiel für 0.14b:

Code:
dim x as integer ptr = callocate( len(integer)*100 )
for i=0 to 99

  x[i * len(integer)] = i
next


Dagegen muss man bei 0.15b folgendes schreiben:

Code:
dim x as integer ptr = callocate( len(integer)*100 )
for i=0 to 99
  x[i] = i ' freebasic erkennt dass das ein Pointer auf eine Struktur mit
           ' einer Größe von 4 Bytes ist, weshalb das "echte" Offset
           ' = i * len(integer) ist
next


0.15b verhält sich also mit Pointern wie C, was IMHO auch sinnvoller ist, da man selten ein Integer-Array and "falschen" Offsets (keine Vielfachen von 4) auslesen will.

Gruß,
Mark
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. 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.

 Impressum :: Datenschutz