【转】Delphi内嵌ASM简易教程

Delphi内嵌ASM简易教程

作者: heiying 2006-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;

转载于:https://www.cnblogs.com/aakuang/p/3514627.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
初学 Delphi 嵌入汇编[1] - 汇编语言与机器语言 初学 Delphi 嵌入汇编[2] - 汇编语言关键字 初学 Delphi 嵌入汇编[3] - 第一个 Delphi 与汇编的例子 初学 Delphi 嵌入汇编[4] - 寄存器在过程与函数中的使用 初学 Delphi 嵌入汇编[5] - 寄存器在过程与函数中的使用 - 续 初学 Delphi 嵌入汇编[6] - & 操作符 初学 Delphi 嵌入汇编[7] - 使用常量 初学 Delphi 嵌入汇编[8] - 8 位寄存器、16 位寄存器与 32 位寄存器 初学 Delphi 嵌入汇编[9] - asm 可以代替 begin 初学 Delphi 嵌入汇编[10] - 函数返回值与寄存器 初学 Delphi 嵌入汇编[11] - 用汇编重写一个 Delphi 函数 初学 Delphi 嵌入汇编[12] - 在汇编代码中可以直接使用 Result 初学 Delphi 嵌入汇编[13] - 地址参数用 [] 取值 初学 Delphi 嵌入汇编[14] - 常量与变量在汇编中的一个区别 初学 Delphi 嵌入汇编[15] - 需要保护的寄存器 初学 Delphi 嵌入汇编[16] - 进制的表示方法 初学 Delphi 嵌入汇编[17] - 逻辑运算 初学 Delphi 嵌入汇编[18] - SHL 与 SHR 初学 Delphi 嵌入汇编[19] - Delphi 的无符号整数类型 初学 Delphi 嵌入汇编[20] - Delphi 的 Integer 类型 初学 Delphi 嵌入汇编[21] - Delphi 的其他整数类型 初学 Delphi 嵌入汇编[22] - 在汇编代码中使用记录 初学 Delphi 嵌入汇编[23] - LOOP 循环 初学 Delphi 嵌入汇编[24] - 汇编语言的简单数据类型 初学 Delphi 嵌入汇编[25] - 在汇编中调用函数 初学 Delphi 嵌入汇编[26] - 大小写字母换 初学 Delphi 嵌入汇编[27] - XCHG 指令: 交换寄存器的内容 初学 Delphi 嵌入汇编[28] - 把 EAX 的值置为 0 的三种方法与效率 初学 Delphi 嵌入汇编[29] - 寄存器所能接受的数值范围 初学 Delphi 嵌入汇编[30] - 寄存器表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值