注册 登录
编程论坛 汇编论坛

为什么无论输入什么数mistake都执行了?

九州 发布于 2017-11-26 20:26, 2741 次点击
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
4 回复
#2
九州2017-11-26 20:28
看的时候把jmp前的“;”去掉啊,
#3
九州2017-11-26 20:39
题目:从键盘输入0~9中的任意数,如果输入的字符在这个范围内,计算它的立方值,反之显示输入错误信息。
#4
九州2017-11-26 21:15
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


改后可以了,为什么?
#5
Valenciax2017-12-05 19:30
答案正确未必表示思路就对了,尤其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

1