小编Phi*_*hiS的帖子

Delphi标签和asm怪异?

我在Delphi 7中编写了一个asm函数,但它将我的代码转换为其他代码:

function f(x: Cardinal): Cardinal; register;
label err;
asm
  not eax
  mov edx,eax
  shr edx, 1
  and eax, edx
  bsf ecx, eax
  jz  err
  mov eax, 1
  shl eax, cl
  mov edx, eax
  add edx, edx
  or  eax, edx
  ret
  err:
  xor eax, eax
end;

// compiled version
f:
  push ebx       // !!!
  not eax
  mov edx,eax
  shr edx, 1
  and eax, edx
  bsf ecx, eax
  jz  +$0e
  mov eax, 1
  shl eax, cl
  mov edx, eax
  add edx, …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly delphi-7 basm

5
推荐指数
1
解决办法
2345
查看次数

Delphi - 有关记录中方法的RTTI信息

如何在Delphi记录中提取有关方法的RTTI信息?是否可以使用新的Rtti装置?

delphi methods records rtti delphi-2010

5
推荐指数
1
解决办法
968
查看次数

如何在Delphi中调整大小的TImage的整个区域?

我已经将我TImage.Canvas在Delphi 2009中绘制的问题缩小到以下可重现的案例:

鉴于:一种形式,一个TImage,TLabelTButton在其上.它TImage被锚定到所有四个边缘,以便调整窗体大小将调整大小TImage.我希望能够做的是Image1在调整大小后使用可用的最大区域.所以在我的测试用例中,我在Button的OnClick处理程序中有以下代码:


procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:= IntToStr (Image1.Width)+' x '+IntToStr(Image1.Height);
  Image1.Canvas.Pen.Color:= 0;
  Image1.Canvas.Rectangle(0,0,Image1.Width, Image1.Height);
end;
你会看到,如果窗体大小,Image1.Width.Height改变预期,但如果调整的形式是绘制矩形较大比原来的,将是不完整的,只对在那里以前同一区域绘制.

如何使用整个调整大小的区域?

对于它的价值,在我玩过的原始问题中Image1.Stretch,这允许我在调整大小时使用更多区域,但会导致我的图形被扭曲(不需要).如果我也使用Image1.Proportional,那么它会更好,但我仍然无法使用可用的完整区域.Image1.AutoSize似乎也没有对我做任何有用的事情.

任何帮助赞赏.

delphi timage

4
推荐指数
1
解决办法
6527
查看次数

如何确保Delphi例程的16byte代码对齐?

背景:

我有一个优化的Delphi/BASM例程单元,主要用于繁重的计算.其中一些例程包含内部循环,如果循环开始与DQWORD(16字节)边界对齐,我可以实现显着的加速.如果我知道例程入口点的对齐,我可以确保所讨论的循环按照需要对齐.

据我所知,Delphi编译器将过程/函数与DWORD边界对齐,例如向单元添加函数可能会改变后续函数的对齐.但是,只要我将例程的结尾填充到16的倍数,我就可以确保后续例程同样对齐 - 或未对齐,这取决于第一个例程的对齐方式.因此,我尝试将关键例程放在单元实现部分的开头,并在它们之前放置一些填充代码,以便第一个过程与DQWORD对齐.

这看起来如下所示:

interface

procedure FirstProcInUnit;

implementation

procedure __PadFirstProcTo16;
asm
    // variable number of NOP instructions here to get the desired code length
end;

procedure FirstProcInUnit;
asm //should start at DQWORD boundary
    //do something
    //padding to align the following label to DQWORD boundary
    @Some16BAlignedLabel:
        //code, looping back to @Some16BAlignedLabel
    //do something else
    ret #params
    //padding to get code length to multiple of 16
end;

initialization

