主题:问题:判断输入的数字是否在-128~+127之间
忘忧→志在必得
[专家分:120] 发布于 2007-04-25 17:56:00
最近在写一个汇编程序,首先要求判断输入的数字是否在-128~+127范围内。
我的思想是:用DOS10号功能调用实现输入数字,再从键盘缓冲区取出输入的值与-128以及+127比较。
比较部分我会写,就是不知道怎么取输入的数值。
另外,我想问,输入的数字存到键盘缓冲区是以ASCII码还是其他形式呢?
负数应该是以补码存的吧?
最后更新于:2007-04-27 21:36:00
回复列表 (共10个回复)
沙发
小牛斑斑 [专家分:1210] 发布于 2007-04-26 18:18:00
负数应该是以补码存的吧?
就是以补码存储的
输入的数字存到键盘缓冲区是以ASII码还是其他形式呢?
击键时是扫描马,然后转换成ASII码
板凳
忘忧→志在必得 [专家分:120] 发布于 2007-04-26 22:10:00
我说具体点吧。
定义如下键盘缓冲区:
BUF DB 20
DB ?
DB 20 DUP(?)
通过10号调用输入:
MOV AH,10
LEA DX,BUF
INT 21H
我想问,假如输入-129
怎么取出它与-128比较。
3 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-27 21:31:00
我经过自己编程测试了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 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-28 20:39:00
我发现并不是TEST之后接着用CMP,与CMP接着的TEST无效。
CMP [BUF+4],'2'是在[BUF+3]小于等于1的前提下的,错在这里。
5 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-28 20:53:00
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 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-28 21:21:00
BUF不定义为DB的会简单很多,郁闷了。
想过的,只是在脑袋里闪过,没去试。
同学提醒我的。
7 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-29 16:15:00
BUF定义为DW的,里面仍然存的是输入字符的ASCII码,并没有简化问题。
因为10号调用把输入的数字当字符串处理的。
难道要改输入?
8 楼
忘忧→志在必得 [专家分:120] 发布于 2007-04-29 16:16:00
上面判断范围的方法出问题了。
我想换一种思路:
以判断输入的负数是否在-128到-1范围为例,输入的负数
[BUF+6]不为空则输出EROOR!为空则在[BUF+5]不为空
的前提下,分别取出[BUF+3]、[BUF+4]、[BUF+5]里的
内容(ASCII码)都减去30H,再分别乘100、10、1,求
和与128比较。[BUF+5]为空则直接跳转(在范围内)。
9 楼
忘忧→志在必得 [专家分:120] 发布于 2007-05-05 01:03:00
以判断输入的负数是否在-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 楼
忘忧→志在必得 [专家分:120] 发布于 2007-05-05 23:39:00
新思路(已实现):
首先判断输入的数字是正还是负,接着判断位数,大于三位就溢出了,是三位的话,比较第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
现在在思考判断输入的是否为数字的部分。
又卡住了。
我来回复