Difference between revisions of "Lazarus Inline Assembler/es"

From Lazarus wiki
Jump to navigationJump to search
Line 49: Line 49:
 
En el siguiente enlace podéis encontrar una muy buena descripción al respecto en la documentación de FreePascal:
 
En el siguiente enlace podéis encontrar una muy buena descripción al respecto en la documentación de FreePascal:
  
[http://www.freepascal.org/docs-html/prog/progse9.html Utilizando lenguaje ensamblador en el codigo fuente], está en inglés así que lo pongo aquí traducido:
+
[http://www.freepascal.org/docs-html/prog/progse9.html Utilizando lenguaje ensamblador en el codigo fuente], está en inglés así que lo pongo aquí traducido, añadiendo tambien este enlace [http://www.freepascal.org/docs-html/prog/progsu3.html a directivas para ensamblador] y su respectiva traducción:
 +
 
 +
1.2.3 $ASMMODE : Assembler mode (Intel 80x86 only)
 +
 
 +
The {$ASMMODE XXX} directive informs the compiler what kind of assembler it can expect in an asm block. The XXX should be replaced by one of the following:
 +
 
 +
att
 +
    Indica que los bloques asm contienen sintaxis en la modalidad ensamblador de AT&T.
 +
intel
 +
    Indica que los bloques asm contienen sintaxis en la modalidad ensamblador de Intel.
 +
direct
 +
    Indica al compilador que los bloques asm deben ser copiados directamente al fichero en ensamblador. No es posible utilizar estos bloques en ensamblador cuando se está utilizando un ensamblador interno por parte del compilador.
 +
 
 +
Estas opciones son locales y retienen su valor hasta el final de la unidad que es compilada, al menos que sean reemplazados utilizando
 +
alguna otra directiva del mismo tipo. La opción a nivel de línea de mandatos que corresponde a esto es -R.
 +
These switches are local, and retain their value to the end of the unit that is compiled, unless
 +
 
 +
they are replaced by another directive of the same type. The command line switch that corresponds to this switch is -R.
 +
 
 +
El lector de ensamblador que se utiliza por defecto si no se especifica otro es AT&T.
  
 
Hay esencialmente 2 modos de embeber código ensamblador en código fuente pascal. La primera es la más simple y consiste
 
Hay esencialmente 2 modos de embeber código ensamblador en código fuente pascal. La primera es la más simple y consiste

Revision as of 13:17, 25 June 2014

English (en) español (es) français (fr) 日本語 (ja) 한국어 (ko) русский (ru) Tiếng Việt (vi)

Esto es un esbozo para alentar a otros a contribuir con más información. A continuación un ejemplo sencillo como punto de partida:

unit unit_asm;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
  { TForm1 }
  TForm1 = class(TForm)
    btnGo: TButton;
    edtInput: TEdit;
    edtOutput: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure btnGoClick(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end; 
var
  Form1: TForm1; 
implementation
{ TForm1 }

procedure TForm1.btnGoClick(Sender: TObject);
var
  num, answer : integer;
begin
  num := StrToInt(edtInput.Text);
  // Se requiere esto con Lazarus en x86, definimos el modo ensamblador de Intel:
  {$ASMMODE intel}
  asm
    MOV EAX, num
    ADD EAX, 110B //add binary 110
    SUB EAX, 2    //subtract decimal 2
    MOV answer, EAX
  end;
  edtOutput.Text := IntToStr(answer);
end;

initialization
  {$I unit_asm.lrs}
end.

En el siguiente enlace podéis encontrar una muy buena descripción al respecto en la documentación de FreePascal:

Utilizando lenguaje ensamblador en el codigo fuente, está en inglés así que lo pongo aquí traducido, añadiendo tambien este enlace a directivas para ensamblador y su respectiva traducción:

1.2.3 $ASMMODE : Assembler mode (Intel 80x86 only)

The {$ASMMODE XXX} directive informs the compiler what kind of assembler it can expect in an asm block. The XXX should be replaced by one of the following:

att

   Indica que los bloques asm contienen sintaxis en la modalidad ensamblador de AT&T. 

intel

   Indica que los bloques asm contienen sintaxis en la modalidad ensamblador de Intel. 

direct

   Indica al compilador que los bloques asm deben ser copiados directamente al fichero en ensamblador. No es posible utilizar estos bloques en ensamblador cuando se está utilizando un ensamblador interno por parte del compilador.

Estas opciones son locales y retienen su valor hasta el final de la unidad que es compilada, al menos que sean reemplazados utilizando alguna otra directiva del mismo tipo. La opción a nivel de línea de mandatos que corresponde a esto es -R. These switches are local, and retain their value to the end of the unit that is compiled, unless

they are replaced by another directive of the same type. The command line switch that corresponds to this switch is -R.

El lector de ensamblador que se utiliza por defecto si no se especifica otro es AT&T.

Hay esencialmente 2 modos de embeber código ensamblador en código fuente pascal. La primera es la más simple y consiste en utilizar un bloque asm:

Var  
  I : Integer;  
begin  
  I:=3;  
  asm  
   movl I,%eax  
  end;  
end;

Todo lo que está contenido entre 'asm' y 'end' define un bloque que se inserta como código ensamblador en el código generado. Dependiendo del modo del lector ensamblador, el compilador realizará la sustitución de ciertos nombres por sus direccciones.

El segundo modo es implementando una función o bien un procedimiento completamente en ensamblador. Esto se realiza añadiendo un modificador a la cabecera de la función o procedimiento:

function geteipasebx : pointer;assembler;  
asm  
  movl (%esp),%ebx  
  ret  
end;

Es posible todavía declarar variables para el procedimiento en ensamblador:

procedure Move(const source;var dest;count:SizeInt);assembler;  
var  
  saveesi,saveedi : longint;  
asm  
  movl %edi,saveedi  
end;

El compilador reservará espacio en la pila para estas variables, esto inserta algunos comandos para ello.

Tener en cuenta que el nombre ensamblador de una función en ensamblador . Por ejemplo la etiqueta para esta función no deberá ser el nombre de la función declarada. Para cambiar esto se puede utilizar un modificador Alias: Note that the assembler name of an assembler function will still be ’mangled’ by the compiler, i.e. the label for this function will not be the name of the function as declared.

function geteipasebx : pointer;assembler;[alias:’FPC_GETEIPINEBX’];  
asm  
  movl (%esp),%ebx  
  ret  
end;

Para hacer que la función esté disponible en código ensamblador fuera de la actual unit se debe añadir el modificador 'public':


function geteipasebx : pointer;assembler;[public,alias:’FPC_GETEIPINEBX’]; asm

 movl (%esp),%ebx  
 ret  

end;