使用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          ;确认返回地址
posted @ 2021-04-14 21:48  blues2600  阅读(73)  评论(0)    收藏  举报