2012-02-24 10 views
7

por favor, me he GCC línea de código ensamblador piezaConversión de un ensamblador en línea GCC para Delphi ensamblador

int src = 0; 
dword n; 
__asm(
      "sar %%cl,%%edx" 
      : "=d" (n) // saves in eax,edx 
      : "c" (src), "d" (n) // the inputs 
      ); 

y mi intento de Delphi es:

asm 
mov ecx, &src 
mov edx, &n 
sar cl,edx 
mov eax,edx 
end; 

favor ¿es correcto?

+5

Mi consejo sería convertir este código en Pascal en lugar de ensamblador. –

Respuesta

10

El ensamblador en línea no funciona de la misma manera en Delphi que en GCC. Para empezar, no tienen el mismo tipo de soporte de macros y la plantilla de Delphi, por lo que si desea utilizar una rutina de ensamblador fin de declarar una vez en general, hay que declararlo como una función:

function ShiftArithmeticRight(aShift: Byte; aValue: LongInt): LongInt; 
{$IFDEF WIN64} 
asm 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
{$IFDEF CPU386} 
asm 
    mov cl,al 
    sar edx,cl 
    mov eax,edx 
end; 
{$ELSE} 
begin 
    if aValue < 0 then 
    Result := not (not aValue shr aShift) 
    else 
    Result := aValue shr aShift; 
end; 
{$ENDIF} 
{$ENDIF} 

En Delphi, el ensamblador en línea debe implementarse en el lugar donde se usa, y solo es compatible con 32 bits. En tales bloques de ASM, puede usar EAX, ECX, EDX libremente, más cualquier identificador en el código circundante. Por ejemplo:

var 
    lValue: LongInt; 
    lShift: Byte; 
begin 
    // Enter pascal code here 
    asm 
    mov cl,lShift 
    sar lValue,cl 
    end; 
    // Enter pascal code here 
end; 
+0

muchas gracias Henrick Hellström, voy a volver a empezar en función de su valiosa respuesta . gracias – Alexis

+2

@Alexis Por favor, puede leer esto http://meta.stackexchange.com/questions/5234/ y luego considerar aceptar esta respuesta y algunas respuestas a sus preguntas anteriores –

+0

Se corrigió un error en mi respuesta original. SAR es una operación firmada, por lo que el parámetro aValue debe ser LongInt y no LongWord. –

Cuestiones relacionadas