proc是子程序定义伪指令, far是该子程序的属性,决定调用程序和子程序是否在同一代码段
如下:为子程序定义及说明,
子程序名 PROC NEAR ( 或 FAR )
xxxxxx具体代码
ret
子程序名 ENDP
子程序名为符合语法的标识符
NEAR属性(段内近调用): 调用程序和子程序在同一代码段中,只能被相同代码段的其他程序调用;
FAR属性(段间远调用): 调用程序和子程序不在同一代码段中,可以被相同或不同代码段的程序调用.
使用proc传递参数
proc完整格式:
label PROC [attributes] [USES reglist], parameter_list
传递参数举例:
_ProcDlgMain proc uses ebx edi esi hWnd,wMsg,wParam,lParam
AlignSize proc uses ecx edx nSize:UINT,nAlign:UINT
其中use的功能就相当于
push ecx
push edx
如果你学习过DOS汇编就应该知道了,在子程序中一般会把一些寄存器入栈,然后子程序运行完后再把这些寄存器的值pop出来,相当暂时把寄存器中值保存在栈中,uses就是一条伪操作而已,如果你不嫌麻烦,也可以直接自己push入栈也可以的,win32好多这样的伪操作和伪指令,其实就是真正指令的一种封装,本来真正的指令是push ecx 和push edx的,win32把它封装成一个uses就可以完成了,但是在编译的时候,编译器还是会编译成push ecx push edx的,当然加上uses后,子程序运行前会自动把要保护的寄存器入栈,子程序结束后会自动把自动把寄存器中的值还原,所以可以节省程序员写代码的时间