Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   ASM y Microcontroladores (https://www.clubdelphi.com/foros/forumdisplay.php?f=44)
-   -   ASM En delphi - Me ayudan? (Sleep) (https://www.clubdelphi.com/foros/showthread.php?t=74202)

MarkPwn 05-06-2011 17:45:03

ASM En delphi - Me ayudan? (Sleep)
 
Hola a todos, estaba pasando un codigo de RadASM a delphi, al parecer lo he pasado, mas necesito hacer sleep(10) Entre un codigo y otro

ASM
invoke Sleep,10

delphi
Sleep(10);

como pudiese invocar sleep en delphi en este codigo pro ejemplo :
Código Delphi [-]
begin
  Asm
  mov eax, dword ptr [00851456h]
  mov eax, dword ptr [eax]
  add eax, 1248h
  mov Variable,eax
  push Variable
  call Funcion
  invoke Sleep,10   
  push Valor
  push Variable
end;
///Como declaro Sleep10? lo pongo tal cual y me da error.

ecfisa 06-06-2011 05:48:25

Hola MarkPwn.

Código Delphi [-]
...
begin
 asm
   ...
   push 10   // milisegundos 
   call Sleep   
   ...
  end 
end;

Saludos.

morringo 29-06-2011 18:08:35

Hola ecfisa, una duda:
¿Para C++ builder también sería igual verdad? En cuanto a que metes el 10, ¿en qué parte lo metes? ¿Lo metes en la pila? Disculpa la pregunta, ya que soy nuevo en las dos (C++ y ASM) y según tengo entendido que para meter algo necesitas especificarle si en eax, edx o el registro en el cual lo quieras meter el dato.

Gracias y saludos =).

maeyanes 29-06-2011 22:09:45

Hola...

Si bien recuerdo, la instrucción Push de ensamblador se usa para agregar datos a la pila.


Saludos...

ecfisa 29-06-2011 23:58:15

Hola maeyanes.

La memoria no te falla en absoluto. :)

Saludos.

Al González 30-06-2011 00:39:02

Cita:

Empezado por morringo (Mensaje 405136)
[...] metes el 10, ¿en qué parte lo metes? ¿Lo metes en la pila? [...] tengo entendido que para meter algo necesitas especificarle si en eax, edx o el registro en el cual lo quieras meter el dato.

Eso depende de la convención de llamada que emplee la función en cuestión. En el caso de la función Sleep de la API de Windows su convención de llamada es stdcall, lo cual significa (entre otras cosas) que los parámetros son pasados usando la pila y no copiándolos en los registros de la CPU (que sería lo usual con funciones nativas de Delphi). Por ello la sugerencia de ecfisa es correcta.

Código Delphi [-]
Procedure MuestraEntero (I :Integer);
Begin
  ShowMessage (IntToStr (I));
End;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Asm
    // Llamada a función de estilo "StdCall"
    Push 10
    Call Sleep

    // Llamada a función de estilo "Register" (nativo de Delphi)
    Mov EAX, 20
    Call MuestraEntero
  End;
end;

Te recomiendo leer los temas Calling conventions y Parameter passing de la ayuda de Delphi.

Saludos.

Al González. :)

MarkPwn 03-07-2011 18:15:02

Gracias a todos amigos! me ha servido!


La franja horaria es GMT +2. Ahora son las 23:26:57.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi