Delphi10 一段汇编程序


本文整理自网络,侵删。

 
介绍
我试图查看汇编程序是否仍可以与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定时器相关的简单例子

Delphi中tinifile类 操作ini文件

Delphi获取当前计算机所有盘符

Delphi写文本文件

Delphi获取系统当前进程名和进程id

Delphi 随机生成汉字

Delphi xe5 android得到手机的手机号码

Delphi程序的exe和dll文件添加版本信息

Delphi label1 自动尺寸

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



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...