delphi与汇编笔记(2)------关于EBP寄存器的说明与使用

简介:
进几天一直在研究在delphi中使用汇编的问题。上回说了一点。今天再把我刚刚弄出来的一点东西写上来。
   EBP、ESP、BP和SP都称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式。
   现在我们来说一说EBP:
   EBP是基址指针寄存器:一般用来确认堆栈帧的起始位置,也就是指向栈底。也就是说,一般一个函数入口的地址也就存放在EBP中(所以一般在进入函数的时候将ebp寄存器内容压栈,即保存其函数的上级调用函数的栈基地址,以便于以后返回调用)。
   比如,我们要实现点一个Form1上的按扭Button1实现弹出对话框。我们一般是
   procedure TForm1.Button1Click(Sender: TObject);
   var  ss: string;      
   begin
       ss := '不得闲BASM测试';
       showmessage(ss);
   end;
   那么换成汇编的写法如下:
   procedure TForm1.Button1Click(Sender: TObject);
   var  ss: string;      
   begin
       ss := '不得闲BASM测试';
      asm
          mov   eax,[ebp- 04]callshowmessageend;end;//:EbpButton1Click4,[ebp04]sseaxBASMCallShowmessageShowmessageDelphi1,2,3EAX,EDX,ECX,EAX使Showmessage使使:CPUViewleaeax,[ebp04]callshowmessageend;end;//说明:Ebp通过上面我们知道应该是用来指定Button1Click过程的入口地址,将其减4用来空一点空间出来用来存放局部变量,则此时[ebp−04]中存放的则是字符串ss的地址,所以此时eax中存放的则是′BASM测试′的地址然后CallShowmessage,调用Showmessage函数,而Delphi默认的调用方式是寄存器方式,其1,2,3个参数分别对应着EAX,EDX,ECX,而EAX中已经存放了我们的局部变量地址。该函数则获得了字符串参数。上面的是用在过程里面,直接使用赋值后的字符串的地址传递给Showmessage函数调用。下面我们使用另一个方法来使用局部变量:通过查看CPUView我们可以知道,在上面的字符串赋值过程的汇编代码如下:leaeax,[ebp− 04]{这是留出一个空位,用来给局部变量中转使用}
    mov   edx,  2342342LstrLAsgCallLstrLAsgEDXEAXDelphiprocedureTest(prAddress:integer);asmmovedx,eax//prAddressEdx便LstrLAsgleaeax,[ebp2342342这里是一个随机的值,也就是字符串指针的值然后下面调用了一个系统函数LstrLAsgCallLstrLAsg该函数将EDX指向的地址内容复制到EAX指向的地址中去。所以由此可见,Delphi中的字符串赋值是通过拷贝实现的。所以我们可以通过一个过程传递一个字符串地址值来得实现上面的方法,代码如下:procedureTest(prAddress:integer);asmmovedx,eax//先将prAddress地址值存入Edx,便于调用LstrLAsg函数leaeax,[ebp− 04]               //将使用一个局部变量周转,(偏移地址)
    Call    System.@LstrLAsg       //调用系统的LstrLAsg函数实现字串复制
    mov    eax,  [ebp-$04]               //将实际的局部变量地址传递给Eax让Showmessage调用
    Call    Showmessage              //调用Showmessage函数
 end;
 
然后我们在ButtonClick中调用如下:
  procedure TForm1.Button1Click(Sender: TObject);
   var  ss: string;      
   begin
       ss := '不得闲BASM测试';
       Test(integer(ss));

   end;  


本文转自 不得闲 博客园博客,原文链接:http://www.cnblogs.com/DxSoft/archive/2010/01/01/1637648.html   ,如需转载请自行联系原作者

相关文章
|
Java
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
540 0
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(二)
|
芯片
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
728 0
【嵌入式开发】ARM 关闭中断 ( CPRS 中断控制位 | 中断使能寄存器 | 中断屏蔽寄存器 | 关闭中断 | 汇编代码编写 )(一)
汇编(三)段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题
段地址、偏移地址、内存单元、寄存器、CS、IP、代码段、debug、实验题、汇编、汇编编程、win10怎么使用debug
9829 0
汇编(二) 内存地址空间、寄存器、物理地址以及物理地址的计算
汇编、内存地址空间、寄存器、物理地址、物理地址的计算、汇编指令
4815 1
|
编译器
内存四域,变量声明和定义,寄存器,c内嵌汇编,auto,堆栈,常量,静态变量
 1.内存四大区域 2.在程序中,变量的声明可以有多份,定义只能有一份 3.寄存器在cpu里面,没有地址 4.c语言内嵌汇编语言 5.auto变量 自动分配内存,自动释放内存。 6、栈的大小由编译器决定 修改栈的方式,右击项目à属性à配置属性à链接器à系统à堆栈保留大小 7.卡死cpu,卡死内
1141 0
|
11月前
|
存储 Java C++
汇编语言、寄存器分类及程序计数器
汇编语言、寄存器分类及程序计数器
84 0
|
11月前
|
C语言
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)
进阶C语言 第七章-------《程序的编译(预处理操作)+链接》 (预编译、编译、汇编、#define、条件编译,#include的包含)知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏(三)