⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 text4.asm

📁 汇编课程设计
💻 ASM
📖 第 1 页 / 共 4 页
字号:
              PUSH      AX
       	  MOV 	AX,0b800h
   	        MOV 	ES,AX
              MOV       SI,0
              ;计算SI
              MOV       AL,160d
              MUL       row
              MOV       SI,AX
              MOV       AL,2d
              MUL       column
              ADD       SI,AX
              ;计算CX
              MOV       AX,0
              MOV       AL,78d
              MOV       AH,row
              SUB       AH,2
              MUL       AH
              MOV       DL,column
              DEC       DL
              MOV       DH,0
              ADD       AX,DX
              MOV       CX,1638d
              SUB       CX,AX
              MOV       DL,column
              MOV       DH,row
              ;循环改变视频缓冲区.
              POP       AX
 LOOPBack:
              INC       DL
              CMP       DL,79				;如果79列,跳到BACK1特殊处理
              JZ        Back1
              MOV       BX,ES:[SI+2]		;
              CMP       BL,20h			;千万注意:寄存器里的存放顺序与存储器中的正好相反
              JZ        exitLoop
              JMP       BackContine
   exitLoop:
              MOV       ES:[SI+2],AX
              JMP       EXITMovBack

  Back1:
              ;根据行号的不同选择不同的分支.
              CMP       DH,24
              JMP       EXITMovBack			;留下接口,等实现了翻页功能后再做变动.
              MOV  	ES:[SI+6],AX
              MOV       AX,BX
              ADD       SI,6
              MOV       DL,1
              INC       DH
              LOOP      LOOPBack
  BackContine:
              MOV  	ES:[SI+2],AX
              MOV       AX,BX
              ADD       SI,2
              LOOP      LOOPBack
  EXITMovBack:
              POP       ES
              recover
              RET
 MOVBack      ENDP
 ;************文件打开函数*********
 ;文件操作:有打开,读取调用
 ;先提示用户正确输入文件名称,错误时要特殊处理
 ;
 fileopen      PROC
              saveE
              MOV       modifyFlag,1
              CALL      menuHide
              CALL      BackDisplay
              CALL      savedisplay
              win       10,15,12,73,00h
              win       9,14,11,72,0A4H
              poscur    10,15
              show      mess2
              CALL      CLspath
              MOV       SI,0
 getfilenameo:
              MOV       AH,1
        	  INT       21h
              CMP       AL,0dh
              JZ        NAMEgetedo
        	  MOV       path[SI],AL
        	  INC       SI
              CMP       SI,28
              JZ        tooLongo
        	  JMP       getfilenameo
tooLongo:     poscur    24,0
              show	errormess3
              MOV       SI,0
              poscur    10,14
              show      mess4
              CALL      CLspath
              JMP       GEtfilenameo
NAMEgetedo:
             INC       SI
              INC       SI
              MOV       path[SI],24h
              MOV 	AL,2
              fileIO    path,3Dh
              JC		saerror1o1		;文件无法打开时的异常处理
              MOV 	handler,AX
        	  MOV 	BX,handler
        	  MOV 	CX,2000
              fileIO    buffer,3FH
              JC        saerror2o1   	;文件无法读取时的异常处理.
              CALL      BackDisplay
              win	      1,28,1,56,70h
              poscur    1,30
              show      path
              win  	2,1,23,78,017h
              poscur	2,1
        	  MOV 	CX,2000
        	  SUB 	BX,BX
              JMP       redisplay
  saerror2o1: JMP       saerror2o
  saerror1o1: JMP       saerror1o
              ;文件正常操作时的字符显示
              ;注意列号的控制作用
   redisplay:
              posgets
              CMP       column,78
              JNZ       continue
              MOV       column,1
              INC       row
              poscur	row,column
    continue:
              MOV		DL,buffer[BX]
        	  INC 	BX
       	  MOV 	AH,2
       	  INT 	21h
     	        LOOP 	redisplay
              MOV       BX,handler
              MOV       AH,3EH
              poscur    row,column
              INC 	musicInt
              CALL      EDItfile
              JMP       exitopen
  saerror1o:
              poscur    24,1
              show	errormess4
              GEtchar
              win   2,1,23,78,27H
              JMP       exitsaveas
  saerror2o:
              poscur	24,1
              show      errormess5
              GEtchar
              win   2,1,23,78,27H
              JMP       exitsaveas
              GEtchar
  exitopen:
              GEtchar
              recover
              RET
 fileopen      ENDP
 ;**************文件保存模块***********
 ;功能:响应用户的save命令
 ;如果没有另存文件,则以默认文件名保存.
   filesave      PROC
              saveE
              CALL      menuHide
              CALL      BackDisplay
              CMP       musicInt,0
              JZ        exitsave
              CMP       SaveAsFlag,0
              JNZ        NEwname
              MOV       CX,00
              fileIO    musicname,3ch
              JC        serror1
              MOV       handler,AX
              MOV       BX,handler
              MOV       CX,2000
              fileIO    buffer,40H
              JC        serror2
              MOV       BX,handler
              MOV       AH,3EH
              INT       21H
              MOV       modifyFlag,1
              JMP       exitsave
  NEwname:
  serror1:
              poscur    24,1
              show	errormess1
              JMP       exitsave
  serror2:
              poscur	24,1
              show      errormess2
              JMP       exitsave

     exitsave:
              recover
              RET
 filesave      ENDP
