Delphi10 一段汇编程序

2022-12-28 10:51:59 作者:admin

本文整理自网络,侵删。

 介绍我试图查看汇编程序是否仍可以与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秒

相关阅读 >>

Delphi filesearch 获取指定文件夹下所有文件包括隐藏文件

Delphi 防止程序重复执行的单元

Delphi webservices传base64字串

Delphi 禁止改变窗口大小和移动窗口

Delphi 通过按键 esc 关闭程序

Delphi 查找某函数在某个单元

Delphi 用代码实现为程序创建快捷方式的二种方法

Delphi 动态设置屏幕分辨率

Delphi 如何获取进程的全路径名

elphi中取出字符串中指定位置的几个字符

更多相关阅读请进入《Delphi》频道 >>



在线咨询 拨打电话