现在使用的汇编语言差不多都是使用这两种程序框架,两种都是前辈流传下来的经典编程框架,区别在于返回DOS方式不同!记下,以备必需时可以翻阅。
DATA SEGMENT
......
DATA ENDS
;数据段定义
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
;堆栈段定义
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
PROC1 PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
...;其他语句.
RET;返回DOS
PROC1 ENDP
CODE ENDS
;代码段定义
END PROC1
程序段前缀0000H处存放了一条INT 20H指令,其功能是返回DOS。为此用RET指令退出时,只要在程序入口处将PSP:0000H压入堆栈中,在程序返回处使用RET指令就可以了。(PSP:段前缀)。
实例:实现z=(4x-y)/2。
代码:
DATA SEGMENT
X DB 2
Y DB 4
Z DB ?
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
PROC1 PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV AL,X
MOV CL,2
SAL AL,CL;x乘与4(左移2位)
SUB AL,Y
SAR AL,1
MOV Z,AL;结果装入Z中
RET
PROC1 ENDP
CODE ENDS
END PROC1
DATA SEGMENT
......
DATA ENDS
STACK1 SEGMENT PARA STACK
DW 20H DUP (0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK1
BEGIN: MOV AX,DATA
MOV DS,AX
......;其他语句
MOV AH,4CH
INT 21H;返回DOS
CODE ENDS
END BEGIN
这种格式使用DOS 21H的4C00H功能退出:
在程序需要退出返回DOS处安排如下两条指令:
MOV AX,4C00H;或者MOV AH,4CH
INT 21H
这两条指令执行后就会返回DOS,采用这种方法退出没有任何 限制,只要程序执行到这两条指令就能返回DOS。
实例:实现z=(4x-y)/2。
代码:
DATA SEGMENT
X DB 3
Y DB 4
Z DB ?
DATA ENDS
STACK SEGMENT PARA STACK
DW 20H DUP (0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
BEGIN: MOV AX,DATA
MOV DS,AX
MOV AL,X
MOV CL,2
SAL AL,CL
SUB AL,Y
SAR AL,1
MOV Z,AL
MOV AH,4CH
INT 21H
CODE ENDS
END BEGIN
除了这两种还有其他的格式框架,主要是区别是返回DOS的方式不同!以上两种是最常用的两种格式!
----------------------------------------------------------
----------------------------------------------------------