打开APP
未登录
开通VIP,畅享免费电子书等14项超值服
开通VIP
首页
好书
留言交流
下载APP
联系客服
Delphi内嵌ASM简易教程 txt
quasiceo
>《待分类1》
2013.12.10
关注
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功能使用有故障,
可点击这里联系客服!
联系客服
微信登录中...
请勿关闭此页面
先别划走!
送你5元优惠券,购买VIP限时立减!
5
元
优惠券
优惠券还有
10:00
过期
马上使用
×