Al escribir un procedimiento Delphi o una función en código ensamblador, qué registros se deben guardar y restaurar al valor original al final del procedimiento?¿Qué registros de CPU deben restaurarse al final de un procedimiento de asm en Delphi
Al llamar a otro procedimiento o función Delphi desde el código ensamblador (en línea), ¿qué puedo esperar que haga esa otra función con los registros? ¿Qué registros se restaurarán a sus valores originales y cuáles no?
(Obviamente, la misma respuesta se aplicaría a las dos preguntas)
Estoy asumiendo la default calling convention de Delphi. Sé que EAX
se usa para valores de retorno de 32 bits. Y mirando el código asm en SysUtils.pas, parece que EBX
, ESI
y EDI
son empujados y restaurados, pero los otros no. Sin embargo, no puedo encontrar ninguna documentación sobre esto.
Esta es la información correcta. Y si el resultado es un Int64, está ubicado en pareja EAX/EDX. –
@ A.Bouchez: Muy cierto. –
En realidad, lo que está en los registros depende de la convención de llamadas. Nada prohíbe escribir funciones de ensamblador "stdcall" y "cdecl", que no usan los registros para pasar parámetros. También lo que está en el registro, lo que está en la pila (y lo que está en el registro FPU) depende del tipo de parámetros. EBX, ESI, EDI se pueden modificar dentro del procedimiento, siempre que se guarden y restablezcan correctamente. Por supuesto, tocar EBP y ESP es mucho más peligroso. –