Differenze tra le versioni di "Scrivere una libreria esterna che modifica un byte all'interno dell'area di memoria di una variabile"

Da Gambas-it.org - Wikipedia.
 
Riga 13: Riga 13:
 
   
 
   
 
   
 
   
  '''Public''' Sub Main()
+
  Public Sub Main()
 
    
 
    
 
   Dim origo, i As Integer
 
   Dim origo, i As Integer
 
   Dim index, sost As Byte
 
   Dim index, sost As Byte
 
    
 
    
  CreaSo()
+
  CreaSo()
 
    
 
    
  origo = &01020304
+
  origo = &01020304
  index = 2
+
  index = 2
  sost = &88
+
  sost = &88
 
    
 
    
  i = modmem(origo, index, sost)
+
  i = modmem(origo, index, sost)
 
+
 
  Print Hex(i, 8), i
+
  Print Hex(i, 8), i
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Private''' Procedure CreaSo()
+
  Private Procedure CreaSo()
 
    
 
    
 
   File.Save("/tmp/lib.c", "union unione {\n"
 
   File.Save("/tmp/lib.c", "union unione {\n"
Riga 43: Riga 43:
 
      
 
      
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
   Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait
 
+
  '''End'''
+
  End

Versione attuale delle 18:28, 12 giu 2024

Nell'esempio che segue viene creata una libreria esterna dinamica condivisa .so contenente una funzione che modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.

Nella funzione esterna verrà utilizzata una "Union", contenente due soli membri: il primo un array di tipo char di 4 elementi (corrispondente in Gambas al tipo Byte), il secondo membro di tipo int (corrispondente in Gambas al tipo Integer).

Poiché nella Union i membri hanno identico indirizzo di memoria (corrispondente fra l'altro a quello della Union di appartenenza), il membro array char[4] viene a corrispondere nei suoi elementi ai 4 byte di memoria occupata dal secondo membro di tipo int.

Così, dunque, modificando uno o più elementi dell'array char[4], si modificheranno i corrispondenti byte dell'area di memoria del membro di tipo int.

Library "/tmp/lib"

' int modmem (int v, char x, char n)
' Modifica un byte all'interno dell'area di memoria di una variabile di tipo Intero.
Private Extern modmem(v As Integer, x As Byte, n As Byte) As Integer


Public Sub Main()
 
 Dim origo, i As Integer
 Dim index, sost As Byte
  
 CreaSo()
  
 origo = &01020304
 index = 2
 sost = &88
  
 i = modmem(origo, index, sost)
 
 Print Hex(i, 8), i
  
End


Private Procedure CreaSo()
 
 File.Save("/tmp/lib.c", "union unione {\n"
           "   char c[4];\n" &
           "   int i;\n};\n\n"
           "union unione un;\n\n\n"
           "int modmem (int v, char x, char n) {\n\n" &
           "   un.i = v;\n\n" &
           "   un.c[x] = n;\n" &
           "   return un.i;\n\n}")
   
 Shell "gcc -o /tmp/lib.so /tmp/lib.c -shared -fPIC" Wait

End