一、
[要求] 求n!,n-5(6,7,8),n=3时,Debug下截屏,说明堆栈内存图
[源程序]
STACK1 SEGMENT PARA STACK
STACK_AREA DW 100H DUP(?)
STACK_BOTTOM EQU $-STACK_AREA
STACK1 ENDS
DATA1 SEGMENT
DATA1 ENDS
CODE1 SEGMENT
MAIN PROC FAR
ASSUME CS:CODE1,SS:STACK1,DS:DATA1
MOV AX,STACK1
MOV SS,AX
MOV AX,STACK_BOTTOM
MOV SP,AX
MOV AX,DATA1
MOV DS,AX
MOV ES,AX
MOV AH,1
INT 21H
SUB AL,'0'
XOR AH,AH
PUSH AX
CALL FACTORIAL
EXIT:
MOV AX,4C00H
INT 21H
MAIN ENDP
FACTORIAL PROC NEAR
PUSH BP
MOV BP,SP
PUSH BX
MOV AX,[BP+4]
CMP AX,1
JG FACTORIAL_CONTINUE
JMP FACTORIAL_END
FACTORIAL_CONTINUE:
MOV BX,AX
SUB AX,1
PUSH AX
CALL FACTORIAL
XOR DX,DX
MUL BX
JMP FACTORIAL_EXIT
FACTORIAL_END:
MOV AX,1
FACTORIAL_EXIT:
POP BX
POP BP
RET 2
FACTORIAL ENDP
CODE1 ENDS
END MAIN
[运行截图]
[说明]
输入为5
运行到了n为3的时候截取堆栈图
01fe 存的是 5 ,为第一次调用时压入栈的n值
01fc 存的是 1d, 为第一次调用时的返回地址
01fa 存的是0, 为第一次进入函数后保存的bp值
01f8 存的是0 , 为第一次保存的BX值
01f6 存的是4, 为第二次调用时压入栈的n值
之后以此类推
二、三
与第三次作业相比只增加了堆栈传递参数,故第三次作业补交时一并写了。