;****文件另存为菜单的响应处理函数
;入出口功参数:modifyFlay,AsOrIfFlag,两者的意义见数据段定义处.

  filesaveas      PROC
              saveE
              MOV       modifyFlag,1
              CALL      menuHide
       	  CMP       AsOrIfFlag,0
              JNZ       AsOrIfFlagas
              CALL      BackDisplay
      AsOrIfFlagas:
              CMP       musicInt,0
              JZ        exitsaveas1
              win       10,15,12,67,07h
              win       9,14,11,66,24h
              poscur    10,15
              show      mess1
              CALL      CLspath
              MOV       SI,0
              JMP       getfilename
 exitsaveas1: JMP       exitsaveas
 getfilename:
              MOV       AH,1
        	  INT       21h
              CMP       AL,0dh
              JZ        NAMEgeted
        	  MOV       path[SI],AL
        	  INC       SI
              CMP       SI,28
              JZ        tooLong
        	  JMP       getfilename
tooLong:      poscur    24,0
              show	errormess3
              MOV       SI,0
              poscur    10,14
              show      mess4
              CALL      CLspath
              JMP       GEtfilename
NAMEgeted:
              INC       SI
              INC       SI
              MOV       path[SI],24h
              MOV       CX,00
              fileIO    path,3ch
              JC		saerror1
              MOV       handler,AX
              MOV       BX,handler
              MOV       CX,2000
              fileIO    buffer,40H
              JC        saerror2
              MOV       BX,handler
              MOV       AH,3EH
              CALL      BackDisplay
              win	      1,28,1,56,70h
              poscur    1,30
              show      path
     ;         win       9,13,12,67,017h
              CALL      saveDisplay
              poscur    row,column
              JMP       exitsaveas
  saerror1:
              poscur    24,1
              show	errormess1
              MOV       SI,0
              poscur    10,14
              show      mess4
              CALL      CLspath
              JMP       getfilename
  saerror2:
              poscur	24,1
              show      errormess2
              MOV       SI,0
              poscur    10,14
              show      mess4
              CALL      CLspath
              JMP       getfilename
  exitsaveas:
              recover
              RET
 filesaveas      ENDP
 ;*************************************
;将BAK[]中储存的视频缓冲区的内容显示到屏幕上.
BackDisplay PROC NEAR
	 saveE
        MOV BX,0d
        MOV CX,3840d
loop11:
        MOV AX,data_seg
        MOV DS,AX
        MOV DL,bak[BX]
        MOV AX,0b800h
        MOV DS,AX
        MOV DS:[BX],DL
        INC BX
        LOOP loop11
	  recover
        RET
BackDisplay ENDP
;*************************************
;将视频缓冲区的内容储存到BAK[]中备份
savedisplay PROC NEAR
	  saveE
        MOV AX,0002h
        INT 33h
        MOV BX,0d
        MOV CX,3840d
loop1s:
        MOV AX,0b800h
        MOV DS,AX
        MOV DL,DS:[BX]
        MOV AX,data_seg
        MOV DS,AX
        MOV bak[BX],DL
        INC BX
        LOOP loop1s
        MOV AX,0001h
        INT 33h
	  recover
savedisplay ENDP
;******************菜单隐藏,******
;用滚屏来实现的
menuHide      PROC
		  saveE
              win   0,0,0,79,70h
              poscur 0,0
              show str_menu
              recover
              RET
 menuHide     ENDP
CLspaste      PROC
              saveE
             MOV       CX,25
  LOOPCLspaste:
              MOV       SI,0
              MOV       path[SI],0
              INC       SI
              LOOP      LOOPCLspaste
              recover
              RET
