[Lazarus-es] Free Pascal y assembler

Gabriel Martinez gamartinez en arrakis.es
Mie Dic 8 21:33:32 CET 2010


He intentado enviar un email con dos adjuntos, y no me deja, así es que
el que quiera ver las pantallas que he capturado para ilustrar este
mensaje, que mire en el foro oficial de Lazarus, programming, general,
post parameters in a assembler function.

Bueno, he estado haciendo pruebas con Free Pascal, para ver los
registros utilizados en la llamada a funciones assembler, para ello he
creado una simple función.

Definida así:

        function
TForm1.fparam(a,b,c,d,e,f,g,h,i,j:integer):integer;assembler;
asm
   mov rax,a
   mov rax,b
   mov rax,c
   mov rax,d
   mov rax,e
   mov rax,f
   mov rax,g
   mov rax,h
   mov rax,i
   mov rax,j
end;   

Invocada así:
 
   res:=fparam(1,2,3,4,5,6,7,8,9,10);

Poniendo un break en la llamada a la función y abriendo la ventana de
debug assembler, veo este código en ella:

  IMAGEN A VER EN FORO

Lo que indica que los 5 primeros parámetros se pasan, en edi,edx,ecx,r8d
y r9d,
y los 5 restantes se meten en el stack.

Poniendo otro break en la entrada a la función, la ventana de assembler
es esta.

	IMAGEN A VER EN FORO
    Otra imagen que no se como poner, las podeis ver en el foro oficial
de Lazarus
en el post llamado parameters in a assembler function.

Lo que demuestra lo anteriormente dicho, vemos como los valores 1 a 5
son cargados a rax desde rsi, rdx, rcx, r8 y r9, mientras que los
siguientes 5 son cargados desde una indirección de rbp mas un
desplazamiento, y rbp ha sido cargado anteriormente desde rsp (stack
pointer). 
   Hago constar que esto ha sido realizado en un ordenador con Ubuntu
10.04, procesador AMD Athlon 64x2 Dual Core, por si el procesador o
sistema operativo tuvieran alguna implicación.
   Sería conveniente que alguien con procesador Intel y/o Windows,
efectuara esta prueba.
   Atentamente Gaby





More information about the Lazarus-es mailing list