2) 参数传送问题
高级语言通过堆栈把参数传送给汇编语言程序。
C 语言在调用汇编过程前,先使参数入栈。
应注意的是C语言规定参数入栈的次序是和程序中见到它们的次序相反的,或者说C语言按从右到左的次序使参数入栈。如函数
sub (x, y, z )
C语言先使z入栈,然后是y,最后是x(Pascal和Fortran语言的参数入栈次序与C相反,是按从左到右的次序使参数入栈的)。
C语言调用汇编过程时,同样要把返回点保存入栈。
如过程为FAR属性,则CS和IP将先后入栈;如过程为NEAR,则只保存IP。在返回点保存好后,汇编语言子过程就接收到C语言传送过来的控制权了。
例10.13给出了常用的汇编语言子过程框架。
其中头两条指令是为便于取得参数而作的BP入栈和SP送BP指令,然后是以BP为基准用 [BP+6],[BP+8]…逐个取得C语言传送来的参数(见图10.7
中给出的堆栈内容图)。应该注意如果子过程为NEAR,则返回点只包含IP,此时第一个参数应该用 [BP+4]取得,然后是 [BP+6],[BP+8]…等。汇编语言子过程的最后两条指令应当是BP出栈和不带常数的RET指令。
如果汇编语言子过程有参数要回送给C语言程序则应通过累加器回送。
如回送参数为8位(1字节)可用AL寄存器;如回送参数为16位(2字节)可用AX寄存器;如回送参数为32位(4字节)则可用DX,AX寄存器。
|