| 网站首页 | 业界新闻 | 群组 | 人才 | 技术文章 | 下载频道 | 博客 | 代码贴 | 编程论坛
绝地游戏外挂辅助教学千里之行 始于足下
共有 95 人关注过本帖
标题:为什么无论输入什么数mistake都执行了?
只看楼主 收藏
九州
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-23
结帖率:0
  问题点数:0  回复次数:4   
为什么无论输入什么数mistake都执行了?
DATAS SEGMENT
    input db 'please input x(0~9):$'
    num1  db  0
    num2  db  9
    x dw ?
    STRING  DB  'Input Error!',13,10,'$'
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 input;取地址
    mov AH,9;实现9号功能,显示字符串
    INT 21H
    MOV AH,1;把十六进制数1(表示为01h)装入ah寄存器
    INT 21H;调用 int 21H 中断,返回值放在 al寄存器中
    AND AL,0FH;取AL低四位
    cmp num1,AL
    JBE next1
    ;jmp mistake
next1:
      cmp al,num2
      jbe next2
     ; jmp mistake
next2:
    mov ah,0
    mov bx,ax
    mul ax
    mul ax
    div bx
    mov x,ax
mistake:
    LEA  DX,STRING
    MOV  AH,9
    INT  21H
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START
2017-11-26 20:26
九州
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-23
  得分:0 
看的时候把jmp前的“;”去掉啊,
2017-11-26 20:28
九州
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-23
  得分:0 
题目:从键盘输入0~9中的任意数,如果输入的字符在这个范围内,计算它的立方值,反之显示输入错误信息。
2017-11-26 20:39
九州
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2017-11-23
  得分:0 
DATAS SEGMENT
    input db 'please input x(0~9):$'
    num1  db  0
    num2  db  9
    x dw ?
    STRING  DB  'Input Error!',13,10,'$'
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 input;取地址
    mov AH,9;实现9号功能,显示字符串
    INT 21H
    MOV AH,1;把十六进制数1(表示为01h)装入ah寄存器
    INT 21H;调用 int 21H 中断,返回值放在 al寄存器中
    AND AL,0FH;取AL低四位
    mov bl,num1
    cmp AL,bl
    JB mistake
    mov bl,num2
    cmp al,bl
    ja mistake   
    mov ah,0
    mov bx,ax
    mul ax
    mul ax
    div bx
    mov x,ax
exit:
     MOV AH,4CH
    INT 21H
mistake:
    LEA  DX,STRING
    MOV  AH,9
    INT  21H
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START


改后可以了,为什么?
2017-11-26 21:15
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:160
专家分:913
注 册:2016-5-15
  得分:0 
答案正确未必表示思路就对了,尤其MUL AX二次后再DIV BX,这样相当于 X^4 / X ,做法并不可取.
下面是功能相若的简化代码,扬弃了一些不必要的东西(例如设定栈).
;------------------
DATAS SEGMENT
    input db 'please input x(0~9):$'
    x dw ?
    STRING DB 10,13,'Input Error!$'
DATAS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov DX,offset input;取地址
    mov AH,9;实现9号功能,显示字符串
    INT 21H
    MOV AH,1;把十六进制数1(表示为01h)装入ah寄存器
    INT 21H;调用 int 21H 中断,返回值放在 al寄存器中
    SUB AL,'0' ;减'0',若输入是数字,会变成0-9的值
    CMP AL,9
    JA mistake ;大于9则不是数字
    MOV BL,AL
    MUL BL
    MUL BL
    MOV X,AX
    JMP SHORT EXIT
mistake:
    LEA  DX,STRING
    MOV  AH,9
    INT  21H
EXIT:
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

7 天前 19:30







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

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