回 帖 发 新 帖 刷新版面

主题:问题:判断输入的数字是否在-128~+127之间

    最近在写一个汇编程序,首先要求判断输入的数字是否在-128~+127范围内。
我的思想是:用DOS10号功能调用实现输入数字,再从键盘缓冲区取出输入的值与-128以及+127比较。
    比较部分我会写,就是不知道怎么取输入的数值。
    另外,我想问,输入的数字存到键盘缓冲区是以ASCII码还是其他形式呢?
    负数应该是以补码存的吧?
    

    

回复列表 (共10个回复)

沙发

负数应该是以补码存的吧?
就是以补码存储的
输入的数字存到键盘缓冲区是以ASII码还是其他形式呢?
击键时是扫描马,然后转换成ASII码

板凳

我说具体点吧。
定义如下键盘缓冲区:
BUF     DB 20
        DB ?
        DB 20 DUP(?)

通过10号调用输入:
MOV AH,10
    LEA DX,BUF
    INT 21H


我想问,假如输入-129
怎么取出它与-128比较。

3 楼

我经过自己编程测试了BUF里面每个空间的内容,实际BUF(从[BUF+2]开始)每个空间对应输入的1个字符的ASCII码。

以下是通过TEST确定输入的数字的符号,正则输出1,负则输出-1,0则输出0
已经做到。里面判断输入的数字是否小于-128还没做完,输入一位、二位负数结果都为-1(正确的),但输入三位输出总为ERROR!达不到判定是小于-128则输出ERROR,大于-128则输出-1的目的。不知道错在哪?
DATAS   SEGMENT
INPUT   DB 'Please input a number:$'
OUTPUT1 DB 0AH,0DH,'ERROR!$'
BUF     DB 20
        DB ?
        DB 20 DUP('0')
OUTPUT2 DB 0AH,0DH,'Y='
YH      DB ?
YL      DB ?
Z       DB '$'            
DATAS   ENDS

STACKS SEGMENT
      DB 200 DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    LEA DX,INPUT
    MOV AH,9
    INT 21H
    
    MOV AH,10
    LEA DX,BUF
    INT 21H
    
    
    TEST [BUF+2],0CFH
    JZ   ABOUTY3
    TEST [BUF+2],0D2H
    JZ   ABOUTY2
    JMP  ABOUTY1
   
EXIT:   MOV AH,4CH
        INT 21H
      
ERROR:  LEA DX,OUTPUT1
        MOV AH,9
        INT 21H
        JMP EXIT
           
ABOUTY1:MOV YL,0 
        MOV YH,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY2: TEST [BUF+6],0CFH
         JNZ ERROR
         TEST [BUF+4],0CFH
         JZ  ABOUTY21
         TEST [BUF+5],0CFH
         JZ  ABOUTY21
         CMP [BUF+3],'1'
         JA ERROR
         CMP [BUF+4],'2'
         JA ERROR
         CMP [BUF+4],'2'
         JB ABOUTY21 
         CMP [BUF+5],'8'
         JA ERROR
         JMP ABOUTY21
         JMP EXIT
         

ABOUTY21:
        MOV YH,2DH
        MOV YL,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY3: 
        MOV YH,30H
        MOV YL,0
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT 
    
CODES ENDS
    END START

4 楼

我发现并不是TEST之后接着用CMP,与CMP接着的TEST无效。
 CMP [BUF+4],'2'是在[BUF+3]小于等于1的前提下的,错在这里。

5 楼

DATAS   SEGMENT
INPUT   DB 'Please input a number:$'
OUTPUT1 DB 0AH,0DH,'ERROR!$'
BUF     DB 20
        DB ?
        DB 20 DUP(?)
OUTPUT2 DB 0AH,0DH,'Y='
YH      DB ?
YL      DB ?
Z       DB '$'            
DATAS   ENDS

