熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Delphi編程 >> 正文

Delphi的位操作以及嵌入式匯編[3]

2022-06-13   來源: Delphi編程 

  一個把字符轉化為大寫的函數例子

function _UpCase( ch : Char ) : Char;

  asm

   CMP AL`a

   JB @@exit

   CMP AL`z

   JA @@exit

   SUB AL`a -`A

  @@exit:

  end;

  值得注意的是第二個例子中沒有象第一個那樣把參數用語句放到寄存器中這是由於Delphi中默認的把Byte(Char)類型放在AL中不需要用Mov語句但是這種函數不能是類的成員否則結果會出錯

  .在匯編中調用其它過程

  匯編語句中的Call語句可以用於調用其它過程既可以是其它匯編程序段也可以是Delphi中的標准過程

  例如假設新建一個窗體並在上面加了一個按鈕在Click事件中寫入以下代碼

procedure TFormButtonClick(Sender: TObject);

  begin

   showmessage(`ok);

  end;

  再寫一個過程_X

 function TForm_x(var i:smallint):integer;

  asm

   call buttonclick

  end;

  執行_x的結果就可以顯示消息框

  * 匯編的調試

  Delphi嵌入式匯編一例

  用delphi寫的程序把x指針指向的個字節次序顛倒過來

function toulong(x: pchar): longword;
begin
  result := (longword(x^) shl ) or
    (longword((x + )^) shl ) or
    (longword((x + )^) shl ) or
    (longword((x + )^));
end;

  以下是用delphi的嵌入式匯編寫法

function toulong(x: pchar): longword;
asm
  mov esieax
  mov ax[esi]
  xchg ahal
  shl eax
  mov ax[esi+]
  xchg ahal
end;

  說明默認情況下delphi使用register方式若參數在個已內將分別使用eaxedx和ecx超過個參數部分將使用堆棧返回參數的
存放視長度而定例如位用al返回位用ax位用eax位用用兩個位寄存器edx:eax其中eax是低位

  效率本例asm大約比delphi或c快%

[]  []  []  


From:http://tw.wingwit.com/Article/program/Delphi/201311/24899.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.