| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 542 人关注过本帖
标题:请看下这个汇编程序怎了了
只看楼主 加入收藏
jy1075518049
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-13
结帖率:100%
收藏
已结贴  问题点数:5 回复次数:7 
请看下这个汇编程序怎了了
程序代码:
DATAS SEGMENT
     SHU DB -122,23,54,68,78,98;此处输入数据段代码 
     N EQU $-SHU
DATAS ENDS

STACKS SEGMENT
    DW 256 DUP(?)
    TOP LABEL WORD;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
XIANSHI PROC
    CMP BL,9
    JBE    XIAO
    ADD BL,7
XIAO:
    ADD BL,30H;一定注意是30H
    MOV DL,BL;显示出BL中的字符
    MOV AH,2
    INT 21H
    RET
    XIANSHI ENDP;子程序结束

START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    LEA SP,TOP
        ;此处输入代码段代码
    LEA DI,SHU
    MOV CX,N   
REPET:
    PUSH CX
    MOV AL,[DI]
    PUSH AX;先把AX暂存一下,下面INT 21会破坏
    AND AL,AL
    JNS ZHENG
    MOV DL,'-';负数,先把符号显示出来
    MOV AH,02H   
    INT 21H
    POP AX
    NEG AL
ZHENG:
    CMP AL,99
    JBE LIANG
    CBW;三位数,先把百位显示出来,假设128
    MOV BH,100
    DIV BH;百位是商1
    MOV BL,AL;商放入BL
    PUSH AX;暂存余数
    CALL XIANSHI
    POP AX;余数出来
    MOV AL,AH;AH保存是余数28
    CBW
    MOV BH,10
    DIV BH
    MOV BL,AL;商是2十位
    PUSH AX
    CALL XIANSHI
    POP AX
    MOV BL,AH;余数8是个位
    CALL XIANSHI
    MOV DL,','
    MOV AH,2
    INT 21H;显示","
    JMP XIA
LIANG:;两位数
    CBW
    MOV BL,10
    DIV BL
    MOV BL,AL;商——十位
    MOV CL,AH;余数——个位
    CALL XIANSHI;显示十位
    MOV BL,CL
    CALL XIANSHI;显示个位
    ;到此一个数显示完毕
    MOV DL,','
    MOV AH,2
    INT 21H;显示","
   
XIA:
    INC DI
    POP CX
    LOOP REPET; 去掉这一句就一切正常?请问怎么回事

           
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START









我想要把定义的数字都显示出来,但是在循环处有问题,请高手帮忙看看,多谢!
怎么没有人回复呀

[ 本帖最后由 jy1075518049 于 2012-11-14 15:11 编辑 ]
2012-11-13 21:15
炎黄宇宙
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:53
专家分:104
注 册:2012-11-12
收藏
得分:0 
想回复,不会做。
2012-11-15 14:27
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
以下是引用炎黄宇宙在2012-11-15 14:27:48的发言:

想回复,不会做。
哪岂不是在灌水?

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-15 14:32
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
XIA:
    INC DI
    POP CX
    LOOP REPET; 程序执行到这里就被强行跳转到前面去循环了,当然不会再执行后面的语句了。所以去掉这一句就一切正常了。

           
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2012-11-15 14:34
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:5 
程序代码:
;#Mode=DOS
DATAS SEGMENT
     SHU DB -122,-23,54,68,78,98;此处输入数据段代码
     N EQU $-SHU
DATAS ENDS

STACKS SEGMENT
    DW 256 DUP(?)
    TOP LABEL WORD;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
XIANSHI PROC
    CMP BL,9
    JBE    XIAO
    ADD BL,7
XIAO:
    ADD BL,30H;一定注意是30H
    MOV DL,BL;显示出BL中的字符
    MOV AH,2
    INT 21H
    RET
    XIANSHI ENDP;子程序结束

START:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    LEA SP,TOP
        ;此处输入代码段代码
    LEA DI,SHU
    MOV CX, N
REPET:
    PUSH CX
    MOV AL,[DI]
    mov ah, 0
    ;PUSH AX;先把AX暂存一下,下面INT 21会破坏
    mov    bx, ax
    AND AL,AL
    JNS ZHENG
    MOV DL,'-';负数,先把符号显示出来
    MOV AH,02H  

    INT 21H
    mov    ax, bx
    NEG AL
ZHENG:
    CMP AL,99
    JBE LIANG
    CBW;三位数,先把百位显示出来,假设128
    MOV BH,100
    DIV BH;百位是商1
    MOV BL,AL;商放入BL
    PUSH AX;暂存余数
    CALL XIANSHI
    POP AX;余数出来
    MOV AL,AH;AH保存是余数28
    CBW
    MOV BH,10
    DIV BH
    MOV BL,AL;商是2十位
    PUSH AX
    CALL XIANSHI
    POP AX
    MOV BL,AH;余数8是个位
    CALL XIANSHI
    MOV DL,','
    MOV AH,2
    INT 21H;显示","
    JMP XIA
LIANG:;两位数
    CBW
    MOV BL,10
    DIV BL
    MOV BL,AL;商——十位
    MOV CL,AH;余数——个位
    CALL XIANSHI;显示十位
    MOV BL,CL
    CALL XIANSHI;显示个位
    ;到此一个数显示完毕
    MOV DL,','
    MOV AH,2
    INT 21H;显示","
  

XIA:
    INC DI
    POP CX
    LOOP REPET; 去掉这一句就一切正常?请问怎么回事

    mov    ah, 01h
    int    21H
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
要循环显示必须有LOOP指令 、上面是我给你改的 注意下ax值和PUSH 操作
图片附件: 游客没有浏览图片的权限,请 登录注册



[ 本帖最后由 有容就大 于 2012-11-16 00:01 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-11-16 00:00
jy1075518049
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-13
收藏
得分:0 
回复 5楼 有容就大
楼主你真强啊,可是我不明白为什么用push和pop就有问题呢?
2012-11-16 09:42
jy1075518049
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2012-11-13
收藏
得分:0 
回复 4楼 hu9jj
你没明白什么意思....
2012-11-16 11:28
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
以下是引用jy1075518049在2012-11-16 09:42:33的发言:

楼主你真强啊,可是我不明白为什么用push和pop就有问题呢?

你程序的结构是 push cx,  push ax, 判断是否为正数 否则pop ax, pop cx 是则pop cx
很明显 如果是个正数的话 push 和 pop 是不对应的。会引起CX值的混乱。
所以有条件跳转的时候最好不要用push pop指令 。当然安排的合理也无所谓 你可以去试试 。

梅尚程荀
马谭杨奚







                                                       
2012-11-16 12:24
快速回复:请看下这个汇编程序怎了了
数据加载中...
 
   



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

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