小编Phi*_*hiS的帖子

如何探究英特尔®高级矢量扩展的可用性?

如何使用Delphi 2007检查盒子是否支持AVX.

我的问题仅限于查询CPU中的支持(假设操作系统正常/带有SP1的Windows 7).

由Chris Lomont 撰写的题为"英特尔®高级矢量扩展简介 "的PDF文档解释了如何执行此操作,并提供了一个示例代码实现,但在c ++中.

它也可以在这个页面上找到.

delphi delphi-2007 avx basm

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

德尔福装配块中的异常行为

我正在使用Delphi的内联汇编遇到一些奇怪的行为,正如这个非常简短的程序所示:

program test;

{$APPTYPE CONSOLE}

uses
    SysUtils;

type
    TAsdf = class
    public
        int: Integer;
    end;

    TBlah = class
    public
        asdf: TAsdf;

        constructor Create(a: TAsdf);

        procedure Test;
    end;

constructor TBlah.Create(a: TAsdf);
begin
    asdf := a;
end;

procedure TBlah.Test;
begin
    asm
        mov eax, [asdf]
    end;
end;

var
    asdf: TAsdf;
    blah: TBlah;

begin
    asdf := TAsdf.Create;

    blah := TBlah.Create(asdf);

    blah.Test;

    readln;
end.
Run Code Online (Sandbox Code Playgroud)

这只是举例的缘故(mov荷兰国际集团[asdf]eax没有做太多,但它工作的例子).如果你看看这个程序的程序集,你会看到

mov eax, [asdf]
Run Code Online (Sandbox Code Playgroud)

已经变成了

mov eax, ds:[4]
Run Code Online (Sandbox Code Playgroud)

(由OllyDbg代表)显然崩溃了.但是,如果你这样做:

var
    temp: TAsdf;
begin
    temp := …
Run Code Online (Sandbox Code Playgroud)

delphi assembly instance-variables basm

6
推荐指数
2
解决办法
416
查看次数

如何从delphi XE2中的绝对地址读取数据

假设我想从gs:$3064位模式的绝对地址读取,所以asm代码看起来像:

asm
  mov   rax, gs:[$30]
end;
Run Code Online (Sandbox Code Playgroud)

...和编译器将此代码翻译为......

  65 48 8B 05 30 00 00 00       mov rax,gs:[rel $00000030]
Run Code Online (Sandbox Code Playgroud)

但我不想使用相对地址(rip + $30).我希望编译器使用绝对地址并以这种方式编译:

  65 48 8B 04 25 30 00 00 00    mov rax,gs:[+$0030]
Run Code Online (Sandbox Code Playgroud)

(如果我使用gs:前缀,它是一样的!)

我该怎么做呢?

编辑:

我知道解决方法.我问是否存在任何命令告诉编译器将位置称为绝对而非相对.

编辑

到现在为止还挺好... :)

drhirsch帮我找到了命令,现在编译器翻译:

mov   rax, gs:[abs qword ptr $30]
or
mov   rax, gs:[abs $30]
Run Code Online (Sandbox Code Playgroud)

对此:

6548A13000000000000000 mov rax,[qword $0000000000000030]
Run Code Online (Sandbox Code Playgroud)

这几乎是好的:)因为我想要短的32位操作码(看上面的操作码)更长的64位操作码.

有没有办法告诉编译器使用短32位地址操作码而不是长?

delphi assembly x86-64 delphi-xe2 basm

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

将Assembler x86 CPU ID代码移植到AMD64

我有个问题.我遵循用ASM编写的x86 delphi代码.我需要将它移植到AMD64吗?

type
 TCPUID = array[1..4] of Longint;

function GetCID : TCPUID; assembler; register;
asm
  push  ebx
  push  edi
  mov   edi, eax
  mov   eax, 1
  dw    $A20F
  stosd
  mov   eax, ebx
  stosd
  mov   eax, ecx
  stosd
  mov   eax, edx
  stosd
  pop   edi
  pop   ebx
end;
Run Code Online (Sandbox Code Playgroud)

我从未在汇编中编程,有没有人知道端口是什么或我将如何改变它.

delphi assembly x86-64 basm delphi-xe3

