$$$请教关于子程序调用机制,送分!!!!

natrium11 2001-08-07 12:20:46
_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编译器正在写代码生成部分,所以须详细了解.

请指教,多谢多谢!!
...全文
96 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
azuo_lee 2001-08-07
  • 打赏
  • 举报
回复
1。[bp+2]是16字节的近返回地址。你使用c调用规则,进入子程序后的堆栈为:
-------- <- bp(也是sp)
保存的bp
-------- <- bp+2
返回地址
-------- <- bp+4
2(d)
-------- <- bp+6
3(e)
-------- <- bp+8
调用者堆栈
--------

2。函数调用时的代码与调用规则有关。以c规则的near调用为例,调用部分的代码是:
push para3 ;c调用规则参数自右向左入栈
push para2
push para1
call subfunc
add sp, 6 ;c调用规则调用者负责清理堆栈,将压入堆栈的实参空间释放
被调者代码:
push bp ;保存bp
mov bp, sp ;
;sub sp, xxx ;如果需要,为局部变量分配空间
...
;add sp, xxx ;如果前面为局部变量分配了空间,这里要释放
pop bp
mov ax, retVal ;返回值
ret
上面的函数调用对应于函数原型: int subfunc(para1, para2, para3);
如果函数改成stdcall调用,则调用部分不需要最后add sp, 6清理堆栈,而是在被调者最后用ret 6来清理堆栈;如果是pascal调用,参数入栈的顺序刚好相反。
至于invoke其实只是MASM定义的宏而已,它会根据不同的调用规则生成适当的push、call和add sp指令,但它并不是真正的机器指令。另外,函数调用在高档的CPU上可以用ENTER、LEAVE指令简单地实现堆栈保护和分配工作。

3。c调用:参数自右向左入栈,调用者清理堆栈;
pascal调用:参数自左向右入栈,被调者清理堆栈;
stdcall调用:二者折中,参数自右向左入栈,被调者清理堆栈。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