子程序递归的问题

masmaster 2010-09-09 09:28:01
如下代码:是杨继文《80X86汇编语言程序设计教程》中关于子程序递归的代码。我觉得有问题,我原封不动抄上来,请大家指出哪错啦?

fact proc
push dx
mov dx,ax
cmp ax,0
jz done
dec ax
call fact
mul dx
pop dx
ret
done: mov ax,1
pop dx
ret
fact endp
...全文
54 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
masmaster 2010-09-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 suchx 的回复:]
This program looks strange, you can write your own fact program.
Assembly code

.MODEL SMALL
.STACK 1024H
CR=0DH
LF=0AH
.DATA
INMES DB 'INPUT N : ','$'
CHRERR DB CR,LF,'0..9 EXPECTED.',CR,LF……
[/Quote]

thanks
suchx 2010-09-10
  • 打赏
  • 举报
回复
This program looks strange, you can write your own fact program.

.MODEL SMALL
.STACK 1024H
CR=0DH
LF=0AH
.DATA
INMES DB 'INPUT N : ','$'
CHRERR DB CR,LF,'0..9 EXPECTED.',CR,LF,'$'
RNGERR DB CR,LF,'RANGE CHECK ERROR .','$'
OUTMES DB CR,LF,'FACT= ','$'
HLTMES DB CR,LF,'PRESS ANY KEY TO HALT .','$'
BUFSIZE=6
BUF DB BUFSIZE
DB 0
DB BUFSIZE DUP(0)
N DW 0
Y DW 0
BASE DW 10
.CODE
_MAIN PROC NEAR
START:NOP
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
CALL READ
MOV CX,N
CALL FACT
MOV Y,AX
CALL WRITE
MOV AX,4C00H
INT 21H
_MAIN ENDP
READ PROC NEAR
RE1:LEA DX,INMES
CALL DISPMES
LEA DX,BUF
MOV AH,0AH
INT 21H
CALL ATOD
JC RE1
MOV N,AX
RET
READ ENDP
FACT PROC NEAR
PUSH CX
TEST CX,CX
JZ F1
DEC CX
TEST CX,CX
JZ F1
CALL FACT
POP CX
MUL CX
TEST DX,DX
JZ F2
LEA DX,RNGERR
CALL DISPMES
CALL HALT
JMP SHORT F2
F1:POP CX
MOV AX,1
F2:RET
FACT ENDP
WRITE PROC NEAR
LEA DX,OUTMES
CALL DISPMES
MOV AX,Y
CALL DTOA
LEA DX,BUF[2]
CALL DISPMES
RET
WRITE ENDP
ATOD PROC NEAR
PUSH SI
XOR AX,AX
XOR DX,DX
XOR BX,BX
XOR CH,CH
MOV CL,BUF[1]
LEA SI,BUF[2]
AT1:MUL BASE
TEST DX,DX
JZ AT2
LEA DX,RNGERR
CALL DISPMES
JMP SHORT AT9
AT2:MOV BL,[SI]
CMP BL,'0'
JB AT3
CMP BL,'9'
JA AT3
JMP SHORT AT4
AT3:LEA DX,CHRERR
CALL DISPMES
JMP SHORT AT9
AT4:SUB BL,'0'
ADD AX,BX
JNO AT5
LEA DX,RNGERR
CALL DISPMES
JMP SHORT AT9
AT5:INC SI
LOOP AT1
CLC
JMP SHORT AT8
AT9:STC
AT8:POP SI
RET
ATOD ENDP
DTOA PROC NEAR
PUSH SI
PUSH DI
XOR CX,CX
LEA DI,BUF[2+BUFSIZE-1]
MOV WORD PTR [DI],'$'
DEC DI
DT1:XOR DX,DX
DIV BASE
ADD DL,'0'
MOV [DI],DL
DEC DI
INC CX
TEST AX,AX
JNZ DT1
MOV SI,DI
INC SI
LEA DI,BUF[2]
CLD
REP MOVSB
MOV BYTE PTR [DI],'$'
POP DI
POP SI
RET
DTOA ENDP
DISPMES PROC NEAR
PUSH AX
MOV AH,9
INT 21H
POP AX
RET
DISPMES ENDP
HALT PROC NEAR
LEA DX,HLTMES
CALL DISPMES
MOV AH,1
INT 21H
MOV AX,4C00H
INT 21H
HALT ENDP
END START
masmaster 2010-09-09
  • 打赏
  • 举报
回复
这本书给我的感觉, 错误确实不少!!!

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