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

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

hero2007 发布于 2007-04-29 15:31, 1497 次点击

我经过自己编程测试了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编辑过]

13 回复
#2
hero20072007-04-29 15:52
上面判断范围的方法出问题了,不知道错在哪?
我想换一种思路:
以判断输入的负数是否在-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编辑过]

#3
爱以走远2007-04-29 17:16

你这种思路还是可以 我做个一次 不过用寄存器的时候要用好

#4
hero20072007-04-29 21:04
哦,能否具体点?
#5
爱以走远2007-04-29 21:14
在输入数的时候 先输入一个数字 在判断下一个是不是数字 如是的 就将前面的哪个数字乘10
在和才输入的数字相加 在判断输入的是不是数字 。。。。。。
这样 就把数输入进去拉撒
你不是这样的吗
#6
hero20072007-04-30 19:35
没看明白你说的。
#7
菜鸟上路2007-04-30 20:18
以下是引用hero2007在2007-4-29 15:52:02的发言:
上面判断范围的方法出问题了,不知道错在哪?
我想换一种思路:
以判断输入的负数是否在-128到-1范围为例,输入的负数
[BUF+6]不为空则输出EROOR!为空则在[BUF+5]不为空
的前提下,分别取出[BUF+3]、[BUF+4]、[BUF+5]里的
内容(ASCII码)都减去30H,再分别乘100、10、1,求
和与128比较。[BUF+5]为空则直接跳转(在范围内)。


这种思路比较清晰

#8
hero20072007-04-30 22:18
照说最上面的一种思路也没问题的,后来发现
TEST [BUF+6],0FFH
JNZ ERROR
根本不起作用,没弄明白原因。
#9
菜鸟上路2007-04-30 22:27
不要用TEST,TEST不改变标志寄存器,用CMP试试
#10
hero20072007-04-30 22:31

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编辑过]

#11
hero20072007-04-30 23:00
以下是引用菜鸟上路在2007-4-30 22:27:38的发言:
不要用TEST,TEST不改变标志寄存器,用CMP试试

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

#12
菜鸟上路2007-05-02 13:45
存储还是原码,但运算是补码
#13
hero20072007-05-05 00:46

以判断输入的负数是否在-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

#14
hero20072007-05-05 23:30

新思路(已实现):

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

1