STACKS SEGMENT
      DB 200 DUP(?)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    
    LEA DX,INPUT
    MOV AH,9
    INT 21H
    
    MOV AH,10
    LEA DX,BUF
    INT 21H
    
    
    TEST [BUF+2],0CFH
    JZ   ABOUTY3
    TEST [BUF+2],0D2H
    JZ   ABOUTY2
    JMP  ABOUTY1
   
EXIT:   MOV AH,4CH
        INT 21H
      
ERROR:  LEA DX,OUTPUT1
        MOV AH,9
        INT 21H
        JMP EXIT
           
ABOUTY1:MOV YL,0 
        MOV YH,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY2: TEST [BUF+6],0FFH
         JNZ ERROR
         TEST [BUF+4],0FFH
         JZ  ABOUTY21
         TEST [BUF+5],0FFH
         JZ  ABOUTY21
         CMP [BUF+4],'2'
         JA ERROR
         CMP [BUF+4],'2'
         JB ABOUTY21 
         CMP [BUF+5],'8'
         JA ERROR
         JMP ABOUTY21
         JMP EXIT
         

ABOUTY21:
        MOV YH,2DH
        MOV YL,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY3: 
        MOV YH,30H
        MOV YL,0
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT 
    
CODES ENDS
    END START



为避免上面的错误,我跳过了[BUF+3]与‘1’的比较,后来才发现这也是错误的。

6 楼

BUF不定义为DB的会简单很多,郁闷了。
想过的,只是在脑袋里闪过,没去试。
同学提醒我的。

7 楼

BUF定义为DW的,里面仍然存的是输入字符的ASCII码,并没有简化问题。
因为10号调用把输入的数字当字符串处理的。
难道要改输入?

8 楼

上面判断范围的方法出问题了。
我想换一种思路:
以判断输入的负数是否在-128到-1范围为例,输入的负数
[BUF+6]不为空则输出EROOR!为空则在[BUF+5]不为空
的前提下,分别取出[BUF+3]、[BUF+4]、[BUF+5]里的
内容(ASCII码)都减去30H,再分别乘100、10、1,求
和与128比较。[BUF+5]为空则直接跳转(在范围内)。

9 楼

以判断输入的负数是否在-128到-1范围为例,输入的负数
[BUF+6]不为空则输出EROOR!为空则在[BUF+5]不为空
的前提下,分别取出[BUF+3]、[BUF+4]、[BUF+5]里的
内容(ASCII码)都减去30H,再分别乘100、10、1,求
和与128比较。[BUF+5]为空则直接跳转(在范围内)。

没完全实现:
...
   
    TEST [BUF+2],0CFH
    JZ   ABOUTY3
    TEST [BUF+2],0D2H
    JZ   ABOUTY2
    JMP  ABOUTY1
    JMP EXIT
   
EXIT:   MOV AH,4CH
        INT 21H
      
ERROR:  LEA DX,OUTPUT1
        MOV AH,9
        INT 21H
        JMP EXIT
           
ABOUTY1: TEST [BUF+5],0BEH
         JNZ ERROR
        
         CMP [BUF+3],'0'
         JB ABOUTY11
         CMP [BUF+3],'9'
         JA ABOUTY11
         CMP [BUF+4],'0'
         JB ABOUTY11
         CMP [BUF+4],'9'
         JA ABOUTY11
        
         MOV AL,[BUF+2]
         SUB AL,30H
         MOV CL,100
         MUL CL
         MOV DAT1,AX
         
         MOV AX,0
         MOV AL,[BUF+3]
         SUB AL,30H
         MOV CL,10
         MUL CL
         MOV DAT2,AX
        
         MOV AX,0
         MOV BX,DAT1
         MOV CX,DAT2 
         ADD BX,CX
         MOV DAT3,BX
         
         MOV AX,0
         MOV AL,[BUF+4]
         SUB AL,30H
         MOV CX,DAT3
         ADD AX,CX
         MOV DAT4,AX
         
         MOV CX,0
         MOV CX,127
         MOV AX,DAT4
         CMP AX,CX
         JNA ABOUTY11
         JMP  ERROR
         JMP EXIT
