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

9号功能输出有关问题

2012-03-19 
9号功能输出问题本程序是从键盘输入学生姓名和成绩,按成绩升序排序,并显示结果DATAS SEGMENTINFOR0DB 0AH,

9号功能输出问题
本程序是从键盘输入学生姓名和成绩,按成绩升序排序,并显示结果

DATAS SEGMENT
  INFOR0 DB 0AH,0DH,'SORT=$'
  INFOR1 DB 0AH,0DH,'INPUT NAME:$'
  INFOR2 DB 0AH,0DH,'SCORE:$'
  N EQU 8 ;姓名长度
  M EQU 4 ;成绩长度(3位+回车符)
  P EQU 3 ;输入的人数
  Q EQU 3 ;成绩位数
  BUFF1 DB N,?,N DUP(0),'$'  
  BUFF2 DB M,?,M DUP(0),'$'
  SNAME DB P DUP(N+1 DUP(0)) ;保存姓名
  SCORE1 DW P DUP(M+1 DUP(0)) ;保存成绩
  SCORE2 DW P DUP(M+1 DUP(0))
  CIXU DB P DUP(0) ;输入次序
  X DW ?
  SIGN1 DW 0
  SIGN2 DW 0
  CONT DB '1'
DATAS ENDS

CODES SEGMENT
  ASSUME CS:CODES,DS:DATAS
   
MAIN PROC FAR  
START:

  MOV AX,DATAS
  MOV DS,AX
  MOV ES,AX
  MOV BX,0
  MOV CX,0
  CALL INPUT
  CALL SORT
  CALL PRINT
  MOV AH,4CH
  INT 21H  
   
  MOV AH,4CH
  INT 21H
   
MAIN ENDP 
;输入姓名成绩
INPUT PROC 

  INC BX
  CMP BX,P
  JA EXIT
  LEA DX,INFOR1
  MOV AH,9
  INT 21H
  LEA DX,BUFF1
  MOV AH,10
  INT 21H
  MOV AL,BUFF1+1 ;实际输入个数
  ADD AL,2 ;加2,包含buff1的0,1号单元
  MOV AH,0  
  MOV SI,AX  
  MOV BUFF1[SI],0 ;回车0d换为0,便于输出显示
   
  LEA DX,INFOR2
  MOV AH,9
  INT 21H
   
  MOV AL,BUFF2+1
  ADD AL,2
  MOV AH,0
  MOV SI,AX
  MOV BUFF2[SI],0  
   
  MOV CIXU[BX-1],BL
   
  CMP BX,1
  JZ LET1
  ADD SIGN1,N+1
  ADD SIGN2,Q
  LET1:
  CALL COPY
  JMP INPUT
  EXIT:
  RET
INPUT ENDP 
;数据转存
COPY PROC
   
  MOV CX,N+1
  LEA SI,BUFF1+2
  LEA DI,SNAME
  ADD DI,SIGN1
  CLD
  REP MOVSB
  MOV CX,N
  MOV AX,'$'
  LEA DI,BUFF1+2
  REP STOSB
  MOV CX,M+1
  LEA SI,BUFF2+2
  LEA DI,SCORE1
  ADD DI,SIGN2
  CLD
  REP MOVSB
  LEA SI,BUFF2+2
  MOV DI,SIGN2
  CALL CHANGE
  RET
COPY ENDP
;十进制数ASCII→二进制
CHANGE PROC
  MOV X,0
  MOV CX,[SI-1]
  AND CX,000FH
  REPT2: 
  MOV AL,[SI]
  CMP AL,30H
  JL EXIT1
  CMP AL,39H
  JG EXIT1
  AND AX,000FH
  XCHG AX,X
  MOV DX,10
  MUL DX
  ADD X,AX
  INC SI
  LOOP REPT2
  MOV AX,X
  MOV SCORE2[DI],AX
  MOV X,0
  ADD SIGN2,2
  EXIT1:RET
CHANGE ENDP
;排序
SORT PROC

  MOV CX,P
  DEC CX
  LOOP1:PUSH CX
  MOV BX,0
  MOV SI,0
  LOOP2:MOV AX,SCORE2[BX]
  CMP AX,SCORE2[BX+M+1]
  JGE NEXT
  XCHG AX,SCORE2[BX+M+1]
  MOV SCORE2[BX],AX
  MOV AL,CIXU[SI]
  XCHG AL,CIXU[SI+1]
  MOV CIXU[SI],AL


  NEXT:ADD BX,M+1
  INC SI
  LOOP LOOP2
  POP CX
  LOOP LOOP1
  RET
SORT ENDP
;输出
PRINT PROC 
   
  LEA DX,INFOR0
  MOV AH,9
  INT 21H
  MOV CX,P
  MOV BX,0
  MOV AX,0
  MOV DI,0
  REPT3:
  MOV DL,0AH
  MOV AH,2
  INT 21H
  MOV DL,0DH
  INT 21H
  MOV DL,CONT
  MOV AH,2
  INT 21H
  INC CONT
  MOV DL,0AH
  MOV AH,2
  INT 21H
  MOV DL,0DH
  INT 21H
  MOV AX,0
  MOV AL,CIXU[DI]
  DEC AL
  MOV BL,9
  MUL BL
  LEA DX,SNAME
  ADD DX,AX
  MOV AH,9
  INT 21H
  MOV DL,0AH
  MOV AH,2
  INT 21H
  MOV DL,0DH
  MOV AH,2
  INT 21H
  MOV AX,0
  MOV BX,0
  MOV AL,CIXU[DI]
  DEC AL
  MOV BL,5
  MUL BL
  LEA DX,SCORE1 
  ADD DX,AX
  MOV AH,9
  INT 21H
  INC DI
  LOOP REPT3
  RET
PRINT ENDP  
   
CODES ENDS
  END START


为什么这里将回车换成0会便于输出呢。为什么它能正确输出呢?用9号功能不是碰到$符号是结束吗。而这个程序似乎是为每一个姓名或成绩分配了一个固定长度的缓冲区,$符号是放在最后面的。如果输入的姓名没有达到固定长度时就会有空余字符,按理说是会输出乱码的,但它却正常输出了,费解!
这是一个郑晓薇《汇编语言》的一个程序,有看懂的能解释一下么

[解决办法]
乱码,0 字节不会乱码吧,显示的是空白而已,所以,即便是不足长度,也是看不出来的。
[解决办法]

探讨
本程序是从键盘输入学生姓名和成绩,按成绩升序排序,并显示结果

DATAS SEGMENT
INFOR0 DB 0AH,0DH,'SORT=$'
INFOR1 DB 0AH,0DH,'INPUT NAME:$'
INFOR2 DB 0AH,0DH,'SCORE:$'
N EQU 8 ;姓名长度
M EQU 4 ;成绩长度(3位+回车符)
P EQU 3 ;输……

热点排行