回 帖 发 新 帖 刷新版面

主题:一个加法程序

Sum proc near
   push bp
   mov bp,sp
   sub sp,2
   mov ax,[bp+4]
   add ax,[bp+6]
   mov sp,bp
   pop bp
   ret 4
Sum endp

哪位大侠帮我解释一下这个程序

尤其是这句   ret 4
为什么是4?

回复列表 (共2个回复)

沙发


我不知道你这个程序到底是做什么的,程序最后堆栈指针SP,基数指针BP值都未变,AX里存放的就是BP+4与BP+6所指单元值的和!至于RET 4之前我也没遇到过,应该跟INT 21H类似吧,是已经定义好的一个返回值!

板凳

这是C或pascal的一个函数的汇编代码,函数实现的功能是对两个实参求和,返回值存放在ax。各部分代码解释如下:

Sum proc near
   push bp
   mov bp,sp        ;与push bp一起建立一个0级栈帧
   sub sp,2         ;为函数内某个变量预留空间,实际情况并没有使用这个变量
   mov ax,[bp+4]    ;bp+4保存了传递给此函数的一个实参
   add ax,[bp+6]    ;bp+6保存了传递给此函数的另一个实参
   mov sp,bp
   pop bp           ;清除栈帧
   ret 4
Sum endp

ret 4的语法是返回call的同时把sp的值加4,在这里的作用是函数返回时清除传递给此函数的那两个实参,因为那两个实参的长度都是2个字节,因此是4。

ret 4这种方法多见于pascal,c的编译器很少用这种方法,c通常由调用函数自己清除实参。原因是c需要实现可变参数函数,这种函数要求c的函数调用方式必须从右到左,使用可变参数时被调函数是不知道传入了多少个实参的,因此被调函数不能使用ret n这种方式清除实参,只有调用函数才知道传递了多少个实参,因此c通常由调用函数清除实参。

我来回复

您尚未登录,请登录后再回复。点此登录或注册