J'essaie d'apprendre la programmation d'assemblage en ligne dans Delphi, et à cette fin, j'ai trouvé this article très utile.Fonction d'assemblage Delphi Renvoyer une longue chaîne
Maintenant, je souhaite écrire une fonction d'assemblage retournant une longue chaîne, en particulier AnsiString
(pour plus de simplicité). Je l'ai écrit
function myfunc: AnsiString;
asm
// eax = @result
mov edx, 3
mov ecx, 1252
call [email protected]
mov [eax + 0], ord('A')
mov [eax + 1], ord('B')
mov [eax + 2], ord('C')
end;
Explication:
Une fonction renvoyant une chaîne a un paramètre var result: AnsiString
invisible (dans ce cas), donc, au début de la fonction, eax
devrait tenir l'adresse de la chaîne résultante . J'ai ensuite défini edx
et ecx
à 3 et 1252, respectivement, puis appelez System._LStrSetLength
. En effet, je
_LStrSetLength(@result, 3, 1252)
où 3 est la nouvelle longueur de la chaîne (en caractères = octets) et 1252 est la norme windows-1252 codepage. Puis, sachant que eax
est the address of the first character of the string, je simplement définir la chaîne à "ABC". Mais cela ne fonctionne pas - il me donne des données absurdes ou EAccessViolation. Quel est le problème?
Mise à jour
Maintenant, nous avons deux implémentations de travail apparemment de myfunc
, un employant NewAnsiString
et un emploi LStrSetLength
. Je ne peux pas m'empêcher de me demander si les deux sont corrects, dans le sens où ils ne gâchent pas le traitement interne des chaînes de Delphi (comptage des références, libération automatique, etc.).
Pour les questions Delphi/Asm, le forum BASM d'Embarcadero est également utile. Travailler avec des chaînes, vous pourriez également être intéressé par ce fil: http://forums.embarcadero.com/thread.jspa?threadID=20231 – PhiS