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的朋友有点帮助。
http://blog.csdn.net/diligentcatrich/article/details/7036739
delphi与汇编的更多相关文章
- 【Delphi内联汇编学习1】Delphi与汇编
我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...
- 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言
非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的<汇编语言>. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系 ...
- 参数传递方法(用Delphi的汇编代码解释)
参数传递方法 李纬的InsideVCL<第一章>中提到Windows定义的回调函数 typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM, ...
- Delphi经验总结(1)
先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...
- [转]Delphi 控件属性和事件
常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大 ...
- [转]delphi 有授权许可的字符串拷贝函数源码
一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...
- vc++窗口的创建过程(MFC消息机制的经典文章)
一.什么是窗口类 在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...
- xTiNt 论坛发帖辅助软件 1.0 绿色版
软件名称:xTiNt 论坛发帖辅助软件 1.0 绿色版软件语言: 简体中文授权方式: 免费软件应用平台: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: ...
- copy other
DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername/di ...
随机推荐
- POJ3318【随机化算法挺有意思】
题目链接:http://poj.org/problem?id=3318 http://meizhe143.blog.163.com/blog/static/3893836200710299512136 ...
- python学习(一)
1 python一切皆为对象,因为现实 包含了一系列的数据和操作这些数据的方法的一个整体,就叫作对象. 自行车 属性:手刹车,轮胎,脚踏板方法:如何前进的方法,控制停止的方法,控制方向 实际内容 男人 ...
- BZOJ 1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐( dfs )
直接从每个奶牛所在的farm dfs , 然后算一下.. ----------------------------------------------------------------------- ...
- [转]网络性能评估工具Iperf详解(可测丢包率)
原文链接:安全运维之:网络性能评估工具Iperf详解:http://os.51cto.com/art/201410/454889.htm 参考博文:http://linoxide.com/monito ...
- Verilog实现IIC通讯第二版
HMC5883三轴磁力传感器IIC通讯模块的VerilogHDL的实现 上一版并没有实现我想要的功能 0.0.1版 正在修订中 2013/9/2 //date :2013/7/7 //desi ...
- Ajax辅助方法
目前为止,我们已经考察了如何编写客户端JavaScript代码,以发送并接受服务器的数据.然而,在使用ASP.NET MVC时,还有另一种方法可用来执行Ajax调用,这就是Ajax辅助方法. Ajax ...
- Oracle 专用模式(DEDICATED) 和 共享模式(SHARE) (转)
Oracle 是一门博大精深的技术.玩了2年的oracle,依旧还有很多知识点不清楚. 昨天群里的朋友提到了 DEDICATED 和 SHARE 两种模式. 不清楚,默默的做点功课了.从网上搜了点知识 ...
- Pencil OJ 01 开发的准备
操作系统 ubuntu-12.04.5-desktop-amd64.iso 基本应用 Node 0.12.7 MongoDB 3.0.4 Robomongo 0.8.4 Atom 参考资料 OJ hu ...
- UVA 10020 Minimal coverage(贪心 + 区间覆盖问题)
Minimal coverage The Problem Given several segments of line (int the X axis) with coordinates [Li, ...
- [Andriod官方API指南]连接之蓝牙
Bluetooth —— 蓝牙 The Android platform includes support for the Bluetooth network stack, which allows ...