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
Mailing lists / lazarus-es / 2010-12
Free Pascal y assembler
5 messages · 3 people · –
- CClaudio Romero 2
- GGabriel Martinez 2
- JJesus Reyes 1
Reply by email Subscribe to this list Your subscription
Read-only archive. Use j and k to move between messages.
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
Me olvide, no probe para una funtion hecha en assembler, creo que los parametros.
Puedes mirar esta pagina, creo que se aplica a freepascal
http://docwiki.embarcadero.com/RADStudio/en/Program_Control#Register_Convention
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
--- El mi� 8-dic-10, Gabriel Martinez <gamartinez en arrakis.es> escribi�:
Show quoted text 12 lines
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.
