本文整理自网络,侵删。
介绍我试图查看汇编程序是否仍可以与Delphi 10一起使用。我没有精力去写复杂的东西,所以我尝试用冒泡排序作弊,这是我在学生时代学到的第一个算法。假定要排序的数据已经设置在数据:整数数组[0..DATACOUNT]中。DATACOUNT是一个常数。
Pascal :procedure TForm1.bubble;var i,j,v : integer; exchange : boolean;begin for i := DATACOUNT downto 1 do begin exchange := false; for j := 0 to i-1 do begin if data[j] > data[j+1] then begin exchange := True; v := data[j]; data[j] := data[j+1]; data[j+1] := v; end; end; if not exchange then break; end;end;
汇编:procedure TForm1.bubble_asm;begin asm push edi // ?涓?不可レジスタ退避 push esi // ?涓?不可レジスタ退避 push ebx // ?涓?不可レジスタ退避 lea edi,[eax].TForm1.data // data[0]のアドレス mov edx,DATACOUNT // for i := DATACOUNT@for1: // 外?去氅`プ?I理?_始 cmp edx,1 // 外?去氅`プ?K了判定 jb @ret // 外?去氅`プ?K了判定 mov esi,1 // exchange := false mov ecx,0 // for j := 0 push edi // data[0]のアドレス保存@for2: // 内?去氅`プ?I理?_始 mov eax,[edi] // data[j] mov ebx,[edi+4] // data[j+1] integer=4byte cmp eax,ebx // if data[j] > data[j+1] jbe @noexchange // data[j] <= data[j+1]ならthen以下を?g行しない mov esi,0 // exhcnage = true mov [edi],ebx // data[j] := data[j+1] mov [edi+4],eax // data[j+1] := data[j]@noexchange: // 交?Q?K了(?oし) inc ecx // to i-1 cmp ecx,edx // 内?去氅`プ?K了判定 je @for2end // 内?去氅`プ?K了判定 add edi,4 // dataへのポインタを1つ?Mめる jmp @for2 // 内?去氅`プ?Rり返し@for2end: // 内?去氅`プ?K了 pop edi // data[0]へ??す dec edx // i := i-1 cmp esi,1 // if not exchange then je @ret // break jmp @for1 // 外?去氅`プ?Rり返し@ret: // ?I理?K了 pop ebx // ?涓?不可レジスタ回?? pop esi // ?涓?不可レジスタ回?? pop edi // ?涓?不可レジスタ回?? end;end;
我测量处理时间时,数据数量为100,000, Pascal = 32.7秒, Assembler = 18.6秒
相关阅读 >>
winapi 字符及字符串函数(5): ischaralpha - 是否是个字母
更多相关阅读请进入《Delphi》频道 >>