主题:一个加法程序
msgrev
[专家分:190] 发布于 2006-05-10 20:19:00
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个回复)
沙发
niuyuelei [专家分:90] 发布于 2006-05-10 22:42:00
我不知道你这个程序到底是做什么的,程序最后堆栈指针SP,基数指针BP值都未变,AX里存放的就是BP+4与BP+6所指单元值的和!至于RET 4之前我也没遇到过,应该跟INT 21H类似吧,是已经定义好的一个返回值!
板凳
C语言爱好者 [专家分:19410] 发布于 2006-05-11 13:06:00
这是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通常由调用函数清除实参。
我来回复