WORDTOSTR PROC FAR PUSH SI MOV CX,5;设置循环次数 NEXTDIGIT:MOV DX,0 MOV BX,10 CMP AX,0 JZ BLANK DIV BX ADD DX,30H;将得到的每位数字转换为对应的ASCII码 SETCHAR:MOV [SI],DL DEC SI MOV DX,0 LOOP NEXTDIGIT POP SI CMP BYTE PTR [SI],20H JZ ZERO RET
ZERO:MOV BYTE PTR[SI],30H RET
BLANK:MOV DL,20H JMP SETCHAR WORDTOSTR ENDP CODES ENDS END START
运行结果:
第二题
编写一个汇编程序,实现N!(N>=0):
N!=N*(N-1)*(N-2)*??*1
(设N=3),跟踪IP变化,观察堆栈的变化,理解子程序递归调用中程序执行的流程,以及帧信息的组成。(注意BP的变化)
a) 程序框图
b) 程序源代码 DATA SEGMENT
RESULT DW ? SAVE_BP DW ?
SAVE_CS_IP DW 2 DUP(?) N DW 3 SAVE_N DW ?
RESULT_ADDR DW ? NFACT DB 6 DUP(?)
DATA ENDS
STACK SEGMENT
TOP LABEL WORD DW 128 DUP(0)
STACK ENDS
CODE1 SEGMENT
ASSUME CS:CODE1,DS:DATA,SS:STACK START: MOV AX,STACK MOV SS,AX
MOV SP,OFFSET TOP PUSH DS
MOV AX,DATA
FACT DONE: RETURN: FACT MOV DS,AX
MOV BX,OFFSET RESULT PUSH BX
MOV BX,N PUSH BX
CALL FAR PTR FACT MOV AH,4CH INT 21H
PROC FAR PUSH BP MOV BP,SP PUSH BX PUSH AX
MOV BX,[BP]+RESULT_ADDR MOV AX,[BP]+SAVE_N CMP AX,0 JE DONE PUSH BX DEC AX PUSH AX
CALL FAR PTR FACT
MOV BX,[BP]+RESULT_ADDR MOV AX,[BX]
MUL [BP]+SAVE_N JMP SHORT RETURN MOV AX,1 MOV [BX],AX POP AX POP BX POP BP RET 4 ENDP
CODE1 ENDS
END START
查看指令
观察IP的变化:第一次变化:0017--0020
第二、三、四次跳变相同:0037--0020
共调用了四次FACT函数 IP跳转可用如下图表示:
FACT 主程序 观察堆栈情况:
与书中P165页情况相符合
3阶阶乘堆栈示意图