16,748
社区成员
发帖
与我相关
我的任务
分享
const
AllCount=10000000; //总的数据量
One_tenth=1000000; //十分之一
//定义全局变量
var
tmpData:pdword;
DataCount:dword; //每次清除后剩余的数据量
Data:array of dword; //存贮数据的数组
Clsed:array of dword; //存贮被清除的连续数的第一个数
ClsCnt:dword; //被清除的连续数的组数
//下面是8个功能函数:
procedure initData; //分配内存,初始化数组
asm
pushad ; EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI全部压栈
mov eax,AllCount ; EAX = AllCount(即1亿)
mov DataCount,eax ; DataCount = EAX, 跟上面合起来 DataCount = AllCount
push eax ; EAX压栈(1亿的值)
shl eax,2 ; EAX左移两位, 即1亿 = 0x0098 9680 << 2 = 4亿.
call sysgetmem ; EAX为第一参数呼叫系统内存分配函数, 返回地址值在EAX
mov Data,eax ; Data被分配给指向4亿个BYTE的空间,共计即Data[10000000]
xor edx,edx ; 清空EDX
pop ecx ; ECX为EAX之前的压栈值, 1亿
@p1:
inc edx ; EDX++(从0开始)
mov [eax],edx ; *Data = EDX
add eax,4 ; Data地址移拉下一个, 即@DWORD[0] 变成@DWORD[4]
loop @p1 ; 循环1亿次, 即Data[]按顺序写入1~1亿的值
mov eax,allCount ; EAX = 1亿
shl eax,2 ; EAX = 4亿
call sysgetmem ; 分配4亿个BYTE
mov tmpData,eax ; tmpData = tmpData[10000000]
mov edx,eax ; EDX = tmpData
mov eax,Data ; Data地址赋值到EAX
mov ecx,allcount ; ECX = 1亿
shl ecx,2 ; ECX = 4亿
call move ; Move(const Source;var Dest; Count: Integer); 即Move(Data, tmpData, 4亿)
mov eax,allCount ; EAX = 1亿
shl eax,1 ; EAX = 2亿
call sysgetmem ; 分配2亿个BYTE的空间
mov Clsed,eax ; Clsed = DWORD[2亿/4];(2亿个BYTE)
popad ; EAX,ECX,EDX,EBX,ESP,EBP,ESI和EDI全部压栈
end;
Data = Getmem(AllCount * 4);
for(i=0 to AllCount - 1)
Data[i] = i + 1;
tmpData = Getmem(AllCount * 4);
Move(Data, tmpData, AllCount * 4);
Clsed = Getmem( AllCount div 2);