我在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记录中提取有关方法的RTTI信息?是否可以使用新的Rtti装置?
我已经将我TImage.Canvas在Delphi 2009中绘制的问题缩小到以下可重现的案例:
鉴于:一种形式,一个TImage,TLabel并TButton在其上.它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/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) 我一直在玩IDA中的一些Delphi程序集.
我注意到很多我不理解的系统调用,并且无法找到有关它们的任何文档.例如:我注意到很多对未知函数LStrClr(void*)的调用.
我能找到的最好的是这个网站http://www.delphibasics.co.uk/ByLetter.asp?Letter=A 但它缺少很多函数调用,包括LStrClr.
非常感谢您的回复,Michael Engstler.
我有一些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) 我试图划分两个数字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中给了我一个例外.有人能告诉我我做错了什么吗?
我需要一个提示,如何使用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) 我正在使用这个组件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) 我试图在汇编程序(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都给出了内联汇编程序错误. …
在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) 如何正确存储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 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 ×13
assembly ×9
basm ×9
64-bit ×3
x86 ×2
c ×1
comma ×1
delphi-2010 ×1
delphi-7 ×1
divide ×1
freepascal ×1
methods ×1
properties ×1
records ×1
rtti ×1
sse2 ×1
system-calls ×1
timage ×1
x86-64 ×1