谁能帮我修改一下这个汇编程序

djhdehao 2007-07-12 05:06:00
这个程序的问题是:1.输入三位数或以上就只显示后两位. 2.如果输入错误,无法用回格键修改.
谁帮我解决这两个问题???万分感激.
代码如下:
CRLF MACRO
MOV AH,02H
MOV DL,0DH
INT 21H
MOV AH,02H
MOV DL,0AH
INT 21H
ENDM
SPA MACRO
MOV AH,02H
MOV DL,20H
INT 21H
ENDM
DATA SEGMENT
MESS DB 'INPUT NUMBER:',0DH,0AH,'$'
ERROR DB 'INPUT ERROR!',0DH,0AH,'$'
RESULT DB 'THE RESULT IS:',0DH,0AH,'$'
N DW 0
ORG 1000H
SCORE DW 15 DUP (?)
DATA ENDS
;STACK SEGMENT
;STA DW 17 DUP(?)
;TOP DW ?
;STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
START: MOV AX,DATA
MOV ES,AX
MOV DS,AX
; MOV SP,TOP
MOV SI,OFFSET SCORE
MOV AL,0FFH
MOV [SI-2],AL
MOV CX,0FH
UUU: CALL GETNUM
MOV [SI],DL
CALL PAIXU
PUSH CX
PUSH SI
MOV AX,N
INC AX
MOV N,AX
MOV CX,AX
MOV SI, OFFSET SCORE
MOV AH,09H
MOV DX,OFFSET RESULT
INT 21H

WWW: MOV AL,[SI]

CALL DISP1
SPA
INC SI
LOOP WWW
POP SI
POP CX
INC SI
B: CRLF
LOOP UUU


MOV AX,4C00H
INT 21H
A: POP CX
INC CX
JMP B
GETNUM PROC NEAR
PUSH CX
XOR DX,DX
MOV AH,09H
MOV DX,OFFSET MESS
INT 21H

GGG: MOV AH,01H
INT 21H
CMP AL,0DH ;回车
JZ PPP
CMP AL,20H ;空格
JZ PPP
SUB AL,30H
JB KKK
CMP AL,0AH
JB GETS
CMP AL,11H
JB KKK
SUB AL,07H
CMP AL,0FH
JBE GETS
CMP AL,2AH
JB KKK
CMP AL,2FH
JA KKK
SUB AL,20H
GETS: MOV CL,04
SHL DX,CL
XOR AH,AH
ADD DX,AX
JMP GGG
KKK: SPA ;输出错误信息
MOV AH,09H
MOV DX,OFFSET ERROR
INT 21H
JMP A
PPP: PUSH DX
CRLF
POP DX
POP CX
RET
DISP1 PROC NEAR
PUSH CX
MOV BL,AL
MOV DL,BL
MOV CL,04
ROL DL,CL
AND DL,0FH
CALL DISPL
MOV DL,BL
AND DL,0FH
CALL DISPL
POP CX
RET
DISP1 ENDP
DISPL PROC NEAR
ADD DL,30H
CMP DL,3AH
JB DDD
ADD DL,27H
DDD: MOV AH,02H
INT 21H
RET
DISPL ENDP
PAIXU PROC NEAR
PUSH SI
AA: MOV AL,[SI]
CMP AL,[SI-1]
JAE TUI
XCHG AL,[SI-1]
MOV [SI],AL
DEC SI
JMP AA
TUI: POP SI
RET
PAIXU ENDP

GETNUM ENDP
CODE ENDS
END START
...全文
249 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwalwg 2007-07-15
  • 打赏
  • 举报
回复
学习,高手,我看不了这么长
paullbm 2007-07-14
  • 打赏
  • 举报
回复
第二个是否可以理解为直接屏蔽退格键?(输入错误的不给改,输入正确的那还改什么)


输入错误不让修改,输入正确不用修改,第二个问题的功能根本没实用价值



========================
看来以上两位兄弟没有弄清楚楼主的意思。。。

--------------
这个程序的问题是:1.输入三位数或以上就只显示后两位. 2.如果输入错误,无法用回格键修改.
谁帮我解决这两个问题???

========
楼主的意思是指自己写的这个程序中存在这两个问题,希望大家帮他解决。。。。
ReverseEngineering 2007-07-14
  • 打赏
  • 举报
回复
学习学习
paullbm 2007-07-14
  • 打赏
  • 举报
回复
首先先介绍DOS中断的两个子功能吧:

(1)、功能01H
功能描述:从标准输入设备(如:键盘)读入一个字符。该中断在处理过程中将一直处于等待状态直到有字符可读为止。该输入还可被重定向,如果这样做,则无法判断文件是否已到文件尾
入口参数:AH=01H,过滤掉控制字符,并回显
出口参数:AL=输入字符的ASCII码

(8)、功能0AH
功能描述:从标准输入设备上读入一个字节字符串,遇到“回车键”结束输入(输入的字符在标准的输出设备上有回显)。如果该输入操作被重定向,那么,将无法判断文件是否已到文件尾
入口参数:AH=0AH
DS:DX=存放输入字符的起始地址
接受输入字符串缓冲区的定义说明:
  1、第一个字节为缓冲区的最大容量,可认为是入口参数;
  2、第二个字节为实际输入的字符数(不包括回车键),可看作出口参数;
  3、从第三个字节开始存放实际输入的字符串;
  4、字符串以回车键结束,回车符是接受的最后一个字符;
  5、若输入的字符数超过缓冲区的最大容量,则多出的部分被丢弃,系统并发出响铃,直到输入“回车”键才结束输入。
例如:
  BUFF 80, ?, 80 DUP(?)   ;最多接受80个字符
出口参数:无



================
搞清楚了这两个子功能。由楼主在程序中用到的通过1号子功能来接收数据,并且每输入一个数据进行一次判断。楼主说“如果输入错误,无法用回格键修改.”,事实上,即使是输入正确时也会出现此情况。比如我想输入一个十进数68,结果我输成66了,这时我就需要退格消退一个6,此时因为退格键的ASCII码值(=8)不符合程序中的判定要求所以便在“SUB AL,30H /JB KKK”跳到标号KKK处输出错误提示信息。所以要想彻底解决这个问题,建议将1号子功能换成9号子功能。
对于数据个数的统计完全可以用 “INC N” 来控制,没有必要用到 "MOV AX,N/INC AX,MOV N,AX"来浪费时间。并且调用9号子功能来接收数据要方便得多!!

至于第一个问题——“输入三位数或以上就只显示后两位”,是因为在数据定义及其处理方面有问题。当然,数据的定义是处理的基础。你定义了什么样的数据,就应该采用什么样的处理方式。你想想看,如果一个大于两位的数据(比如十进数123)所表示出来的字符形式的数据'123'(相当于31h,32h,33h)能被一个字型数据装下吗?
wubangmi 2007-07-13
  • 打赏
  • 举报
回复
输入错误不让修改,输入正确不用修改,第二个问题的功能根本没实用价值
w_Howard 2007-07-13
  • 打赏
  • 举报
回复
我的看法:

(1)GETNUM返回后只保存了DL值,DL当然只能容纳两位,DH给丢掉了。
(2)BACKSPACE不能用,应该是你使用的中断调用本身的问题吧。

请问目前作什么软件,居然还在使用DOS INT 21H 功能?
czlyc006 2007-07-12
  • 打赏
  • 举报
回复
第一个容易实现,第二个是否可以理解为直接屏蔽退格键?(输入错误的不给改,输入正确的那还改什么)
dgqfeng 2007-07-12
  • 打赏
  • 举报
回复
unavailable to me
up~

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