mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-03 06:43:39 +02:00
98 lines
1.9 KiB
ObjectPascal
98 lines
1.9 KiB
ObjectPascal
unit AsmTestUnit;
|
|
|
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
|
|
ExtCtrls, LCLProc, Math, LazStringUtils,
|
|
FpDbgDisasX86, FpDbgClasses, FpDbgUtil;
|
|
|
|
type
|
|
|
|
{ TForm1 }
|
|
|
|
TForm1 = class(TForm)
|
|
chk64Bit: TCheckBox;
|
|
Timer1: TTimer;
|
|
txtOutput: TEdit;
|
|
Label1: TLabel;
|
|
Label2: TLabel;
|
|
txtCode: TMemo;
|
|
procedure Timer1Timer(Sender: TObject);
|
|
private
|
|
{ private declarations }
|
|
public
|
|
{ public declarations }
|
|
end;
|
|
|
|
var
|
|
Form1: TForm1;
|
|
|
|
implementation
|
|
|
|
{$R asmtestunit.lfm}
|
|
|
|
type
|
|
TFakeProcess = class(TDbgProcess);
|
|
|
|
{ TForm1 }
|
|
|
|
procedure TForm1.Timer1Timer(Sender: TObject);
|
|
var
|
|
idx, n: Integer;
|
|
Line, S: String;
|
|
Code: array[0..28] of Byte;
|
|
CodeIdx, B: Byte;
|
|
Value: Int64;
|
|
e: Integer;
|
|
p: Pointer;
|
|
Process: TFakeProcess;
|
|
Decoder: TX86AsmDecoder;
|
|
begin
|
|
n := txtCode.SelStart;
|
|
if n < 0 then Exit;
|
|
S := Copy(txtCode.Text, 1, n);
|
|
idx := 0;
|
|
for n := 1 to Length(S) do
|
|
begin
|
|
if S[n] = #10 then Inc(idx);
|
|
end;
|
|
Line := txtCode.Lines[idx];
|
|
CodeIdx := 0;
|
|
while (Line <> '') and (CodeIdx < 20) do
|
|
begin
|
|
S := GetPart([], [' ', #9], Line);
|
|
Delete(Line, 1, 1); // strip end ' ' or #9
|
|
if S = '' then Continue;
|
|
B := Min(16, Length(S));
|
|
Val('$' + S, Value, e);
|
|
if e <> 0 then Continue;
|
|
Move(Value, Code[CodeIdx], B div 2);
|
|
Inc(CodeIdx, B div 2);
|
|
end;
|
|
|
|
if CodeIdx > 0
|
|
then begin
|
|
// The disassembler only needs the process mode, so we create a fake instance and set the mode flag
|
|
TObject(Process) := TFakeProcess.NewInstance;
|
|
if chk64Bit.Checked
|
|
then Process.SetMode(dm64)
|
|
else Process.SetMode(dm32);
|
|
|
|
Decoder := TX86AsmDecoder.Create(Process);
|
|
p := @Code;
|
|
Decoder.Disassemble(p, S, Line);
|
|
txtOutput.Text := S + ' '+ Line;
|
|
|
|
Decoder.Free;
|
|
Process.FreeInstance;
|
|
end
|
|
// else txtOutput.Text :='';
|
|
end;
|
|
|
|
end.
|
|
|