Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 24.10.2005, 14:11 Titel: Zugriff auf Array's via Inline Assembler |
|
|
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 |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 24.10.2005, 15:23 Titel: |
|
|
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 |
|
|
chutullu
Anmeldungsdatum: 18.10.2005 Beiträge: 77
|
Verfasst am: 24.10.2005, 15:36 Titel: |
|
|
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 |
|
|
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 24.10.2005, 17:16 Titel: |
|
|
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 |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 24.10.2005, 17:18 Titel: |
|
|
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 |
|
|
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1875 Wohnort: D59192
|
Verfasst am: 24.10.2005, 23:26 Titel: |
|
|
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 |
|
|
mjs
Anmeldungsdatum: 26.09.2005 Beiträge: 75 Wohnort: Adelheidsdorf
|
Verfasst am: 25.10.2005, 02:29 Titel: |
|
|
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 |
|
|
MisterD
Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 25.10.2005, 03:44 Titel: |
|
|
oha, merk ich mir _________________ "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 |
|
|
mjs
Anmeldungsdatum: 26.09.2005 Beiträge: 75 Wohnort: Adelheidsdorf
|
Verfasst am: 25.10.2005, 10:25 Titel: |
|
|
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 |
|
|
|