函数指针是C编程语言的许多困难特性之一。
由于C编译器对8051体系结构的独特要求,函数指针和可重入函数面临着更大的挑战。
这主要是由于传递函数参数的方式所致。
通常,(对于除8051之外的大多数芯片),使用PUSH和POP汇编指令在堆栈上传递函数参数。
由于8051的堆栈大小有限(只有128字节,在某些设备上甚至低至64字节),因此必须使用不同的技术来传递函数参数。
当英特尔为8051推出PL/M-51编译器时,他们引入了在固定内存位置存储参数的技术。
当调用链接器时,它构建程序的调用树,找出哪些函数参数是互斥的,并覆盖它们。
这是链接器覆盖指令的开始。
由于PL/M-51不支持函数指针,因此从未出现过间接函数调用的问题。
然而,对于C语言,问题比比皆是。
链接器如何“知道”将哪个内存用于间接函数的参数?
如何将间接调用的函数添加到调用树中?