Einzelnen Beitrag anzeigen

Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#7

Re: Byte an bestimmter Speicherposition mit Assembler lösche

  Alt 30. Mai 2008, 18:16
Hier mal der Quelltext der ganzen Unit:

Delphi-Quellcode:
unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    BLoeschen: TButton;
    EZahl: TEdit;
    EZahlHex: TEdit;
    EGeloescht: TEdit;
    EGeloeschtHex: TEdit;
    LByte: TLabel;
    EByte: TEdit;
    procedure BLoeschenClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

procedure ByteLoeschen(p: Pointer; Index: Byte);
procedure ByteLoeschen2(p: Pointer; Index: Byte);

var
  Form1: TForm1;

implementation

procedure ByteLoeschen(p: Pointer; Index: Byte); assembler;
asm
  mov EDX, 0FFFFFF00h
  mov CL, BL
  sal Cl, 3 //Linksverschiebung mit Anhängen von Nullen, *2*2*2
  STC //setze Carry-Flag, um kein Bit zu verlieren
  rcl EDX, CL //Rechtsverschuebung mit Anhängen des Carry-Flags, setzt Carry-Flag
  and [EAX], EDX
end;

procedure ByteLoeschen2(p: Pointer; Index: Byte); assembler;
asm
  mov Byte [EAX + EBX], 0
end;

{$R *.dfm}

procedure TForm1.BLoeschenClick(Sender: TObject);
var IntZahl: Integer; ByteNr: Shortint;
begin
  try
    IntZahl:= StrToInt(EZahl.Text);
    ByteNr:= StrToInt(EByte.Text) - 1;
    if((IntZahl < 0) or (ByteNr < 0) or (ByteNr > 3)) then begin
      raise Exception.Create('Ungültiger Wert!');
    end;
    EZahlHex.Text:= IntToHex(IntZahl, 1);
    ByteLoeschen2(@IntZahl, ByteNr);
    EGeloescht.Text:= IntToStr(IntZahl);
    EGeloeschtHex.Text:= IntToHex(IntZahl, 1);
  except
    ShowMessage('Ungültiger Wert!');
  end;
end;

end.
Wenn dadurch klar wird, warum der zweite Parameter auch in EBX liegt, lasst es mich wissen.
  Mit Zitat antworten Zitat