本实验题目:将一个文件myprog.txt里面的内容中的小写字母全部转化为大写,其他字符保持不变,且不能使用临时文件。(对前面一道题目的改进版本)

DATA SEGMENT      ;定义数据段 
MESS DB 'File Handle Error!',07,13,10,'$'
FN1  DB 'myprog.txt',00H       ;myprog.txt放在工作目录下
FH1  DW ?
BUFF DB 20 DUP(0)
DATA ENDS

SSEG  SEGMENT STACK        ;定义栈段
      DB 256 DUP(?)
TOP LABEL BYTE
SSEG  ENDS

CODE  SEGMENT              ;定义代码段
      ASSUME CS:CODE,DS:DATA,SS:SSEG
MAIN  PROC FAR
START:
      MOV AX,SSEG          ;栈初始化
      MOV SS,AX
      LEA SP,TOP
  
      MOV AX,DATA            ;数据段初始化
      MOV DS,AX
  
      MOV AH,3DH             ;以读和写方式打开已存在的文件
      LEA DX,FN1
      MOV AL,2
      INT 21H
      JC Error
      MOV FH1,AX
  
      MOV BX,FH1
      LEA DX,BUFF
L1:   MOV AH,3FH               ;读取文件内容,每次读取10字节
      MOV CX,10 
      INT 21H
      JC Error                ;文件处理错误提示
      CMP AX,0
      JE ENDFILE
  
      PUSH AX
      PUSH CX
      PUSH DX
      PUSH BX
      MOV CX,AX
      XOR SI,SI
      MOV  DL,11011111B  
TRANL:
      MOV DH,BUFF[SI]
      CMP DH,'a'
      JB  S1
      CMP DH,'z'
      JA  S1                            ;将大写字母转化为小写字母用OR DL 00100000B
      AND  BUFF[SI],DL                  ;将小写字母转化为大写字母用AND DL 11011111B              
S1:   INC SI
      LOOP TRANL
  
      POP BX                            ;移动指针到每一次读取文件的地方进行转化后的覆盖
      MOV CX,0FFFFH                     ;指针要向前移动,故CX:DX应为负值
      NEG AX
      MOV DX,AX
      MOV AL,1
      MOV AH,42H
      INT 21H
      JC Error
   
      POP DX
      POP CX
      POP AX
  
      MOV CX,AX                         ;用转化后的内容覆盖原位置文件内容
      MOV AH,40H
      INT 21H
      JC Error
      JMP L1
  
Error:LEA DX,MESS                       ;文件处理错误提示
      MOV AH,9
      INT 21H
      MOV AX,4C00H
      INT 21H
  
ENDFILE:
      MOV BX,FH1                         ;结束操作
      MOV AH,3EH
      INT 21H
      MOV AX,4C00H
      INT 21H
MAIN ENDP
CODE ENDS
      END START

你可能感兴趣的:(汇编语言)