const
PCount = 10;
var
aaa: array [0..PCount-1] of Pointer;
for i=0 to PCount-1
aaa[I] := VMP.VMAlloc(4096*3);单个的刚搞明白
asm
mov cl,$01
mov edx,$00003000
mov eax,[VMP]
call TVirtualMemPool.VMAlloc
mov edx,[aaa]
mov ecx,[I]
mov [edx+ech*4],eax
end asm
pushad
mov eax, PCount
push eax
xor edx, edx
pop ecx
@p1:
//mov cl,$01
//mov edx,$00003000
//mov eax,[VMP]
//call TVirtualMemPool.VMAlloc
//mov edx,[aaa]
//mov ecx,[I]
//mov [[aaa]+[I]*4],eax
inc edx
loop @p1
popad
end;
另外如果VMAlloc有2个或三个参数我又应该怎么操作寄存器?我现在理解不了,觉得寄存器不够用,大牛们莫笑啊
PCount = 10;
var
aaa: array [0..PCount-1] of Pointer;
for i=0 to PCount-1
aaa[I] := VMP.VMAlloc(4096*3);单个的刚搞明白
asm
mov cl,$01
mov edx,$00003000
mov eax,[VMP]
call TVirtualMemPool.VMAlloc
mov edx,[aaa]
mov ecx,[I]
mov [edx+ech*4],eax
end asm
pushad
mov eax, PCount
push eax
xor edx, edx
pop ecx
@p1:
//mov cl,$01
//mov edx,$00003000
//mov eax,[VMP]
//call TVirtualMemPool.VMAlloc
//mov edx,[aaa]
//mov ecx,[I]
//mov [[aaa]+[I]*4],eax
inc edx
loop @p1
popad
end;
另外如果VMAlloc有2个或三个参数我又应该怎么操作寄存器?我现在理解不了,觉得寄存器不够用,大牛们莫笑啊
解决方案 »
- 一个关于wm_copydata的问题
- 如何备份整个注册表?
- 谁知道哪里有Delphi下深入Windows核心编程 一书光盘下载
- 100分请教如何用delphi实现类似outlook风格的界面!
- 如何在Delphi中使用、调试OTA
- 本人初学Delphi,有一些问题想问,请各位赏脸进来看看
- 一个小问题耽误了我几天:在SQL2K的表中输入一个公式
- 看一下这句话,给点建议。
- 送分问题,快来呀
- delphi7安装了ehlib 但是软件每次重启后,都要手动加载一下。
- Delphi 如何才能更进一步 本人1年半工作经验
- 想自学delphi7 以前从来没有接触过delphi 没有基础 看什么书籍比较好 ? 请大家推荐些有用的实用的书籍 谢谢
参数传递规则是:参数小于3个时,从左到右分别用EAX,EDX,ECX传递
3个之后,分别压入栈中,顺序从左到右
返回值EAX,如果存在返回值的话
程序不需要保护EAX,EDX,ECX,其他继承器需要保护
mov ecx,[I]
mov [edx+ecx*4],eax @p1:
//mov edx,[aaa]
//mov ecx,[I]
//mov [[aaa]+[I]*4],eax
inc edx //如果这里已经返回eax,下面怎么把返回的eax赋值给数组元素呢? loop @p1
PCount = 10;
var
aaa: array [0..PCount-1] of Pointer;
for i=0 to PCount-1
aaa[I] := VMP.VMAlloc(4096*3);针对这段程序的asm优化
asm
PUSH EDI;
LEA EDI , aaa;
MOV ECX , PCount
@lp1:
PUSH ECX;
MOV EAX , [VMP]
MOV EDX , 4096*3
CALL TVirtualMemPool.VMAlloc
POP ECX;
MOV [EDI + ECX - 4] , EAX;
Loop @lp1;
end;
后面加上
POP EDI
还没睡醒,对不起
改成
MOV [EDI + ECX*4 - 4] , EAX;
SysUtils,
Windows,
uVirtualMemPool in 'uVirtualMemPool.pas';const
AllCount = 100;
PCount = 10;var
VMP: TVirtualMemPool;
aaa: array of Pointer;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
VMP := TVirtualMemPool.Create(AllCount);
try
SetLength(aaa, PCount);
asm
push edi;
lea edi ,aaa
mov ecx ,PCount
xor edx, edx
@lp1:
{
push ecx;
mov eax , [VMP]
mov edx , 4096*3
CALL TVirtualMemPool.VMAlloc
pop ECX;
}
inc edx
mov [edi+edx*4-4],edx
loop @lp1;
pop edi
end;
Readln;
finally
FreeAndNil(VMP);
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
mov edi,[aaa]就可以了,现在又有一个问题了你这个数组元素赋值怎么是倒序的啊?怎么改成正序的?
和
aaa: array [0..PCount-1] of Pointer;
是两个不同的情况前者使用维数时
LEA EDI , aaa;
需要改成
MOV EDI , aaa; ///需要加上这句
push edi;
mov edi,[aaa]
mov ecx,PCount
@lp1:
push ecx;
mov eax,[VMP]
mov edx,4096*3
call TVirtualMemPool.VMAlloc
pop ecx;
mov [edi+ecx*4-4],eax
loop @lp1;
pop edi
end;可以了,怎么改成正序?
改成
MOV [EDI] , EAX;
ADD EDI , 4
能不能推荐几本学asm的书?