一、;;。二、试验原理及基础技术路线图(方框原理图)一个子程序作为调用程序去调用另一子程序,这种关系称为子程序嵌套。因为子程序嵌套对堆栈使用很频繁,所以还要确保堆栈有足够空间,并要注意堆栈正确状态,这包含CALL、RET、RETN、PUSH、POP、INT、IRET等和堆栈操作相关指令正确使用。在子程序嵌套情况下,假如一个子程序调用子程序就是它本身,这么子程序称为递归子程序。显然递归调用是子程序嵌套一个特殊情况。使用递归算法往往能设计出效率较高程序。设计递归子程序时,必需确保每一次后继调用全部不能破坏它上一次调用时所生成参数和中间结果,而且该过程不会修改它本身。这就意味着当使用汇编语言设计递归子程序时,必需考虑每一次调用全部应该把它参数、寄存器和全部中间结果保留到不一样存放区域。最好措施是利用堆栈来存放这些信息,一次调用所保留信息称为一帧。递归调用要使用大量堆栈空间,一定要确保堆栈足够大,而且也要确保堆栈正确使用,避免死机等不可预料情况发生。求N!算法步骤图:主程序结果地址入栈N入栈调用FACT求N!返回FACT子程序保留BP内容,建立帧首地址保留寄存器内容取结果地址取NN=0?结果地址入栈N-1入栈调用FACT求N-1取(N-1)!N!=N*(N-1)N!存入结果单元恢复寄存器内容返回N!=1三、所用仪器、材料(设备名称、型号、规格等):::记事本四、试验方法、:\assembly\目录下;(C:\assembly\MASM5)添加到Path环境变量中;:\assembly\,,输入汇编程序代码;,将目前目录切换到C:\assembly\,然后输入命令:[Enter],来汇编程序,依据汇编结果查看程序代码是否有语法错误,如有,则更正保留后重新汇编,直至没有错误为止,;:[Enter],观察输出结果,假如没有错误,;:[Enter],调试程序,并统计运行过程;。五、试验过程原始统计(数据、图表、计算等):\assembly\MASM5目录添加到Path环境变量中:,输入汇编程序代码:程序源码:STACKSG SEGMENT STACK 'S' ;定义堆栈DW128DUP('ST')STACKSG ENDSDATA SEGMENTN_VAL DW 3 ;定义N值RESULT DW ? ;结果DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSGFRAME STRUC ;定义帧结构SAV_BP DW ? ;保留BP值SAV_CS_IP DW2DUP(?) ;保留返回地址N DW ? ;目前N值RESULT_ADDR DW ? ;结果地址FRAME ENDSMAIN PROC FAR MOV AX,DATA MOV DS,AX LEA BX,RESULT PUSH BX ;结果地址入栈 PUSH N_VAL ;N值入栈 CALL FARPTRFACT ;调用递归子程序R1: MOV AX,4C00H INT 21HMAIN ENDPFACT PROC FAR ;N!递归子程序 PUSH BP ;保留BP值 MOV BP,SP ;BP指向帧基地址 PUSH BX PUSH AX MOV BX,[BP].RESULT_ADDR MOV AX,[BP].N ;取帧中N值 CMP AX,0 JE DONE ;N=0时退出子程序嵌套 PUSH BX ;为下一次调用压入结果地址 DEC AX PUSH AX ;为下一次调用压入(N-1)值 CALL FARPTRFACTR2: MOV BX,[BP].RESULT_ADDR MOV AX,[BX] ;取中间结果(N-1)! MUL [BP].N ;N*(N-1)! JMP SHORTRETURNDONE: MOV AX,1 ;0!=1RETURN: MOV [BX],AX ;存中间结果 POP AX POP BX POP BP RET 4FACT ENDPCODE ENDS END :::(1)结果地址入栈(2)N值入栈,并调用递归子程序(3)保留BP值,BP指向帧基
汇编--N阶乘样本 来自淘豆网m.daumloan.com转载请标明出处.