日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

delphi与汇编

發布時間:2025/3/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 delphi与汇编 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我一直認為Delphi功能與C++相比毫不遜色,提供了豐富的控件和類、全部API以及嵌入的匯編。最近小弟在把C版的Huffman壓縮改用Delphi寫時,順便“研究”了一下Delphi的位操作和嵌入式匯編,利用嵌入匯編我們可以得到高效的程序代碼,完成一些Delphi沒有提供的底層功能。借貴報一方寶地與大家分享我的“研究”。
  Delphi的位操作
  每個學習C的朋友都會被告之C是“中級語言”,其位操作非常方便,而Pascal之流只適用于教學。但是Delphi中提供了一組位操作,可別以過去對Pascal的態度看Delphi。
  * 按位的邏輯操作:
  Delphi中的AND、OR、NOT可不僅僅只對邏輯表達式有作用,它們還可以操作數;
  AND:按位與,如:1 AND 2其結果為0
  OR:按位或,如:1 OR 2其結果為3
  Not:按位取反:如Not 1其結果對于有符號數是-2,對于無符號數是65534
  另外,還有按位異或XOR:如:1 XOR 2結果為3
  * 移位操作
  Delphi提供了SHL和SHR進行移位左移和右移:
  例如:2 SHR1表示2按位右移一位結果為1。
  * Delphi中的數
  既然有位的操作就一定涉及到數的類型:是有符號數(頭一位用0和1表示正負)還是無符號數。
  Delphi中:Shortint(8位)、Smallint(16位)、Longint(32位)、Integer(32位)、Int64(64位)是有符號數;而Byte(8位)、Word(16位)、Longword(32位)是無符號數。它們之間可以像C一樣強制轉換。例如:Smallint類型的-1轉換成Word類型就是65535。轉換方法是Word(-1)。
  怎樣,夠全吧^_^!什么還不夠……!?Delphi還有一招,接招吧……
  Delphi的嵌入式匯編
  Delphi中提供了幾乎全部常用匯編指令的支持:MOV、JE、JMP、CMP、SHL、SHR、SAL、SAR、POP、PUSH、HLT……自己去查吧。至于INT也能識別,不過非法操作或死機可別找我(在最早的Windows95中用Delphi 3似乎可以正確運行中斷,但Windows 95 OEM、Windows 98就不對了,大概是16位模塊的問題,還搞不清楚)。
  * 嵌入式匯編的格式
  Delphi是使用ASM……END來標志匯編語句
   如:ASM
   mov al,1
   mov bl,al
   END;
  * 可操作的寄存器
  Delphi可用匯編管理以下寄存器:
  32位寄存器EAX EBX ECX EDX ESP EBP ESI EDI
  16位寄存器AX BX CX DX SP BP SI DI
  8位寄存器AL BL CL DL AH BH CH DH
   16位段寄存器CS DS SS ES
  以及協處理器寄存器堆棧 ST
  * 使用匯編前的工作
  教匯編的老師一再強調使用匯編要保存寄存器現場(保存使用前的寄存器狀態,使用Push壓棧和Pop從棧中彈出),不過這一切對于Delphi的嵌入式匯編是沒有必要的(除非你自己要使用Push和Pop),因為Delphi已經幫你做了,不必擔心會使數據丟掉。
  * Delphi嵌入式匯編的使用方式
  1.在一般函數過程中使用匯編
  匯編程序段可以嵌套于其它過程中:如:
  procedure TForm1.Button1Click(Sender: TObject);
  var i:smallint;
  begin
   i:=1;
   asm
   mov ax,i
   sal ax,1
   mov &i,ax
   end;
   showmessage(inttostr(i));
  end;
  這個程序段是把16位的變量I進行左移,然后把結果用Mov &I,ax語句放入I變量所在地址返回值。最后顯示I 的值是2。
  2.獨立的匯編程序段
  匯編程序段也可以單獨寫成函數或過程。這就涉及到參數的傳遞與結果的返回。首先Delphi對于函數的返回有一個約定:
  即:整型數據:8位的用AL返回,16位的用AX返回,32位的用EAX返回;
  實型:用ST(0)返回
  指針:用EAX返回
  長字符串:用EAX返回其所在地址
  變量:可用@Result返回
  例如:一個用匯編的求和函數
  function _Sum(X, Y: Integer): Integer;
   asm
  MOV EAX,X //把32位的數放入EAX
  ADD EAX,Y //進行加法運算
  MOV @Result,EAX //返回X+Y
   end;
  一個把字符轉化為大寫的函數例子
  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語句,但是這種函數不能是類的成員,否則結果會出錯。
  3.在匯編中調用其它過程
  匯編語句中的Call語句,可以用于調用其它過程,既可以是其它匯編程序段也可以是Delphi中的標準過程:
  例如:假設新建一個窗體并在上面加了一個按鈕,在Click事件中寫入以下代碼
  procedure TForm1.Button1Click(Sender: TObject);
  begin
   showmessage(`ok');
  end;
  再寫一個過程_X
  function TForm1._x(var i:smallint):integer;
  asm
   call button1click
  end;
  執行_x的結果就可以顯示消息框。
  * 匯編的調試
  編好了程序,沒錯,還好,如果有錯,就得用到調試工具:如變量的跟蹤、斷點、堆棧查看……對于匯編還可以用View菜單的Debug Windows的CPU窗口跟蹤。
  OK!就談到這,希望對使用Delphi的朋友有點幫助。

總結

以上是生活随笔為你收集整理的delphi与汇编的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。