1.N!的实现
STACK SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU ($ - STACK_AREA)
STACK ENDS
DATA SEGMENT PARA
N DW 5
DATA ENDS
CODE SEGMENT PARA
ASSUME DS:DATA,CS:CODE,SS:STACK
MAIN PROC FAR
MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV AX,STACK_BTM
MOV SP,AX ;初始化
MOV AX,N
PUSH AX
CALL CALCULATE ;参数传递使用堆栈
CALL PRINT ;参数传递使用AX
MOV AX,4C00H
INT 21H
MAIN ENDP
CALCULATE PROC ;入口参数在堆栈中,返回值是AX里
PUSH BP ;利用BP寻址,先保存BP
MOV BP,SP
PUSH DX ;下文中要用到的寄存器事先保存
PUSH BX
MOV BX,[BP+4] ;取得参数N
CMP BX,0
JNZ LABEL1
MOV AX,1 ;如果N是0那么返回1
JMP LABEL2
LABEL1:
PUSH BX ;保存参数N
DEC BX
PUSH BX
CALL CALCULATE
POP BX
MUL BX ;AX *= BX
LABEL2:
POP BX
POP DX
POP BP
RET 2 ;递归计算完成后,入口参数也应该消除,因此SP多+2
CALCULATE ENDP
PRINT PROC
PUSH AX ;保存
PUSH BX
PUSH CX
PUSH DX
MOV BX,10
MOV CX,0
LOOP1:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JZ LOOP2
JMP LOOP1
LOOP2:
POP DX
OR DL,30H
MOV AH,2
INT 21H
LOOP LOOP2
POP DX
POP CX
POP BX
POP AX
RET
PRINT ENDP
CODE ENDS
END MAIN
N等于五的时候的输出:
在N=3时的堆栈段情况:
2.一个用于进制转换和乘除法的综合程序(用堆栈传递参数)
MY_STACK SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BTM EQU $ - STACK_AREA
MY_STACK ENDS
MY_DATA SEGMENT
A DW 1234H
B DW 0011H
MY_ENTER DB 0DH,0AH,'$'
MY_DATA ENDS
MY_CODE SEGMENT
ASSUME CS:MY_CODE,DS:MY_DATA,SS:MY_STACK
MAIN PROC FAR
MOV AX,MY_STACK
MOV SS,AX
MOV AX,MY_DATA
MOV DS,AX
MOV SP,STACK_BTM
MOV AX,A
PUSH AX
CALL TO_HEX ;测试16进制转换
MOV DX,'H'
MOV AH,02H
INT 21H
LEA DX,MY_ENTER
MOV AH,09H
INT 21H
MOV AX,B
PUSH AX
CALL TO_DEC ;测试10进制转换
LEA DX,MY_ENTER
MOV AH,09H
INT 21H
MOV AX,A
PUSH AX
MOV AX,B
PUSH AX
CALL MUL_FUNC;乘法测试
LEA DX,MY_ENTER
MOV AH,09H
INT 21H
MOV AX,A
PUSH AX
MOV AX,B
PUSH AX
CALL DIV_FUNC;除法测试
MOV AX,4C00H
INT 21H
MAIN ENDP
TO_HEX PROC NEAR ;默认参数是在堆栈中,长度是一个字
PUSH AX ;保存要用的寄存器
PUSH BX
PUSH CX
PUSH DX
PUSH BP
MOV BP,SP
MOV AX,[BP+12]
XOR CX,CX
MOV BX,16
LOOP_TO_HEX:
MOV DX,0
DIV BX
CMP DX,10
JAE BRANCH1
OR DL,30H
JMP BRANCH2
BRANCH1: ADD DX,57H
BRANCH2: PUSH DX
INC CX
CMP AX,0
JZ PRINT_HEX
JMP LOOP_TO_HEX
PRINT_HEX:
POP DX
MOV AH,02H
INT 21H
LOOP PRINT_HEX
POP BP
POP DX ;恢复
POP CX
POP BX
POP AX
RET 2
TO_HEX ENDP
TO_DEC PROC NEAR ;默认参数是在堆栈中,长度是一个字
PUSH AX ;保存要用的寄存器
PUSH BX
PUSH C