數(shù)據(jù)段應(yīng)放在代碼段之前,這是因?yàn)樵跀?shù)據(jù)段中先定義了變量,而后才能在代碼段中使用,否則匯編時,在代碼段中用到的變量將不能確定其類型,
致使匯編時得不到正確的機(jī)器代碼,如:
MOVAL,WA
匯編程序不能確定WA是字節(jié)還是字,因而將給出錯誤信息,只有在數(shù)據(jù)段中對WA定義為字節(jié)型變量時,這條指令才能正確匯編。
由上所述可知,一個源程序模塊,一般都應(yīng)有一個相同的結(jié)構(gòu),它們可以復(fù)制。編程時只要改變有關(guān)的名稱,填入自己的程序內(nèi)容即可。一個標(biāo)準(zhǔn)的程序結(jié)構(gòu)如下:
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偽指令告訴匯編程序,哪一個段和哪一個段寄存器相對應(yīng),即某一段地址應(yīng)放入哪一個段寄存器。
②DOS的裝入程序在裝入執(zhí)行時,將把CS初始化為正確的代碼段地址,把SS初始化為正確的堆棧段地址,因此在源程序中不需要再對它們進(jìn)行初始化。
MOV AX,DATA
MOV DS,AX
③模塊在要執(zhí)行時,通常先由DOS的裝入程序?qū)?zhí)行模塊裝入內(nèi)存。
由上述我們知道,PSP的段地址為DS中的值,而該地址又指向INT20H指令,因此偏移量應(yīng)該為0。
PUSH DS ;壓入PSP的段地址
MOV AX,0
PUSH AX ;壓入INT20H的偏移量
以上3條指令就是為主模塊返回DOS所做的準(zhǔn)備。當(dāng)然,如果不是主模塊,這3條指令是不需要的。