Delphi笔记(整理)-堆和栈

在Windows 下,一个程序的堆栈由两个值定义:堆栈的最小值和最大值。这两个值受编译器指示字
$MINSTACKSIZE 和 $MAXSTACKSIZE 所控制,它们的缺省值分别是16,384(16K)和1,048,576
(1M)。在Linux 下,堆栈大小只能由环境设置。

在register 约定下,最多有3 个参数可通过CPU 寄存器传递,其余(若有的话)参数被传递到栈。此时,
参数以声明的顺序(和pascal 相同)被传递,前3 个有资格的参数分别使用EAX、EDX 和ECX 寄存器。

过程和函数必须保留EBX、ESI、EDI 和EBP 寄存器,但可以修改EAX、EDX 和ECX。当在汇编语言
中实现构造和销毁时,保证预留DL 寄存器。过程和函数被调用时,是假定CPU 的direction 标志是清除
的(对应于CLD 指令),并且返回时,direction 标志也必须是清除的。

以下约定适用于函数的返回值:
􀁺 可能的话,有序类型通过寄存器返回值:字节通过AL 返回,字通过AX 返回,双字通过EAX 返
回。
􀁺 实数类型的返回值在浮点协处理器的栈顶寄存器(top-of-stack register,ST(0))。对于Currency 类
型的返回值,ST(0)中的值被乘以10000。比如,Currency 值1.234 在ST(0)中的值为12340。
􀁺 对字符串、动态数组、方法指针、Variant、或Int64 类型的返回值,就像函数在其它参数的后面额
外声明了一个var 参数。换句话说,是函数调用者传递一个额外的32 位指针,它指向的变量用来
返回结果。
􀁺 指针、类、类引用和过程指针类型,结果通过EAX 返回。
􀁺 对静态数组、记录和集合类型,若结果占用1 个字节,它通过AL 返回;若结果占用2 个字节,
它通过AX 返回;若结果占用4 个字节,它通过EAX 返回。否则(结果超过4 个字节),结果通
过一个额外的var 参数返回,它在所有声明的参数的后边。

在register 调用约定下,Self 就像在所有其它参数的前面声明,所以,它总是通过EAX 寄存器传递。
在pascal 调用约定下,Self 就像在所有其它参数的后面声明(有时还要包括返回函数值的额外的var 参
数),所以,它最后被压入栈,所在的地址比其它参数要低。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值