Je suis opiniâtre Progi1984
On va y arriver, juste un petit problème que je viens de comprendre
J'ai compilé avec Tailbite et ça marche
Effectivement, la ligne !extrn PB_DataPointer devient la cause de l'erreur. Tailbite doit la créer alors que lorsque j'écris une lib en assembleur je dois la mettre.
Voici mon code d'essai qui fonctionne avec la dernière version de tailbite
J'ai utilisé un messagerequester pour afficher les data, j'ai fait varier de 1 à 3 et ca marche
On reprend
coche les options et ne compile que ce code sans les datas et bien sur sans l'appel de la fonction
Code : Tout sélectionner
ProcedureDLL Keywords(AdresseDebutDatas, Nombre_A_Lire)
; Restore maliste; on se place au début des datas
MOV eax, AdresseDebutDatas
! MOV dword [PB_DataPointer], eax ; initialise le pointeur des Data
For i = 1 To Nombre_A_Lire
Read Struc.s
a$ + Struc.s+Chr(10)+Chr(10)
Next i
MessageRequester("",a$,16)
EndProcedure
ensuite rédémarre le compilateur pour que la lib soit prise en compte (Menu compilateur/redémarrer le compilateur)
ouvre un nouveau document PB vide et met le code
Code : Tout sélectionner
Keywords(?maliste, 3) ; 3 car 3 valeurs
;
;
DataSection
maliste:
Data.s "DELETE"
Data.s "ADD"
Data.s "VDISK"
EndDataSection
et tu devrais voir la messagerequester s'afficher avec les 3 lignes de datas
mets par exemple 2 à la place du 3 et la messagerequester n'affiche que les 2 lignes
Maintenant il ne reste plus qu'à mettre ta portion de code et de supprimer a$ et la messagerequester
On peut aussi envisager de mettre 2 labels et de passer en paramètre les 2 labels (1er label début des datas et 2eme label pour la fin des datas, les datas situés entre ces 2 labels seront lus, pas les autres
voici le code que j'ai testé et qui fonctionne
Code : Tout sélectionner
ProcedureDLL Keywords1(AdresseDebutDatas, FinDatas)
; Restore maliste; on se place au début des datas
MOV eax, AdresseDebutDatas
! MOV dword [PB_DataPointer], eax ; initialise le pointeur des Data
!boucle:
!MOV eax, dword [PB_DataPointer]
MOV edx, FinDatas
!CMP eax, edx
!JE _fin
Read Struc.s
; mets ton code ici
a$ + Struc.s+Chr(10)+Chr(10)
!JMP boucle
!_fin:
MessageRequester("",a$,16)
EndProcedure
et ensuite le code d'essai
Code : Tout sélectionner
Keywords(?maliste, ?Finmaliste)
DataSection
Data.s "DELETE"
Data.s "ADD"
maliste:
Data.s "VDISK"
Data.s "VDISK1"
Data.s "VDISK2"
Finmaliste:
Data.s "VDISK3"
Data.s "VDISK4"
EndDataSection