简易的参数访问
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 更能适应数据类型的潜在变
化。