简易的参数访问 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 更能适应数据类型的潜在变
mov dx,1231
in dx,al
mov Result,al
end
> var i:smallint;
> begin
> i:=1;
> asm
> mov ax,i
> sal ax,1
> mov &i,ax
> end;
> showmessage(inttostr(i));
> end;
说的对呀,
不过你可以在delphi的源程序中找一下,那里是有的。
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 更能适应数据类型的潜在变