ABOUTY11: MOV YL,0 
        MOV YH,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY2:  
         CMP [BUF+4],'0'
         JB ABOUTY21
         CMP [BUF+4],'9'
         JA ABOUTY21
         CMP [BUF+5],'0'
         JB ABOUTY21
         CMP [BUF+5],'9'
         JA ABOUTY21
         
         MOV AL,[BUF+3]
         SUB AL,30H
         MOV CL,100
         MUL CL
         MOV DAT1,AX
         
         MOV AX,0
         MOV AL,[BUF+4]
         SUB AL,30H
         MOV CL,10
         MUL CL
         MOV DAT2,AX
        
         MOV AX,0
         MOV BX,DAT1
         MOV CX,DAT2 
         ADD BX,CX
         MOV DAT3,BX
         
         MOV AX,0
         MOV AL,[BUF+5]
         SUB AL,30H
         MOV CX,DAT3
         ADD AX,CX
         MOV DAT4,AX
         
         MOV CX,0
         MOV CX,128
         MOV AX,DAT4
         CMP AX,CX
         JNA ABOUTY21
         JMP  ERROR
         JMP EXIT
         

ABOUTY21:
        MOV YH,2DH
        MOV YL,31H
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT  
ABOUTY3: 
        MOV YH,30H
        MOV YL,0
        LEA DX,OUTPUT2 
        MOV AH,9
        INT 21H
        JMP EXIT 
    
CODES ENDS
    END START

10 楼

新思路(已实现):
首先判断输入的数字是正还是负,接着判断位数,大于三位就溢出了,是三位的话,比较第1位,大于1则溢出,是1的就接着判断下一位...
DATAS   SEGMENT
INPUT   DB 'Please input a number:$'
OUTPUT1 DB 0AH,0DH,'ERROR!$'
BUF     DB 20
        DB ?
        DB 20 DUP(?)
OUTPUT2 DB 0AH,0DH,'Y='
YH      DB ?
YL      DB ?
Z       DB '$'           
DATAS   ENDS
STACKS SEGMENT
      DB 200 DUP(?)
STACKS ENDS
CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
    LEA DX,INPUT
    MOV AH,9
    INT 21H
   
    MOV AH,10
    LEA DX,BUF
    INT 21H
    
    CMP  BUF+1,4
    JA  ERROR
   
    TEST [BUF+2],0CFH
    JZ   ABOUTY3
    TEST [BUF+2],0D2H
    JZ   ABOUTY2
    JMP  ABOUTY1
  
EXIT:   MOV AH,4CH
        INT 21H
     
ERROR:  LEA DX,OUTPUT1
        MOV AH,9
        INT 21H
        JMP EXIT
          
ABOUTY1: CMP [BUF+1],3
         JA ERROR
         CMP BUF+1,2
         JNA ABOUTY11
         CMP [BUF+2],'1'
         JA ERROR
         CMP [BUF+3],'2'
         JA ERROR
         CMP [BUF+3],'2'
         JB ABOUTY11
         CMP [BUF+4],'7'
         JA ERROR
         JMP ABOUTY11
         JMP EXIT
ABOUTY11:MOV YL,0
         MOV YH,31H
         LEA DX,OUTPUT2
         MOV AH,9
         INT 21H
         JMP EXIT 
ABOUTY2:
         CMP BUF+1,3
         JNA ABOUTY21
         CMP [BUF+3],'1'
         JA ERROR
         CMP [BUF+4],'2'
         JA ERROR
         CMP [BUF+4],'2'
         JB ABOUTY21
         CMP [BUF+5],'8'
         JA ERROR
         JMP ABOUTY21
         JMP EXIT
        
ABOUTY21:
        MOV YH,2DH
        MOV YL,31H
        LEA DX,OUTPUT2
        MOV AH,9
        INT 21H
        JMP EXIT 

ABOUTY3:
        MOV YH,30H
        MOV YL,0
        LEA DX,OUTPUT2
        MOV AH,9
        INT 21H
        JMP EXIT
   
CODES ENDS
    END START

现在在思考判断输入的是否为数字的部分。
又卡住了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册