我一直认为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与汇编的更多相关文章

  1. 【Delphi内联汇编学习1】Delphi与汇编

    我一直认为Delphi功能与C++相比毫不逊色,提供了丰富的控件和类.全部API以及嵌入的汇编.最近小弟在把C版的Huffman压缩改用Delphi写时,顺便“研究”了一下Delphi的位操作和嵌入式 ...

  2. 初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言

    非科班出身, 现在才接触汇编, 惭愧呀, 好好学! 主选课本是清华大学王爽老师的<汇编语言>. 推荐 王爽老师的汇编网 汇编语言之前是机器语言. 机器语言是机器指令的集合, 机器指令是一系 ...

  3. 参数传递方法(用Delphi的汇编代码解释)

    参数传递方法 李纬的InsideVCL<第一章>中提到Windows定义的回调函数 typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM, ...

  4. Delphi经验总结(1)

    先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...

  5. [转]Delphi 控件属性和事件

    常用[属性] Action:该属性是与组件关联的行为,允许应用程序集中响应用户命令 Anchors:与组件连接的窗体的位置点 Align:确定组件的对齐方式 AutoSize:确定组件是否自动调整其大 ...

  6. [转]delphi 有授权许可的字符串拷贝函数源码

    一段看上去“貌不惊人”的Delphi插入汇编代码,却需要授权许可,但是与经典的同类型函数比较,确实“身手不凡”. 研究代码的目的在于借鉴,本文通过分析,并用C++重写代码进行比较,再次证明这段代码效率 ...

  7. vc++窗口的创建过程(MFC消息机制的经典文章)

    一.什么是窗口类  在Windows中运行的程序,大多数都有一个或几个可以看得见的窗口,而在这些窗口被创建起来之前,操作系统怎么知道该怎样创建该窗口,以及用户操作该窗口的各种消息交给谁处理呢?所以VC ...

  8. xTiNt 论坛发帖辅助软件 1.0 绿色版

    软件名称:xTiNt 论坛发帖辅助软件 1.0 绿色版软件语言: 简体中文授权方式: 免费软件应用平台: Win7 / Vista / Win2003 / WinXP / Win2008 软件大小: ...

  9. copy other

    DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername/di ...

随机推荐

  1. mysql语句:批量更新多条记录的不同值

    mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 1 UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_va ...

  2. Android -- BroadCastReceiver的简单使用

    //首先新建一个继承自BroadcastReceiver的广播监听类 class StartActiviryReceiver extends BroadcastReceiver { public fi ...

  3. sizeof,终极无惑(上)

    0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能具体的总结一下. 但当我总结的时候才发现,这个问题 ...

  4. ListView下拉刷新及上拉更多两种状态

    一.前言: 很多应用都会用到ListView,当然如果是iOS就会用UITableViewController,这两个控件在不同的OS上,功能是一样的,只是有些细微的不同(iOS的UITableVie ...

  5. ThinkPHP - I 函数

    ThinkPHP函数详解:I方法   浏览:144722 发布日期:2013/06/01 分类:文档教程 关键字: 函数 ThinkPHP的I方法是3.1.3版本新增的,如果你是之前的3.*版本的话, ...

  6. 基于visual Studio2013解决C语言竞赛题之0417四倍数

       题目 解决代码及点评 这道题目还是考察循环,通过循环遍历1234~9876,然后将每个数都用算法判断其是否符合条件#include <stdio.h> #include ...

  7. Android动态设定GridView的高度,固定column,实现高度自适应

    动态设定GridView的高度,固定column,根据gridview中的item个数设定高度: 调用以下方法: public static void setListViewHeightBasedOn ...

  8. 关于页ASP.NET面布局

    关于页面布局,充分利用Table和分层   从接触ASP.NET到现在已经有一段时间了,起初总是嫌麻烦,想找捷径,凡是想当然,结果导致自己反而走了不少的弯路. 起初刚开始接触ASP.NET的时候,发现 ...

  9. jsp_javabean

    什么是javabean? 遵循一定的设计原则的任何java类都可以是javabean组件 1.可序列化 implements serializable 2.无参数的构造方法 3.私有属性 通过公有方法 ...

  10. Gradle的简介与安装

    Gradle介绍 Gradle是一个基于JVM的构建工具,它提供了: 像Ant一样,通用灵活的构建工具 可以切换的,基于约定的构建框架 强大的多工程构建支持 基于Apache Ivy的强大的依赖管理 ...