Delphi代码中嵌入ASM代码
前言
Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的教程,那实在太多了,如果你对汇编语言不熟的话,建议你下载相交的教程先读读。因此,本文假定您已经熟悉了汇编语言。
(注,下文中的函数与过程统称为函数。)
一.如何在Delphi程序中增加一段汇编代码?
很简单,用asm...end把你的汇编代码封装起来,再把它放到你需要它的位置.这个需要它的位置可以是函数的begin与end之间,也可以是Program的begin与end之间,当然,好可以是initialization与end之间或finalization与end之间,一句话,任何可以放Delphi执行代码的地方。
范例1:对变量X实现逻辑循环右移8位,它告诉您如何在过程程中插入一段asm代码。
procedure Tform1.Button1Click(Sender: TObject);
var
X:DWORD;
begin
X:=$FF000000;
ShowMessage(format('移位前: %.8X',[X]));
asm
MOV EAX, X
ROR EAX, 8
MOV X, EAX
end;
ShowMessage(format('移位後: %.8X',[X]));
end;
怎麽样,是不是很简单?
二.如何在汇编代码中调用函数?
首先,需要讲一下函数的调用方式。
在Delphi中,函数的调用方式有五种,分别是register,pascal,cdecl,stdcall以及safecall,最常用的是register及stdcall方式.如何区别这五种方式,它们之间依据三个方面来区分,第一是参数传递顺序(Parameter Order),第二是堆栈清除方(Clean-up),第三是是否以寄存器来传递参数(Passes parameters in registers?).您可以在Delphi Help中找到相关资料。
Delphi中默认的参数传递方式是register,即不加方式声明的情况下,都是register方式.register方式的参数传递顺序是从左到右,由被调用者来清除堆栈,并且使用寄存器来传递参数。如何使用寄存器来传递参数呢?第一个参数使用EAX,第二个参数使用EDX,第三个参数使用ECX,第四个及以后的参数使用堆栈来传递,并且这些使用堆栈的参数是从左到右入栈的。
stdcall是Windows的默认参数传递方式,它不使用寄存器来传递参数,这种方式下参数的传递顺序是从右到左,即最后一个参数第一个入栈,依次向前,按倒序入栈。
范例2:用asm代码调用MessageBox函数,它告诉您如何在asm中调用stdcall方式的函数。
procedure Tform1.Button2Click(Sender: TObject);
var
sztitle:string;
szCaption:string;
begin
sztitle:='您好!';
szCaption:='这是一个在内嵌汇编中调用stdcall类型函数的例子.';
asm
PUSH MB_OK+MB_ICONINformATION
PUSH sztitle
PUSH szCaption
PUSH 0
CALL MessageBox
end;
end;
先来看看MessageBox函数的声明:
function MessageBox(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer; stdcall;
这个函数的调用方式是stdcall,参数必须从右到左入栈,所以我们先将uType参数入栈,范例中该参数的值是MB_OK+MB_ICONINformATION,即PUSH MB_OK+MB_ICONINformATION,然后再将lpCaption,lpText,hWnd依次入栈.最后才使用CALL指令调用MessageBox函数。
范例3:用asm代码调用register方式的函数.StrLen的声明为:function StrLen(const Str: PChar): Cardinal; 它的调用方式是默认的register方式.
procedure Tform1.Button3Click(Sender: TObject);
var
Str:PChar;
iLen:Integer;
begin
Str:='abcdefghijklm';
asm
MOV EAX, Str //用EAX传递第一个参数
CALL StrLen
MOV iLen,EAX
end;
ShowMessage(IntToStr(iLen));
end;
http://websoso.bokee.com/4693792.html
http://blog.csdn.net/yanjiaye520/article/details/6285267
Delphi代码中嵌入ASM代码的更多相关文章
- Delphi代码中嵌入ASM代码(简单明了)
前言 Delphi作为一个快速高效的开发平台,使用的人越来越多,但熟悉在Delphi代码中嵌入ASM代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- 实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)
使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光 学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程 ...
- Linux内核设计第四周学习总结 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
陈巧然原创作品 转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验目的: 使用库函数A ...
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call. 系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变 ...
- linux内核分析第四周-使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
本周作业的主要内容就是采用gcc嵌入汇编的方式调用system call.系统调用其实就是操作系统提供的服务.我们平时编写的程序,如果仅仅是数值计算,那么所有的过程都是在用户态完成的,但是我们想将变量 ...
- 通过库函数API和C代码中嵌入汇编代码剖析系统调用的工作机制
作者:吴乐 山东师范大学<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 本次实验的主要内容就是分别采用A ...
随机推荐
- ORACLE触发器和new、old特殊变量
:new --为一个引用最新的列值;:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而inse ...
- Python之路第七天,基础(9)-面向对象(上)
面向对象的编程思想 回想 我们所学过的编程方法: 面向过程:根据业务逻辑从上到下写堆叠代码. 函数式编程:将重复的代码封装到函数中,只需要写一遍,之后仅调用函数即可. 面向过程编程最易被初学者接受,其 ...
- SQL Server 找出值得优化的语句
方法 1. sys.dm_exec_qurey_stats 返回 SQL Server 中缓存查询计划的聚合性能统计信息. 缓存计划中的每个查询语句在该视图中对应一行, 并且行的生存期与计划本身相关联 ...
- Apriori algorithm
本文是个人对spmf中example1. mining frequent itemsets by using the apriori algorithm的学习. What is Apriori? A ...
- YUI的模块化开发
随着互联网应用越来越重,js代码越来越庞大,如何有效的去组织自己的代码,变得非常重要.我们应该学会去控制自己的代码,而不是到最后一堆bug完全不知道从哪冒出来.前端的模块化开发可以帮助我们有效的去管理 ...
- 在WPF中自定义你的绘制(三)
原文:在WPF中自定义你的绘制(三) 在WPF中自定义你的绘制(三) ...
- read write spinlock
发一个自己基于 C++11 写的 read write spinlock,在 MinGW 4.8.2 (gcc 4.8 全面支持c++ 11,但由于gcc windows平台 libstdc++ 目前 ...
- python模块目录文件后续
1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...
- K-近邻算法python实现
内容主要来源于机器学习实战这本书.加上自己的理解. 1.KNN算法的简单描写叙述 K近期邻(k-Nearest Neighbor.KNN)分类算法能够说是最简单的机器学习算法了. 它採用測量不同特征值 ...
- Vbox 未指定XXX网络名称 找不到网卡问题
链接方式不止Host-Only 我一般选桥连 选择 VBoxNetFltM.inf VBoxNetFltM.inf VirtualBox的桥接网络驱动程序的INF文件(Miniport:端口) VBo ...