使用extern构建多模块程序
环境:vs2019,win7
声明extern过程
和C一样,外部过程在使用前在main文件前面声明,需要注意的是func@0,这里的参数永远必须是0,如果为非0,汇编器会报错。
例如:EXTERN FindLargest@0:PROC
调用extern过程
call FindLargest@0
定义extern过程
enter创建的局部变量,vs不会把这块内存清零,需要手动初始化。
进入过程后,很多寄存器也不会自动清零,每次使用前都要手动初始化。
脱离了INVOKE和扩展的PROC会让你接触到更多细节。
和单模块程序不同,在main过程中,push OFFSET Array给extern外部过程传递堆栈参数的结果不再是.data段的偏移量,例如0或12这样的,而是一个0x00406000的绝对内存地址。
这说明,vs2019在调试运行时程序是被绝对加载的,它每次都被加载到一个固定的内存位置。
【模板】
fuction PROC ;过程声明
val EQU [EBP + X] ;堆栈参数
val EQU [EBP + X] ;局部变量
enter x,0 ;堆栈帧
push 寄存器 ;保存寄存器
...(过程)
pop 寄存器 ;恢复寄存器
leave ;释放堆栈帧
ret x ;确认返回地址