懂汇编的进

来源:百度知道 编辑:UC知道 时间:2024/05/22 13:06:35
c语言中函数调用是通过堆栈维护的。
用汇编调用函数是不是自己建立堆栈来寻址?
例如:
int sum(a,b)
{ return(a+b);
}

void main()
{int a,b,c;
c=sum(a,b);
}

本人不是很懂汇编,自然也不懂反汇编。
能否 写出上面程序对应的汇编程序。
谢谢 !
今天看了下书本,有个段伪操作的
STACK 是做设么用的 ? 分配堆栈 ?

STACK是栈区,在内存中的一块位置,用来存放临时之中更临时的数据,一般程序会帮用户定义,但有是用户不想把栈定义为默认的长度(或许是用不到那么多或者是不够用),所以要重新定义

不知你是不是有错误,你这个程序连C语言都不能运行,因为a,b没有赋值,怎么会有实参

至于上面的函数可以这样定义

SUM PROC NEAR
;AH,和AL是入口,分别代表a,b,AL为出口返回
ADD AL,AH
SUM ENDP

写主程序是,调用SUM就输入CALL SUM命令
当然,在CALL SUM之前把AH,AL设置好
CALL SUM之后AL就是返回的值

你可以用到的栈操作就是:
POP和PUSH两个指令就行了!在函数调用中关键是保存参数和恢复现场用。

汇编的函数调用有
call指令,也是一句完成。

而堆的修改是根据参数传递方式,在子函数实现过程中,自己实现的。
但是依然不用自己建立堆栈,堆栈是系统自己的!

汇编函数调用如果是寄存器参数传递,那么需要把原来寄存器内容压栈,退出时候POP.
而且先把EIP寄存器的内容PUSH,然后执行RET(返回)的时候,POP这个EIP的内容,然后EIP就又返回那个地址继续向后执行了。
如果参数传递是内存,那么需要一段连续的内存空间作为参数传递的区域,而基本上这个都是SS段.
有点不明白要问啥.