Delphi内联汇编实现的十进制转二进制

指令介绍:

LEA指令是取地址指令,Delphi的@运算符相当于LEA指令

JC/JNC:测试CF标志。JC为CF=1转移到标号所指示的指令处执行;JNC指令,CF=0则跳转到标号所指示的指令处执行。

JZ/JNE:测试ZF标志。JZ为ZF=1转移到标号所指示的指令处执行;JNE指令,ZF=0则跳转到标号所指示的指令处执行。
SHL指令:左位移指令,最后移出的位送进CF标志寄存器。

BYTE PTR:指定读写内存是以字节为单位,相应的有 WORD PTR、DWORD PTR...

unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    Edit1: TEdit;

    Edit2: TEdit;

    procedure Button1Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



procedure TForm1.Button1Click(Sender: TObject);

var

    BinaryString:Array[0..32] of char;

    i:Integer;

begin

    i:=StrToInt(Edit1.Text);

    asm

        //取得BinaryString数组的首地址,放到EDX寄存器

        LEA EDX,BinaryString;

        //把ECX进行异或操作,即置0

        XOR ECX,ECX;

        MOV ECX,32;

        MOV EAX,DWORD PTR[i];

   @@L1:

        //把EAX的值左移1位

        SHL EAX,1;

        //把'0'送到EDX所指的地址中

        MOV BYTE PTR [EDX],'0';

        //如果左移一位,最后移出的位是0的话就跳转

        JNC @@ZERO;

        //把'1'送到EDX所指的地址中

        MOV BYTE PTR [EDX],'1';

   @@ZERO:

        //EDX加1

        INC EDX;

        //ECX减1

        DEC ECX;

        CMP ECX,0;

        //如果ECX等于0则跳转

        JNE @@L1;

    end;

    Edit2.Text:=BinaryString;

end;



end.

                                     

你可能感兴趣的:(Delphi)