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代码的程序员我想不多,因为这方面的资料太少了,另一方面,它还需要有基本的汇编语言知识,关於汇编语言的 ...
- 实验四——使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验目的: 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 实验过程: 查看系统调用列表 get pid 函数 #include <stdio.h> #include & ...
- linux内核分析作业4:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
系统调用:库函数封装了系统调用,通过库函数和系统调用打交道 用户态:低级别执行状态,代码的掌控范围会受到限制. 内核态:高执行级别,代码可移植性特权指令,访问任意物理地址 为什么划分级别:如果全部特权 ...
- LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...
- 实验--使用库函数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 ...
随机推荐
- MFC全局函数开局——AfxGetApp解剖
MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象.主要全局函数有: AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormat ...
- python下载文件(图片)源码,包含爬网内容(爬url),可保存cookie
#coding=utf-8 ''' Created on 2013-7-17 @author: zinan.zhang ''' import re import time import httplib ...
- Java中的异常详解
一.异常定义 阻止当前方法或作用域继续执行的问题,称为异常 二.异常分析 所有不正常类都继承Throwable类,这个类主要有两个子类Error类和Exception类.Error指系统错误 ...
- sizeof与strlen的区别 浅谈
1.sizeof operator sizeof是C语言的一种单目操作符,如C语言的其他操作符++.- - 等,它并不是函数. Queries size of the object or type. ...
- mysql入门记录
mysql -h localhost(or ID) -u root -p show databases; create database <数据库名>: drop database < ...
- javascript笔记整理(正则)
RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具 var re=/e/; var re=new RegExp('e'); 正则表达式的 String 对象的方法 1.search- ...
- 利用Java内置的API开发JMX功能
一.什么是JMX JMS是一种Java规范,定义了如何管理一个软件系统(或应用程序)的规范. 对于一个简单的应用程序,该程序本身不需要被管理.但如果是开发的一个复杂系统(如一个电商平台.一个企业内部管 ...
- C#Windows的HelloWorld
在MSDN中找到Form类:MSDN-->.NET开发-->.NET Framework SDK 2.0-->Class Library Reference -->System ...
- hdu4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- codility上的问题(26) Hydrogenium 2013
题目,挺无聊的.一个裸的最短路.n个点,你住在0,要去买东西,每个点有一个关门时间,问能最早买到食物的时间.有两点注意 (1)有重边 (2) 原图是dicrect连接...但不是有向边,被这个误导了. ...