| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1012 人关注过本帖
标题:求阶乘程序,求帮改改错
只看楼主 加入收藏
筐筐的橙
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2011-5-31
结帖率:100%
收藏
已结贴  问题点数:0 回复次数:8 
求阶乘程序,求帮改改错
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中
2011-06-13 11:01
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:8 
程序代码:
;
;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 编辑 ]

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-06-13 11:31
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:8 
晕 ansic 又比我快了点……只能做些扫尾工作了
L1: MOV AH,1
    INT 21H
    CMP AL,30H
    JZ A6
    CMP AL,38H
    JNS CUO
    CMP AL,30H
    JS CUO
    SUB AL,30                    ;这里该减 30h
    MOV CL,AL                    ;这里还得有个 mov ah,0  因为之前 al 中获得数字时, ah 是等于 1 的(调用中断时赋的值),所以的清零

之后的运算结果是对的,不过以十六进制形式放在 ax 中了,要显示出十进制的来还得有一些转换工作
2011-06-13 11:47
筐筐的橙
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2011-5-31
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册
运行结果的截图,ax无变化,是怎么回事呢?
2011-06-13 12:03
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
因为你的程序中调用了很多中断
遇到中断的时候要用 p 指令才行
所以 g 指令让很多中断无效了
2011-06-13 12:14
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:0 
楼主应学会使用debug,一步一步的跟踪才能发现问题所在。

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-06-13 12:20
筐筐的橙
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2011-5-31
收藏
得分:0 
那怎么能截上一张能有结果的图呢?求指导~~
2011-06-13 12:23
obstratiker
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:1
帖 子:198
专家分:758
注 册:2011-5-5
收藏
得分:0 
疯狂的 t 然后碰到中断就 p
然后……就,行了
2011-06-13 12:29
筐筐的橙
Rank: 1
等 级:新手上路
帖 子:24
专家分:0
注 册:2011-5-31
收藏
得分:0 
会了,能弄出结果了啊~~~谢了啊~~~~
2011-06-13 12:48
快速回复:求阶乘程序,求帮改改错
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016975 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved