p; [second_param] ;压入第二个参数
push [first_param] ;压入第一个参数
call foo
add sp,12 ;平衡堆栈
PASCAL正好与C传递模式相反,它是通过左到右传递参数并在完成子程序后平衡堆栈的。
win16采取PASCAL传递方式是因为它的运行代码量小。C传递模式是在你不知道要传递
多少参数比如像wsprintf()子程序。在wsprintf()子程序中,子程序不能预先知道有
多少参数被压栈,所以你也不知道要怎样使堆栈平衡。
STDCALL是C和PASCAL传递模式的综合,它是通过右到左传递模式传递参数并平衡堆栈的,并
只有在win32下才专用的传递模式。但也有例外的是wsprintf(),你必须使用C传递模式。
.DATA
.DATA?
.CONST
.CODE
这四个指令是干什么用的呢?在win32下是没有段的,你记起来了吗?但是你仍然能按照
逻辑分区划分你的地址空间。这个最先的分区表是上一分区的结束。这里我们分为两个分区,
data和code。data分区又被分为三类:
.DATA 这个分区包含你的程序的初始化代码
.DATA?这个分区包含你程序的未初始化数据,有时你想预先分配一些内存但不想初始化它,
这个分区就是为这个想法而设的。这个未初始化数据的优势是:它不会增加程序容量大小。
比如,你在.DATA?分配了10,000字节容量,但你的程序并不是增加了10,1000字节。它仍然
和原大小一样。你只是仅仅告诉编译器当程序载入内存时你需要多少空间。就是这些。
.CONST 这个分区包含你的程序的常量定义说明。在这个分区定义的常量就不能被修改,因为
它们已经被定义。
你也并不是非要在你的程序中都要使用这三个指令,只要说明你需要的指令就行了。
剩下来的分区是代码区:.CODE。以下是它的主构架:
end
这里的任意的只是说明你的代码区域,还有就是这两个label要一样哟!你的所有代码
都在和 end 之间。