Delphi内嵌ASM简易教程

作者:heiying2006-03-19 18:33分类:默认分类标签:
前言
  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;

【转】Delphi内嵌ASM简易教程的更多相关文章

  1. Delphi内嵌汇编语言BASM精要(转帖)

    1 BASM概念简要  汇编语句由指令和零至三个表达式构成.表达式由常数(立即数).寄存器和标识符构成.例如: movsb        // 单指令语句 jmp @Here    // 一个表达式: ...

  2. delphi内嵌汇编

    { 前面知道了一个汇编的赋值指令(MOV), 再了解一个加法指令(ADD), 就可以做个例子了. 譬如: ADD AX,BX; 这相当于 Delphi 中的 AX := AX + BX; 另外提前来个 ...

  3. [小程序开发] 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  4. tkinter内嵌Matplotlib系列(二)之函数曲线绘制

    目录 目录 前言 (一)对matplotlib画布的封装: (二)思路分析: 1.需求说明: 2.框架的设置: 3.文件说明: (三)各文件的源代码 1.main.py 2.widget.py 3.f ...

  5. 【原创】X86_64汇编、寄存器、内嵌汇编

    整理的X86_64/X86汇编.寄存器.C内嵌汇编笔记,主要用于查阅使用. 目录 一.汇编语言 二.指令 数据传输指令 栈操作指令 push pop 运算指令 位操作 比较操作指令 标志寄存器 流控制 ...

  6. Linux内核--C语言中内嵌汇编 asm __volatile__

    在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器,以及如何将计算结果写回C 变量,你只要告诉程序中C语言表达式与汇编指令操作数之间的对应关系即可 ...

  7. Linux内核系列—C语言中内嵌汇编 asm __volatile__,asm__volatile_【转】

    转自:http://www.bkjia.com/Androidjc/1109412.html 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达式的值读入哪个寄存器, ...

  8. riot.js教程【四】Mixins、HTML内嵌表达式

    前文回顾 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法: riot.j ...

  9. GCC在C语言中内嵌汇编 asm __volatile__ 【转】

    转自:http://blog.csdn.net/pbymw8iwm/article/details/8227839 在内嵌汇编中,可以将C语言表达式指定为汇编指令的操作数,而且不用去管如何将C语言表达 ...

随机推荐

  1. 基于cygwin构建u-boot(一)环境搭建

    从本文开始,更系统的描述基于cygwin构建u-boot. 之前<痛苦的版本对齐>系列,对于cygwin环境下Sourcery CodeBench,u-boot-1.1.6的构建有侧面的说 ...

  2. Linux系统编程(23)——信号的阻塞

    实际执行信号的处理动作称为信号递达(Delivery),信号从产生到递达之间的状态,称为信号未决(Pending).进程可以选择阻塞(Block)某个信号.被阻塞的信号产生时将保持在未决状态,直到进程 ...

  3. jQuery中append html后绑定事件不起作用

    事件一定要紧跟append之后, 否则append元素点击不起作用 $(function(){$('div').append('<ul><li id="appli" ...

  4. IA32与x86

    64位机器相比于32位优点 ①访问虚拟地址范围更大 ②更多的寄存器 ③过程较简单 ④采用条件传送指令 详细看:http://baike.baidu.com/link?url=DoRp7iW_z3cE6 ...

  5. Candy 解答

    Question There are N children standing in a line. Each child is assigned a rating value. You are giv ...

  6. Container With Most Water 解答

    Question Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate ...

  7. POJ1988 并查集的使用

    Cube Stacking Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 21157   Accepted: 7395 Ca ...

  8. poj1724

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10804   Accepted: 3976 Descriptio ...

  9. Gradle+Jetty实现静态资源的热部署

    本文转自http://www.cnblogs.com/huang0925/p/3302487.html --------------------------------------- 通过Gradle ...

  10. qsort的几种用法

    #include<stdio.h> #include<stdlib.h> int cmp(const void *a,const void *b){ return *(int ...