Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2010-12

Free Pascal y assembler

5 messages · 3 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Gabriel Martinez

Buenos dias, como puedo pasar la direcci�n de un array de bytes a una funcion en assembler, para cargarla en el registro indice EDI, y tratar los datos del array desde la funcion?, conoceis algun ejemplo de tratamiento de datos de pascal con assembler?.
Saludos : Gaby

Reply by email

Claudio Romero
to Gabriel Martinez

Hola
Aqui cargue un array de bytes, y dentro del assembler incremente cada valor, luego lo muestro en un Memo.
Yo use el ASM Intel que es familiar para mi, pero lo puedes adaptar a tus gustos.

procedure TForm1.Button1Click(Sender: TObject);
var arreglo:array [0..10] of byte;i:integer;
begin
	{$ASMMODE intel}
    for i:=0 to 10 do arreglo[i]:=i+40;
    for i:=0 to 10 do begin
    	asm
            pushad
            xor ecx,ecx
    	    lea edi,arreglo
            add edi,i
            mov cl,[edi]
            inc ecx
            mov [edi],cl
            popad
    	end;
    end;
    for i:=0 to 10 do memo1.lines.add(IntToStr(arreglo[i]));
end;

Saludos

Reply by email

Gabriel Martinez

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

Reply by email

Jesus Reyes
to Gabriel Martinez

--- El mi� 8-dic-10, Gabriel Martinez <gamartinez en arrakis.es> escribi�:

Show quoted text 12 lines
De: Gabriel Martinez <gamartinez en arrakis.es> Asunto: [Lazarus-es] Free Pascal y assembler A: "Lista Lazarus" <lazarus-es en lists.lazarus.freepascal.org> Fecha: mi�rcoles, 8 de diciembre de 2010, 14:33 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.

Si, lo siento pero no se admiten adjuntos que sumen mas de 40Kb. Las im�genes pueden ser manipuladas para que no est�n tan grandes y entonces es posible adjuntarlas.

Jesus Reyes A.

Reply by email