2010-08-24 14 views
13

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.

Respuesta

11

Los primeros tres argumentos de una función se dan en EAX, EDX, y ECX, respectivamente. Argumentos adicionales son empujados en la pila. Para un método de un objeto, el puntero Self es siempre el primer parámetro (invisible). El resultado debe estar en EAX. Para las funciones que devuelven cadenas largas, el parámetro (invisible) último de la función es el puntero a la cadena resultante (que por sí solo es un puntero al primer carácter de la cadena).

EBX no debe ser alterado (a menos que restaure antes del final del procedimiento/función), y por lo tanto no debe ESP, EBP, ESI, o bien EDI. (1) Una excelente introducción a ASM en línea Delphi solía encontrarse aquí: http://www.delphi3000.com/articles/article_3766.asp

+2

Esta es la información correcta. Y si el resultado es un Int64, está ubicado en pareja EAX/EDX. –

+0

@ A.Bouchez: Muy cierto. –

+2

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. –

4

No sé si los documentos están al día, pero usted debe echar un vistazo a Using Inline Assembly Code (Win32 Only) en el Embarcardero Wiki:

Cita:

En general, las normas de uso de registro en una declaración de asm son los mismos que los de un procedimiento o función externa. Una declaración asm debe preservar los registros EDI, ESI, ESP, EBP y EBX, pero puede modificar libremente los registros EAX, ECX y EDX. Al ingresar a una instrucción asm, EBP apunta al marco de pila actual y ESP apunta a la parte superior de la pila. A excepción de ESP y EBP, una instrucción asm no puede suponer nada sobre los contenidos del registro al ingresar en la declaración.

+0

Gracias por el enlace, aunque está roto (falta un paréntesis de cierre en la URL). – Servaas

+0

@Servaas: ¿No ves el paréntesis de cierre anterior? :) El problema es que StackOverflow (o, en realidad, MarkDown) no puede interpretar las URL que contienen el paréntesis de cierre (naturalmente). –

+0

Parece que el enlace ha sido reparado. Gracias, Rob Kennedy. – Servaas

Cuestiones relacionadas