$$$请教关于子程序调用机制,送分!!!!
_main proc near
push bp
mov bp,sp
sub sp,2
;
; {
; int i=a(2,3);
;
mov ax,3
push ax
mov ax,2
push ax
call near ptr @a$qii
pop cx
pop cx
mov word ptr [bp-2],ax
;
; }
;
mov sp,bp
pop bp
ret
_main endp
;
; int a(int d,int e)
;
assume cs:_TEXT
@a$qii proc near
push bp
mov bp,sp
;
; {
; return d+e;
;
mov ax,word ptr [bp+4]
add ax,word ptr [bp+6]
jmp short @2@58
@2@58:
;
; }
;
pop bp
ret
@a$qii endp
以上是BCC3.1生成的汇编代码,原码为:
int main(int argc, char* argv[])
{
int i=a(2,3);
}
int a(int d,int e)
{
return d+e;
}
请问:代码的子程序中用了
mov ax,word ptr [bp+4]
add ax,word ptr [bp+6]
那么BP+2里存的是什么?请注意,他是通过AX来存放返回值的.
更进一步,调用子程序时
主程序调用部分和子程序头各应如何写代码?(请以本程序为例)
CALL之后栈中情况如何?
返回值,各参数,主程序下一条指令等各存在栈中何处?
在DOS和WIN32下,用CALL和INVOKE调用的情形各如何?
另外C,PASCAL,STDCALL的详细区别?
我的C编译器正在写代码生成部分,所以须详细了解.
请指教,多谢多谢!!