6
推荐指数
2
解决办法
2128
查看次数

如何获取内部System.pas函数的地址?

我正在研究JIT编译器,并试图找出如何为托管类型(如字符串)输出正确的清理块.

对于具有一个类型的局部变量的函数,清理块的反汇编string如下所示:

0044333C 648910           mov fs:[eax],edx
0044333F 6854334400       push $00443354
00443344 8D45FC           lea eax,[ebp-$04]
00443347 E81834FCFF       call @UStrClr
0044334C C3               ret 
0044334D E9062BFCFF       jmp @HandleFinally
00443352 EBF0             jmp $00443344
Run Code Online (Sandbox Code Playgroud)

不幸的是,我没有什么好办法来获得的地址,@UStrClr@HandleFinally让我的抖动插入.它们在System.Pas中声明为_UStrClr_HandleFinally,在接口部分,但显然有一些"魔术"正在进行,因为尝试使用这些标识符会导致编译器错误.

所以我尝试了一个ASM例程,在那里我声明了一个全局指针并说mov func_ustr_clear, @UStrClear.这次我没有得到未声明的标识符错误; 我得到一些更奇怪的东西:

[DCC Error]: E2107 Operand size mismatch
Run Code Online (Sandbox Code Playgroud)

所以有人知道如何做到这一点吗?

delphi assembly basm

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

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

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

delphi methods records rtti delphi-2010

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

Delphi +汇编数组访问

我在组装(delphi)中访问数组元素时遇到问题.

代码是:

procedure TMaskBit.AllocBuffer;
begin
     SetLength(DataIn, 6);  //array of integer
     DataIn[0] := 1 ;
     DataIn[1] := 2 ;
     DataIn[2] := 3 ;
     DataIn[3] := 4 ;
     DataIn[4] :=5 ;
     DataIn[5] := 6 ;
end;

procedure TMaskBit.SetValue();
asm
   lea edx, [eax].TMaskBit.DataIn     //indice
   mov ecx, [edx+8]                  //second ement
   mov [EAX].TMaskBit.Z, ecx
end;
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?

谢谢!

delphi assembly basm

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

将德尔福风格的ASM翻译成英文?

我继承的最近的Delphi项目在ASM中有一个过程.我是一个完整的ASM新手,所以我不明白.我已经阅读了各种ASM指令,试图解读程序流程,但我仍然没有得到它.

有ASM经验的人可以帮助我理解并将以下程序翻译成英语(然后我可以翻译成Delphi,以便将来更容易阅读代码!!!)

Mem1的声明是Byte的数组[0..15]; .而内存2是LONGINT.

这是程序:

 procedure TForm1.XorMem(var Mem1; const Mem2; Count : Cardinal); register;
 begin
 asm
   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 …
Run Code Online (Sandbox Code Playgroud)

delphi x86 assembly basm

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

Delphi/ASM代码与64bit不兼容?

我有一些OpenGL的示例源代码,我想编译64位版本(使用Delphi XE2)但是有一些ASM代码无法编译,我对ASM一无所知.这是下面的代码,我将两条错误消息放在失败的行上......

// Copy a pixel from source to dest and Swap the RGB color values
procedure CopySwapPixel(const Source, Destination: Pointer);
asm
  push ebx //[DCC Error]: E2116 Invalid combination of opcode and operands
  mov bl,[eax+0]
  mov bh,[eax+1]
  mov [edx+2],bl
  mov [edx+1],bh
  mov bl,[eax+2]
  mov bh,[eax+3]
  mov [edx+0],bl
  mov [edx+3],bh
  pop ebx //[DCC Error]: E2116 Invalid combination of opcode and operands
end;
Run Code Online (Sandbox Code Playgroud)

delphi 64-bit assembly delphi-xe2 basm

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

POPCNT在Delphi XE/XE2 64bit中

如何在Delphi XE或XE2下使用非常快速的Intel POPCNT指令在16/32/64位字内实现1位计数?是否存在可直接访问此指令的库例程?有人可以写一个演示asm部分来说明它的使用吗?最后,64位Delphi有哪些选项(没有可用的asm)?提前谢谢

delphi assembly delphi-xe basm

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