标题:为什么无论输入什么数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
搜索更多相关主题的帖子: 输入 input db MOV INT 
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
等 级:版主
威 望:11
帖 子:337
专家分:2462
注 册: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

2017-12-05 19:30



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-482844-1-1.html




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

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