如何使用Delphi 2007检查盒子是否支持AVX.
我的问题仅限于查询CPU中的支持(假设操作系统正常/带有SP1的Windows 7).
由Chris Lomont 撰写的题为"英特尔®高级矢量扩展简介 "的PDF文档解释了如何执行此操作,并提供了一个示例代码实现,但在c ++中.
它也可以在这个页面上找到.
我正在使用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) 假设我想从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位地址操作码而不是长?
我有个问题.我遵循用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)
我从未在汇编中编程,有没有人知道端口是什么或我将如何改变它.
我正在研究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记录中提取有关方法的RTTI信息?是否可以使用新的Rtti装置?
我在组装(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项目在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) 我有一些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 XE或XE2下使用非常快速的Intel POPCNT指令在16/32/64位字内实现1位计数?是否存在可直接访问此指令的库例程?有人可以写一个演示asm部分来说明它的使用吗?最后,64位Delphi有哪些选项(没有可用的asm)?提前谢谢
delphi ×10
basm ×9
assembly ×8
delphi-xe2 ×2
x86-64 ×2
64-bit ×1
avx ×1
delphi-2007 ×1
delphi-2010 ×1
delphi-xe ×1
delphi-xe3 ×1
methods ×1
records ×1
rtti ×1
x86 ×1