CLspaste      ENDP
 ;***********清空文件名缓冲区********
 CLspath      PROC
              saveE
              MOV       CX,30
  LOOPlpath:
              MOV       SI,0
              MOV       path[SI],0
              INC       SI
              LOOP      LOOPlpath
              recover
              RET
  CLspath     ENDP
 ;*********从文件读取音乐算法****************
 ;此函数还未被调用
 readFile     PROC
		  saveE
              MOV		AL,2
              fileIO filename,3Dh
              JNC       succsess
              poscur    13,27
              show      error0
              JMP       errorexit
   succsess:
              MOV       handler,AX
              MOV       BX,AX
    read:
              MOV		CX,1
              fileIO    chartemp,3FH
              putchar   CHartemp
              CMP		CHartemp,30H
              JB		NOTNum
              CMP		CHartemp,39h
              JA		NOTNum
              JMP       number
     NOTNum:  CMP		CHartemp,2ch
              JZ		cut
              CMP       CHartemp,2bh;遇到-号,结束
              JZ		finish11
              poscur    13,27
              show	error1
              poscur    14,27
         ;     putchar   CHartemp
              JMP       errorexit
     number:  MOV		AL,CHartemp
              MOV		SI,bufferflag
              MOV		buffertemp[SI],AL
              INC		Bufferflag
              JMP       read
     cut:     MOV       Bufferflag,0
              MOV		SI,Bufferflag
     LOOP1:
 ;             show      buffertemp
              MOV       AL,buffertemp[SI]
              putchar   buffertemp[SI]
              SUB		AL,30h
              MUL       times
              ADD       AX,musictemp
              MOV       musictemp,AX
              MOV		AL,10
              MUL		times
              MOV		times,AX
              DEC		SI
              CMP		SI,0
              JNZ       LOOP1
              MOV       SI,bufferIndex
              MOV       WORD PTR musicbuffer[SI],AX
              INC       bufferIndex
              JMP       read
              finish11: JMP       finish1
      read2:  INC       bufferIndex
              MOV       SI,bufferIndex
              MOV       WORD PTR musicbuffer[SI],0
              MOV       bufferIndex,0
              INC       musicfinish
              MOV		CX,1
              fileIO    chartemp,3FH
      ;        putchar   CHartemp
              CMP		CHartemp,30H
              JB		NOTNum2
              CMP		CHartemp,39h
              JA		NOTNum2
              JMP       number2
     NOTNum2: CMP		CHartemp,2ch
              JZ		cut2
              CMP       CHartemp,2bh;遇到-号,结束
              JZ		finish2
              poscur    13,27
              show	error2
              poscur    14,27
              putchar   CHartemp
              JMP       errorexit
     number2: MOV		AL,CHartemp
              MOV		SI,bufferflag
              MOV		buffertemp[SI],AL
              INC		Bufferflag
              JMP       cut2
     read21:  JMP       read2
     cut2:    MOV       Bufferflag,0
              MOV		SI,Bufferflag
     LOOP12:  MOV       AL,buffertemp[SI]
              SUB		AL,30h
              MUL       times
              ADD       AX,musictemp
              MOV       musictemp,AX
              MOV		AL,10
              MUL		times
              MOV		times,AX
              DEC		SI
              CMP		SI,0
              JNZ       LOOP12
              MOV       SI,bufferIndex
              MOV       WORD PTR timebuffer[SI],AX
              INC       bufferIndex
              JMP       read2
     finish1: CMP		musicfinish,0
              JZ		read21
     finish2:
     errorexit:
		  recover
              RET
readFile     ENDP
 ;****************显示行列的信息*********
 ; R:row,C:column
 ;用除10取余来实现,同时修改数据段中的mess6,
 ;再显示到屏幕的相应位置即可.
 ;***************************************
  showRC      PROC
              saveE
              posgets
              MOV       AL,row
              DEC       AL
              poscur	AL,column
	        MOV  BL,100d
	        MOV  BH,10d
	        MOV  AX,0
	        MOV  AL,DH
	        DIV BL
	        ADD  AL,30h
	        MOV  [mess6+6],AL
	        MOV AL,AH
	        MOV AH,0
	        DIV BH
	        ADD AX,3030h
	        MOV [mess6+7],AL
	        MOV [mess6+8],AH
	        MOV  AX,0
	        MOV  AL,DL
	        DIV BL
	        ADD  AL,30h
	        MOV  [mess6+18],AL
	        MOV AL,AH
	        MOV AH,0
	        DIV BH
	        ADD AX,3030h
	        MOV [mess6+19],AL
	        MOV [mess6+20],AH
	        poscur 24,56
		  show      mess6
              poscur	row,column
              recover
              RET
  showRC      ENDP
 ;代码段结束.
 ;************************************

      code_seg       ENDS
        END       start




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -