打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Delphi内嵌ASM简易教程 txt
Delphi内嵌ASM简易教程
关键词 Delphi ASM 嵌入汇编
 前言
   Delphi作为一个快速高效的开发平台使用的人越来越多但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多.因为这方面的资料太少了.
另一方面它还需要有基本的汇编语言知识关於汇编语言的教程那实在太多了如果你对汇编语言不熟的话建议你下载相交的教程先读读。
因此本文假定您已经熟悉了汇编语言。 注:下文中的函数与过程统称为函数。
 一如何在Delphi程序中增加一段汇编代码
 很简单用asm...end把你的汇编代码封装起来再把它放到你需要它的位置这个需要它的位置可以是函数的begin与end之间
也可以是Program的begin与end之间当然好可以是initialization与end之间或finalization与end之间一句话任何可以放Delphi执行代码的地方。
 范例
对变量X实现逻辑循环右移8位它告诉您如何在过程程中插入一段asm代码。
 procedure TForm1.Button1ClickSender: TObject
 var
X:DWORD
begin
 X:FF000000
ShowMessageFormat移位前: .8XX
asm
MOV EAX X
ROR EAX 8
MOV X EAX
 end
ShowMessageFormat移位后: .8XX
 end
怎麽样是不是很简单
 二如何在汇编代码中调用函数
 首先需要讲一下函数的调用方式。
 在Delphi中函数的调用方式有五种分别是registerpascalcdeclstdcall以及safecall最常用的是register及stdcall方式如何区别这五种方式它们之间依据三个方面来区分
第一是参数传递顺序Parameter Order
第二是堆栈清除方Clean-up
第三是是否以寄存器来传递参数Passes parameters in registers您可以在Delphi Help中找到相关资料。
 Delphi中默认的参数传递方式是register即不加方式声明的情况下都是register方式register方式的参数传递顺序是从左到右由被调用者来清除堆栈并且使用寄存器来传递参数。
如何使用寄存器来传递参数呢第一个参数使用EAX第二个参数使用EDX第三个参数使用ECX第四个及以后的参数使用堆栈来传递并且这些使用堆栈的参数是从左到右入栈的。
 stdcall是Windows的默认参数传递方式它不使用寄存器来传递参数这种方式下参数的传递顺序是从右到左即最后一个参数第一个入栈依次向前按倒序入栈。
 范例用asm代码调用MessageBox函数它告诉您如何在asm中调用stdcall方式的函数。
 procedure TForm1.Button2ClickSender: TObject
var
 szTitle:string
 szCaption:string
 begin
 szTitle:您好
 szCaption:这是一个在内嵌汇编中调用stdcall类型函数的例子.
 asm
 PUSH MB_OKMB_ICONINFORMATION
PUSH szTitle
PUSH szCaption
PUSH 0
CALL MessageBox
 end
 end
先来看看MessageBox函数的声明
 function MessageBoxhWnd: HWND lpText lpCaption: PChar uType: UINT: Integer stdcall
这个函数的调用方式是stdcall参数必须从右到左入栈
所以我们先将uType参数入栈范例中该参数的值是MB_OKMB_ICONINFORMATION即PUSH MB_OKMB_ICONINFORMATION
然后再将lpCaptionlpTexthWnd依次入栈最后才使用CALL指令调用MessageBox函数。
 范例用asm代码调用register方式的函数StrLen的声明为
function StrLenconst Str: PChar: Cardinal 它的调用方式是默认的register方式
 procedure TForm1.Button3ClickSender: TObject
var
 Str:PChar;
 iLen:Integer
begin
Str:abcdefghijklm
asm
MOV EAX Str //用EAX传递第一个参数
 CALL StrLen
 MOV iLen EAX
end
ShowMessage IntToStriLen
end
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C/C++函数调用约定
论函数调用约定
DLL中调用约定和名称修饰(一)
C语言函数调用栈(二)
C编程语言函数调用的注意事项--.net编程网 - (中国.net社区) DOTNETSZ...
汇编调用C函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服