首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

哪位高手能帮小弟我修改一下这个汇编程序

2012-02-21 
谁能帮我修改一下这个汇编程序这个程序的问题是:1.输入三位数或以上就只显示后两位.2.如果输入错误,无法用

谁能帮我修改一下这个汇编程序
这个程序的问题是: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


[解决办法]
unavailable to me
up~
[解决办法]
第一个容易实现,第二个是否可以理解为直接屏蔽退格键?(输入错误的不给改,输入正确的那还改什么)
[解决办法]
输入错误不让修改,输入正确不用修改,第二个问题的功能根本没实用价值
[解决办法]
我的看法:

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

请问目前作什么软件,居然还在使用DOS INT 21H 功能?
[解决办法]
第二个是否可以理解为直接屏蔽退格键?(输入错误的不给改,输入正确的那还改什么)


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


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

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

========
楼主的意思是指自己写的这个程序中存在这两个问题,希望大家帮他解决。。。。

[解决办法]
首先先介绍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)能被一个字型数据装下吗?

[解决办法]
学习学习
[解决办法]
学习,高手,我看不了这么长

热点排行