指令介绍:
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.