谁能跟我解释一下函数调用的传参,跳转,保存CPU当前状态等
int sum;
main()
{
sum=add(2,3);
}
add(int a,int b)
{
int t;
t=a+b;
return t;
}
用这个c程序生成的部分汇编代码是
_main proc near
mov ax,20
push ax
mov ax,10
push ax
call near ptr _add
pop cx
pop cx
mov word ptr dgroup:_sum,ax
ret
_main endp
_add proc near
push si
push bp
mov bp,sp
mov si,word ptr [bp+6]
add si,word ptr [bp+8]
mov ax,si
pop bp
pop si
ret
_add endp
…
public _sum
public _add
public _main
…
在函数add中的t是局部变量应该是放在栈中的,除了这个函数,那么就不可见了,那么在汇编里怎么体现呢?还有这个函数调用的哪几句是传参数的?
push bp
mov bp,sp
这两句经常看到,是啥意思啊
问题点数:50、回复次数:6Top
1 楼feny911(春韭秋菘)回复于 2006-05-01 21:10:24 得分 30
楼主的代码有问题啊,你确定C源码和汇编码都没错吗?
mov si,word ptr [bp+6]
add si,word ptr [bp+8]
取得参数
push bp
mov bp,sp
桢操作
push si
pop si
保存CPU当前状态
Top
2 楼jara(一怒拔剑)回复于 2006-05-01 21:34:08 得分 0
重新贴一下c和汇编代码
C;
main()
{
int sum;
sum=add(2,3);
}
add(int a,int b)
{
int t;
t=a+b;
return t;
}
汇编
_main:
push bp
mov bp,sp
sub sp,0002
mov ax,0003
push ax
mov ax,0002
push as
call _add
pop cx
pop cx
....
_add:
push bp
mov bp,sp
push si
mov si,[bp+04]
add si,[bp+06]
mov ax,si
pop si
pop bp
ret
ret
Top
3 楼mydo(侯佩|hopy|ks)回复于 2006-05-01 21:35:15 得分 20
push bp
mov bp,sp
保存bp和堆栈指针sp,为后面用 bp 引用栈中变量和恢复sp与bp作准备。Top
4 楼jara(一怒拔剑)回复于 2006-05-01 21:43:08 得分 0
我觉得
mov si,[bp+04]
add si,[bp+06]
有问题。
应该是
mov si,[bp+06]
add si,[bp+08]
因为push了两个参数,call的时候又push了返回地址,然后又push了si
所以我觉得应该两个参数应该在 bp+06和bp+08的位置
可是为什么反汇编出来会是这个结果
Top
5 楼feny911(春韭秋菘)回复于 2006-05-02 01:58:58 得分 0
我觉得
mov si,[bp+04]
add si,[bp+06]
有问题。
应该是
mov si,[bp+06]
add si,[bp+08]
因为push了两个参数,call的时候又push了返回地址,然后又push了si
所以我觉得应该两个参数应该在 bp+06和bp+08的位置
可是为什么反汇编出来会是这个结果
//////////////////////////////////////////
你第一次贴的代码是
push si
push bp
mov bp,sp ;;先push si 再 mov bp,sp
mov si,[bp+06]
add si,[bp+08]
第二次贴的时候,
push bp
mov bp,sp
push si ;;先mov bp,sp 再 push si
mov si,[bp+04]
add si,[bp+06]
;;push si 对bp没有影响。[bp]为被保存的原bp的值。[bp+2]为返回地址。[bp+4]为第一个参数。
问一下,楼主用DOS吗?居然是16位寻址。
Top
6 楼jara(一怒拔剑)回复于 2006-05-02 11:45:36 得分 0
研究了一上午,终于全部搞懂了
结贴Top




