delphi10 一段汇编程序  
官方Delphi 学习QQ群: 682628230(三千人)
频道

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:                         // 外側ループ処理開始
    cmp edx,1                  // 外側ループ終了判定
    jb @ret                    // 外側ループ終了判定
    mov esi,1                  // exchange := false
    mov ecx,0                  // for j := 0
    push edi                   // data[0]のアドレス保存
@for2:                         // 内側ループ処理開始
    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以下を実行しない
    mov esi,0                  // exhcnage = true
    mov [edi],ebx              // data[j] := data[j+1]
    mov [edi+4],eax            // data[j+1] := data[j]
@noexchange:                   // 交換終了(無し)
    inc ecx                    // to i-1
    cmp ecx,edx                // 内側ループ終了判定
    je @for2end                // 内側ループ終了判定
    add edi,4                  // dataへのポインタを1つ進める
    jmp @for2                  // 内側ループ繰り返し
@for2end:                      // 内側ループ終了
    pop edi                    // data[0]へ戻す
    dec edx                    // i := i-1
    cmp esi,1                  // if not exchange then
    je @ret                    // break
    jmp @for1                  // 外側ループ繰り返し
@ret:                          // 処理終了
    pop ebx                    // 変更不可レジスタ回復
    pop esi                    // 変更不可レジスタ回復
    pop edi                    // 変更不可レジスタ回復
  end;
end;


我测量处理时间时,数据数量为100,000,
 Pascal = 32.7秒,
 Assembler = 18.6秒

推荐分享
图文皆来源于网络,内容仅做公益性分享,版权归原作者所有,如有侵权请告知删除!
 

Copyright © 2014 DelphiW.com 开发 源码 文档 技巧 All Rights Reserved
晋ICP备14006235号-8 晋公网安备 14108102000087号

执行时间: 0.036985874176025 seconds