| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen   | 
	
	
	
		| Autor | 
		Nachricht | 
	
	
		chutullu
 
 
  Anmeldungsdatum: 18.10.2005 Beiträge: 77
 
  | 
		
			
				 Verfasst am: 24.10.2005, 13: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, 14: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, 14: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, 16: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, 16:20, insgesamt einmal bearbeitet | 
			 
		  | 
	
	
		| Nach oben | 
		 | 
	
	
		  | 
	
	
		MisterD
 
  
  Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
  | 
		
			
				 Verfasst am: 24.10.2005, 16: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: 1876 Wohnort: D59192
  | 
		
			
				 Verfasst am: 24.10.2005, 22: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, 01: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, 02: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, 09: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 | 
		 | 
	
	
		  | 
	
	
		 |