| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1495 人关注过本帖
标题:判断输入的数字是否在-128~+127之间
取消只看楼主 加入收藏
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
 问题点数:0 回复次数:8 
判断输入的数字是否在-128~+127之间

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

以下是通过TEST确定输入的数字的符号,正则输出1,负则输出-1,0则输出0
已经做到。里面判断输入的数字是否小于-128还没做完,输入一位、二位负数(第二位不大于2)结果为-1,第二位大于2则为ERROR!输入三位输出总为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(?)
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

[此贴子已经被作者于2007-4-29 16:04:06编辑过]

搜索更多相关主题的帖子: 数字 BUF 输入 判断 
2007-04-29 15:31
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 
上面判断范围的方法出问题了,不知道错在哪?
我想换一种思路:
以判断输入的负数是否在-128到-1范围为例,输入的负数
[BUF+6]不为空则输出EROOR!为空则在[BUF+5]不为空
的前提下,分别取出[BUF+3]、[BUF+4]、[BUF+5]里的
内容(ASCII码)都减去30H,再分别乘100、10、1,求
和与128比较。[BUF+5]为空则直接跳转(在范围内)。

[此贴子已经被作者于2007-4-29 16:04:40编辑过]

2007-04-29 15:52
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 
哦,能否具体点?
2007-04-29 21:04
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 
没看明白你说的。
2007-04-30 19:35
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 
照说最上面的一种思路也没问题的,后来发现
TEST [BUF+6],0FFH
JNZ ERROR
根本不起作用,没弄明白原因。
2007-04-30 22:18
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 

DATAS SEGMENT
INPUT DB 'Please input a number:$'
OUTPUT1 DB 0AH,0DH,'ERROR!$'
BUF DB 20
DB ?
DB 20 DUP('A')
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],0BEH
JNZ ERROR
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

例如我把键盘缓冲区全部置'A'
那么通过
TEST [BUF+6],0BEH
JNZ ERROR
...
应该可以实现输入-3456输出ERROR!
输入-345则输出-1
而实际是,输入-345也输出ERROR!

[此贴子已经被作者于2007-4-30 22:32:33编辑过]

2007-04-30 22:31
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 
以下是引用菜鸟上路在2007-4-30 22:27:38的发言:
不要用TEST,TEST不改变标志寄存器,用CMP试试

我是用DOS10号功能调用实现输入数字的,我测试过,输入的数字都当字符串处理了。BUF从[BUF+2]开始每个空间对应一个字符的ASCII码,输入的负数并不是按其补码存储的。即使把BUF定义为DW类型,输入的负数也并未按其补码存储。
将TEST改为CMP,达不到效果,因为这里我想实现的是测试某一位是否存入数字。
看来只能用我的第二种思路了,将输入的数字个位、十位、百位分别乘1、10、100求和,存入一个空间,再将128存入一个空间,两者比较判断。

2007-04-30 23:00
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 

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

没完全实现:
DATAS SEGMENT
INPUT DB 'Please input a number:$'
OUTPUT1 DB 0AH,0DH,'ERROR!$'
DAT1 DW ?
DAT2 DW ?
DAT3 DW ?
DAT4 DW ?
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
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

2007-05-05 00:46
hero2007
Rank: 1
来 自:湖北武汉
等 级:新手上路
威 望:1
帖 子:130
专家分:0
注 册:2007-3-22
收藏
得分:0 

新思路(已实现):

首先判断输入的数字是正还是负,接着判断位数,大于三位就溢出了,是三位的话,比较第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

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

[此贴子已经被作者于2007-5-5 23:33:21编辑过]

2007-05-05 23:30
快速回复:判断输入的数字是否在-128~+127之间
数据加载中...
 
   



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

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