![]() |
#2
ansic2011-06-13 11:31
![]() ; ;This Program Compiled Sucess by Masm 6.15 ; assume cs:code,ds:data data segment msg0 db 'Please a digit (0-8):$' msg1 db 'error!$' msg2 db 'Result:$' data ends code segment start: mov ax,data ;定义数据段 mov ds,ax mov dx,offset msg0 ;显示提示信息 mov ah,9 int 21h mov ah,1 ;接受输入 int 21h call crlf ;回车 cmp al,'0' ;如果输入字符不在0~9之内则提示错误并退出 jb err cmp al,'8' ja err sub al,30h ;如果输入合法,则开始做乘法 call fact ;调用子程序(没用递归) push ax ;保存结果 mov dx,offset msg2 ;显示提示信息 mov ah,9 int 21h pop dx ;恢复结果 call disp ;调用显示十进制子程序 jmp done ;结束 err: mov dx,offset msg1 ;出错信息提示 mov ah,9 int 21h done: mov ah,4ch int 21h ;crlf 回车换行子程序 crlf proc uses ax bx cx dx mov ah,2 mov dl,13 int 21h mov dl,10 int 21h ret crlf endp ;阶乘子程序 ;fact:al fact proc mov ah,0 cmp al,1 jz _ret mov cx,ax dec cx s: mul cx loop s _ret: ret fact endp ;显示十进制子程序 ;input:dx disp proc uses ax bx cx dx mov ax,dx xor dx,dx mov bx,10 mov cx,0 d0: cmp ax,10 jb ok div bx add dl,30h push dx xor dx,dx inc cx jmp d0 ok: add al,30h push ax inc cx d1: pop dx mov ah,2 int 21h loop d1 ret disp endp ; code ends end start 运行结果: 只有本站会员才能查看附件,请 登录 [ 本帖最后由 ansic 于 2011-6-13 12:07 编辑 ] |
DATAS SEGMENT
A DB "PLEASE INPUT DATA 0-8",10,13,"$"
B DB 10,13,"CUOWU",10,13,"$"
;此处输入数据段代码
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET A
MOV AH,09
INT 21H
L1: MOV AH,1
INT 21H
CMP AL,30H
JZ A6
CMP AL,38H
JNS CUO
CMP AL,30H
JS CUO
SUB AL,30
MOV CL,AL
L2: DEC CL ;cl每次减1乘al再存到al中
MUL CL
CMP CL,1
JNZ L2
JMP L3
A6: MOV AX,1 ;0的情况
JMP L3
CUO:MOV DX,OFFSET B
MOV AH,9
INT 21H
JMP L1;此处输入代码段代码
L3:MOV AH,4CH
INT 21H
CODES ENDS
END START
目的把阶乘的结果存到al中