数据段应放在代码段之前,这是因为在数据段中先定义了变量,而后才能在代码段中使用,否则汇编时,在代码段中用到的变量将不能确定其类型, 致使汇编时得不到正确的机器代码,如: MOVAL,WA 汇编程序不能确定WA是字节还是字,因而将给出错误信息,只有在数据段中对WA定义为字节型变量时,这条指令才能正确汇编。 由上所述可知,一个源程序模块,一般都应有一个相同的结构,它们可以复制。编程时只要改变有关的名称,填入自己的程序内容即可。一个标准的程序结构如下: STACK SEGMENT PARASTACK′STACK′ DB 500DUP(0) STACK ENDS DATAS EGMENT …DATA ENDS CODE SEGMENT MAIN PROC FAR ASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACK PUSH DS MOV AX,0 PUSH AX MOV AX,DATA MOV DS,AX MOV ES,AX… RET MAIN ENDP CODE ENDS END MAIN
①必须用ASSUME伪指令告诉汇编程序,哪一个段和哪一个段寄存器相对应,即某一段地址应放入哪一个段寄存器。
②DOS的装入程序在装入执行时,将把CS初始化为正确的代码段地址,把SS初始化为正确的堆栈段地址,因此在源程序中不需要再对它们进行初始化。 MOV AX,DATA MOV DS,AX
③模块在要执行时,通常先由DOS的装入程序将执行模块装入内存。 由上述我们知道,PSP的段地址为DS中的值,而该地址又指向INT20H指令,因此偏移量应该为0。 PUSH DS ;压入PSP的段地址 MOV AX,0 PUSH AX ;压入INT20H的偏移量 以上3条指令就是为主模块返回DOS所做的准备。当然,如果不是主模块,这3条指令是不需要的。