首页  编辑  

内嵌汇编

Tags: /超级猛料/Language.Object Pascal/内嵌汇编、函数、过程/   Date Created:

简易的参数访问

procedure Foo(i:integer);

begin

///...

 asm   ///i:=i+1

   mov eax,i

   inc eax

   mov i,eax

 end;

///...

end;

在内嵌汇编中访问变量:

如果一个参数是在一个函数或过程参数列表中被用v a r 声明的,它实际上是一个指针而不是

值。这就是说,如果要在汇编代码中引用这个参数,一定要明确,它是一个3 2 位的指针而不是一个值。

下面代码片断中阐述了如何利用汇编代码访问用v a r 声明的变量:

procedure Foo(var i:integer);

begin

 ///....

 asm   ///i:=i+1

   mov eax,i

   inc dword prt [eax]

 end;

 ///...

end;

内嵌汇编的返回值:

当使用全汇编的函数时,返回值应该怎么存放呢?

表13-1 返回值的返回方式

返回类型返回方式

Char,Byte                                     al 寄存器

SmallInt , Word                               ax 寄存器

Integer,LongWord,AnsiString,Pointer,class     eax 寄存器

Real48                                        eax 寄存器中是栈内返回值的指针

Int64                                         edx:eax 寄存器对

Single,Double,Extended,Comp                   栈首寄存器ST(0)

注意一个ShortString 类型是作为一个指向栈内字符串临时实例的指针来返回的。

访问记录:

B A S M 提供了一种灵活的手段访问Object Pascal 记录中的域,可以在B A S M 块中访问任意记录的域,

其访问的语法是R g i s t e r. Ty p e . F i e l d 。请看下列代码:

type

 TDumbRec=Record

   i:integer;

   c:char;

 end;

下面的函数中有一个T D u m b R e c 类型的参数:

procedure AsmRecord(var Dr:TDumbRec);

asm

 mov [eax].TDumbRec.i,20

 mov [eax].TDumbRec.c,'A'

end;

你可能已注意到了,B A S M 对记录域的访问非常简单。另一种方式是通过计算域的偏移量来获取

或设置域的值。在B A S M 中使用记录的地方使用这项技术,将会使B A S M 更能适应数据类型的潜在变

化。