__PadFirstProcTo16; //call this here so that it isn't optimised out
ASSERT ((NativeUInt(Pointer(@FirstProcInUnit)) …
Run Code Online (Sandbox Code Playgroud)

delphi memory-alignment

4
推荐指数
2
解决办法
1508
查看次数

Delphi汇编调用

我一直在玩IDA中的一些Delphi程序集.

我注意到很多我不理解的系统调用,并且无法找到有关它们的任何文档.例如:我注意到很多对未知函数LStrClr(void*)的调用.

我能找到的最好的是这个网站http://www.delphibasics.co.uk/ByLetter.asp?Letter=A 但它缺少很多函数调用,包括LStrClr.

非常感谢您的回复,Michael Engstler.

delphi assembly reverse-engineering system-calls basm

4
推荐指数
1
解决办法
1669
查看次数

程序集调用FreePascal x64上的系统单元功能

我有一些Delphi /汇编代码为Win32,Win64和OSX 32编译和工作正常(XE2).但是,因为我需要它在Linux上工作,我一直在寻找它的FPC版本(到目前为止,Win32)/64,Linux32/64).

总的来说,它运行良好,但我无法工作的一件事是调用/跳转到Delphi System单元函数,如:

  jmp System.@FillChar
Run Code Online (Sandbox Code Playgroud)

这似乎对FPC的Win32/linux32镜像预期的效果,但无法与异常上FPC Win64的/ LINUX64.(我非常熟悉平台之间的调用约定差异,所以不要认为这就是原因.)

在FPC for x64平台上执行此操作的正确方法是什么?

[编辑1] ---回应大卫的评论,这是一个简化的程序,说明了问题(至少我希望它准确地说):

program fpcx64example;
{$IFDEF FPC}
  {$MODE DELPHI}
  {$ASMMODE INTEL}
{$ELSE}
  {$APPTYPE CONSOLE}
{$ENDIF}

procedure FillMemCall (p: pointer; len: longword; val: byte);
asm
  // this function and the System function have the same parameters
  // in the same order -- they are already in their proper places here
  jmp System.@FillChar
end;

function MakeString (c: AnsiChar; len: longword): AnsiString;
begin
  Setlength (Result, len); …
Run Code Online (Sandbox Code Playgroud)

delphi 64-bit assembly freepascal basm

4
推荐指数
1
解决办法
1320
查看次数

ASM /德尔福 - 分裂

我试图划分两个数字50和5.这是我的代码:

function Divide(Num1, Num2: Integer): Integer;
asm
  MOV   EAX, Num1
  CDQ
  MOV   ECX, Num2
  IDIV  ECX
  MOV   @RESULT, ECX
end;
Run Code Online (Sandbox Code Playgroud)

DivisionByZeroException在Delphi中给了我一个例外.有人能告诉我我做错了什么吗?

delphi assembly divide basm

4
推荐指数
2
解决办法
718
查看次数

如何用SSE2优化这个Delphi功能?

我需要一个提示,如何使用SSE2程序集(32位)实现这个Delphi函数.其他优化也是受欢迎的.也许有人可以告诉我,可以使用什么样的指令,所以我有一个进一步阅读的起点.

实际:

const Precision = 10000;

// This function adds all Pixels into one. The pixels are weighted before adding. 
// A weight can range from 0 to "Precision". "Size" is typically 10 to 50.

function TFilter.Combine(Pixels: PByte; Weights: PCardinal; const Size: Cardinal): Cardinal;
var
  i, R, G, B, A: Cardinal;
begin
  B := Pixels^ * Weights^; Inc(Pixels);
  G := Pixels^ * Weights^; Inc(Pixels);
  R := Pixels^ * Weights^; Inc(Pixels);
  A := Pixels^ * Weights^; Inc(Pixels);
  Inc(Weights); // goto next …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly sse2 basm

3
推荐指数
1
解决办法
1505
查看次数

将此汇编代码移植到x64时,为什么会出现访问冲突?

我正在使用这个组件http://sourceforge.net/projects/tponguard/现在我需要在64位编译.我被困在这个集会中.

就像这样:

  push esi
  push edi

  mov  esi, eax         //esi = Mem1
  mov  edi, edx         //edi = Mem2

  push ecx              //save byte count
  shr  ecx, 2           //convert to dwords
  jz   @Continue

  cld
@Loop1:                 //xor dwords at a time
  mov  eax, [edi]
  xor  [esi], eax
  add  esi, 4
  add  edi, 4
  dec  ecx
  jnz  @Loop1

@Continue:              //handle remaining bytes (3 or less)
  pop  ecx
  and  ecx, 3
  jz   @Done

@Loop2:                 //xor remaining bytes
  mov  al, [edi]
  xor  [esi], al …
Run Code Online (Sandbox Code Playgroud)

delphi 64-bit assembly access-violation basm

3
推荐指数
1
解决办法
510
查看次数

Delphi内联汇编程序和类属性

我试图在汇编程序(XE3)中重写TList.IndexOf方法.这是我的代码

function TFastList.IndexOfAsm(Item: Pointer): Integer;
{var
  P: PPointer;
begin
  P := Pointer(FList);
  for Result := 0 to FCount - 1 do
  begin
    if P^ = Item then
      Exit;
    Inc(P);
  end;
  Result := -1;}
var
  FCnt, rslt: Integer;
  FData: Pointer;
begin
  FCnt := Count;
  FData := List;
asm
  push edi

  mov ecx, FCnt
  mov edi, FData
  mov eax, Item
  repne scasd

  mov eax, FCnt
  sub eax, ecx
  dec eax
  mov rslt, eax

  pop edi
end;
  Result := rslt;
end;
Run Code Online (Sandbox Code Playgroud)

当然我想直接使用Count或List这样的属性.我理解为什么编译器拒绝提供对私有字段FCount和FList的访问,但是如何访问相应的属性?Count,Self.Count和[eax] .Count都给出了内联汇编程序错误. …

delphi assembly properties basm

3
推荐指数
1
解决办法
677
查看次数

Delphi的C代码(用逗号运算符)

在C中,以下等效的Delphi代码是什么:

int32 *P;
int32 c0, c1, i, t;
uint8 *X;

t = P[i], c0 = X[t], c1 = X[t + 1];
Run Code Online (Sandbox Code Playgroud)

坦率地说,逗号操作员让我感到困惑.以下是非常错误的吗?

{$POINTERMATH ON}
var P: ^Int32; c0, c1, i, t: Int32; X: ^UInt8;

t:= P[i];   //<--?
c0:= X[t];
c1:= X[t+1];
t:= c1;     //<--?
Run Code Online (Sandbox Code Playgroud)

c delphi comma

2
推荐指数
1
解决办法
196
查看次数

在Delphi中将函数变量存储在ASM函数中

如何正确存储n以下功能?因为n在我使用它之后由于某种原因改变了价值.

function Test(n: Integer): Byte;
asm
  mov eax, n
  add eax, eax
  add eax, n
  mov ecx, eax
  mov ebx, eax
  mov ecx, n
end;
Run Code Online (Sandbox Code Playgroud)

delphi assembly basm

1
推荐指数
1
解决办法
592
查看次数

Delphi XE3中的64位内联汇编

我在Delphi XE3中使用64位内联汇编程序遇到了这个问题,我不明白.

我试过这个,它适用于32位和64位

function test(a, b: integer): integer; assembler; register;
asm
  mov eax, a
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于32位而不是64位,在64位编译时,但没有返回两个整数之和的正确结果.

function test(a, b: integer): integer; assembler; register;
asm
  add eax, edx
end;
Run Code Online (Sandbox Code Playgroud)

我知道以前的FPU代码如FLD,STP工作在32位但它会在64位编译器上产生编译错误.知道如何处理64位浮点数吗?

delphi 64-bit assembly x86-64 basm

0
推荐指数
1
解决办法
1444
查看次数