.386 CODE SEGMENT USE16 ASSUME CS:CODE,DS:CODE ORG 100H START: JMP INSTALL HANDLE DW ? _MIN DW ? _SEC DW ? _SEC1 DW ? _A DD ? _B DD ? _FS_POINT DW 0 _GS_POINT DW 0 _DIV DD 1 FLAG DB ? ;=1 + DIGITAL DD 5000 ;how many points want to calculate POINT DW ? ;total point /5 NUM_POINT DW ? ;total point /5 * 4 _COUNT DD ? TMP_NUM0 DD ? TMP_NUM DD 10 DUP (?) KEY_BUFF DB 6,0,6 DUP (0) D_SAVE DB 'Saving result to file %c ...',0 DW 80H D_SAVE_OK DB 8,8,8,8,', OK !',0DH,0AH,0 D_SAVE_ERR DB 8,8,8,8,', error !',0DH,0AH,0 D_TIME DB 0DH,0AH,'Total %ld points, time used %d:%02d.%03d, ' DB 'calculate %ld times.',0DH,0AH,0 DW DIGITAL,_MIN,_SEC,_SEC1,_DIV D_SCAN DB '<Windows 95 的长文件名给我们带来了很大的方便,本文讲述有关长文件名的使用方法。> Dec 18, 1996',0DH,0AH DB 'Copyright(C) by Luo Yun Bin, phone 0576-4114689',0DH,0AH,0AH DB 'How many points (10-80000): ',0 D_ABORT DB 'User pressed Esc, calculate aborted !%20r ',0DH,0AH,0 D_CAL DB 'Calculating, please waiting ... (Esc to cancel)',0DH,0 D_CAL1 DB '%d %% calculated, please waiting ... (Esc to cancel)',0DH,0 DW PERCENT PERCENT DW ? D_STR1 DB ' PI = %1ld.%c',0DH,0AH,0 DW TMP_NUM0,D_SUB_STR D_STR2 DB '%5ld : %c' DB 0DH,0AH,0 DW _COUNT,D_SUB_STR D_SUB_STR DB '%05ld %05ld %05ld %05ld %05ld ' DB '%05ld %05ld %05ld %05ld %05ld',0 DW TMP_NUM,TMP_NUM+4,TMP_NUM+8,TMP_NUM+12,TMP_NUM+16 DW TMP_NUM+20,TMP_NUM+24,TMP_NUM+28,TMP_NUM+32,TMP_NUM+36 INSTALL: MOV SI,OFFSET D_SCAN CALL PRINTF MOV AH,0AH MOV DX,OFFSET KEY_BUFF INT 21H MOV SI,OFFSET KEY_BUFF+2 CALL SCANF MOV EAX,DWORD PTR SCAN_NUM MOV DIGITAL,EAX MOV SI,OFFSET D_CAL CALL PRINTF XOR AX,AX MOV DS,AX MOV AX,DS:[046CH] PUSH CS POP DS MOV _SEC,AX MOV AX,CS ADD AX,1000H ;result of 4*4*5/25^n MOV FS,AX ADD AX,1000H ;result of 4*239/57121^n MOV GS,AX ADD AX,1000H ;total result MOV BP,AX MOV AX,FS CALL INIT_NUM MOV DWORD PTR FS:[4],4*239*100000 MOV AX,GS CALL INIT_NUM MOV DWORD PTR GS:[4],4*4*5*100000 MOV AX,BP CALL INIT_NUM CALL PRE CALL CALC XOR AX,AX MOV DS,AX MOV AX,DS:[046CH] PUSH CS POP DS MOV _SEC1,AX PUSH POINT CALL NUM_OUT POP POINT MOV AX,_SEC1 SUB AX,_SEC MOV CX,55 MUL CX MOV CX,1000 DIV CX MOV _SEC1,DX MOV CX,60 XOR DX,DX DIV CX MOV _MIN,AX MOV _SEC,DX MOV SI,OFFSET D_TIME CALL PRINTF MOV SI,81H MOV DI,80H CMD_LOP: LODSB CMP AL,0DH JZ CMD_END CMP AL,20H JBE CMD_LOP CMP AL,'a' JB CMD_STORE CMP AL,'z' JA CMD_STORE SUB AL,20H CMD_STORE: STOSB JMP SHORT CMD_LOP CMD_END: XOR AL,AL STOSB MOV SI,80H CMP BYTE PTR DS:[SI],0 JZ QUIT MOV SI,OFFSET D_SAVE CALL PRINTF MOV AH,3CH XOR CX,CX MOV DX,80H INT 21H JB FILE_ERR MOV HANDLE,AX MOV STD_OUT,OFFSET WRITE_FILE CALL NUM_OUT MOV STD_OUT,OFFSET PRT_TO_SCR MOV SI,OFFSET D_SAVE_OK CALL PRINTF MOV AH,3EH MOV BX,HANDLE INT 21H INT 20H FILE_ERR: MOV SI,OFFSET D_SAVE_ERR CALL PRINTF INT 20H QUIT: INT 20H WRITE_FILE PROC PUSHA MOV AH,40H MOV FLAG,AL MOV BX,HANDLE MOV CX,1 MOV DX,OFFSET FLAG INT 21H POPA RET WRITE_FILE ENDP PRE PROC MOV EAX,DIGITAL ;total 65536*5/4 points CMP EAX,(65536/4-3)*5 ;comp max points JBE PRE_1 MOV EAX,(65536/4-3)*5 PRE_1: CMP EAX,10 ;comp min points JAE PRE_2 ;must > 10 and < 81915 MOV EAX,10 PRE_2: XOR EDX,EDX MOV ECX,5 DIV ECX MOV EBX,EAX INC EBX MOV POINT,BX ;point for print control MUL ECX MOV DIGITAL,EAX ; MOV EAX,EBX INC EAX MOV ECX,4 MUL ECX MOV NUM_POINT,AX ;max used memory RET PRE ENDP CALC PROC MOV ES,BP C_LOP0: MOV AH,1 INT 16H JZ CALC_0 XOR AH,AH INT 16H CMP AL,1BH JNZ CALC_00 PUSH CS POP ES MOV SI,OFFSET D_ABORT CALL PRINTF INT 20H CALC_00: XOR EAX,EAX MOV AX,_GS_POINT MOV ECX,500 MUL ECX MOV ECX,4 DIV ECX XOR EDX,EDX DIV DIGITAL MOV PERCENT,AX MOV SI,OFFSET D_CAL1 PUSH CS POP ES CALL PRINTF MOV ES,BP CALC_0: XOR EAX,EAX MOV ECX,100000 MOV _A,EAX MOV _B,EAX XOR FLAG,00000001B ;init part ;============================================================ MOV EBX,57121 C_LOP1: MOV SI,_FS_POINT ;if 4*5/25^n = 0 skip CMP SI,NUM_POINT JAE CALC_1 CMP DWORD PTR FS:[SI],0 JNZ C_LOP2 ADD _FS_POINT,4 JMP SHORT C_LOP1 C_LOP2: MUL ECX ADD EAX,FS:[SI] ADC EDX,0 DIV EBX MOV FS:[SI],EAX MOV EAX,EDX ADD SI,4 CMP SI,NUM_POINT JB C_LOP2 ;======================================================= CALC_1: MOV EBX,25 C_LOP3: MOV SI,_GS_POINT ;if 4*5/25^n = 0 skip CMP SI,NUM_POINT JAE CALC_4 CMP DWORD PTR GS:[SI],0 JNZ C_LOP4 ADD _GS_POINT,4 JMP SHORT C_LOP3 C_LOP4: MOV EAX,_A MUL ECX ADD EAX,GS:[SI] ADC EDX,0 DIV EBX MOV GS:[SI],EAX MOV _A,EDX MOV EAX,_B MUL ECX ADD EAX,GS:[SI] ADC EDX,0 SUB EAX,FS:[SI] SBB EDX,0 CMP EDX,0 JL _T1 DIV _DIV MOV _B,EDX JMP SHORT _T2 _T1: IDIV _DIV DEC EAX ADD EDX,_DIV MOV _B,EDX _T2: TEST FLAG,00000001B JNZ CALC_2 SUB ES:[SI],EAX JMP SHORT CALC_3 CALC_2: ADD ES:[SI],EAX CALC_3: ADD SI,4 CMP SI,NUM_POINT JB C_LOP4 C_LOP5: ADD _DIV,2 JMP C_LOP0 ;==================================================== CALC_4: XOR EAX,EAX MOV _A,EAX MOV SI,NUM_POINT C_LOP6: SUB SI,4 MOV EAX,ES:[SI] ADD EAX,_A CMP EAX,ECX JGE CALC_5 CMP EAX,0 JLE CALC_6 MOV _A,0 MOV ES:[SI],EAX JMP SHORT CALC_8 CALC_5: XOR EDX,EDX DIV ECX MOV ES:[SI],EDX MOV _A,EAX JMP SHORT CALC_8 CALC_6: MOV EDX,-1 IDIV ECX DEC EAX ADD EDX,ECX MOV ES:[SI],EDX MOV _A,EAX CALC_8: CMP SI,4 JA C_LOP6 MOV EAX,_A MOV ES:[0],EAX PUSH CS POP ES RET CALC ENDP INIT_NUM PROC PUSH ES MOV ES,AX XOR EAX,EAX CLD XOR DI,DI MOV CX,65536/4 CLD REP STOSD POP ES RET INIT_NUM ENDP NUM_OUT PROC CLD XOR ESI,ESI MOV _COUNT,ESI MOV DI,OFFSET TMP_NUM0 MOV CX,11 CMP CX,POINT JBE NO_ADJUST MOV CX,POINT NO_ADJUST: SUB POINT,CX MOV DS,BP REP MOVSD PUSH CS POP DS PUSH SI MOV SI,OFFSET D_STR1 CALL PRINTF POP SI NO_LOP: CMP POINT,0 JLE NO_QUIT MOV CX,10 MOV DI,OFFSET TMP_NUM XOR EAX,EAX REP STOSD MOV CX,10 MOV DI,OFFSET TMP_NUM CMP POINT,10 JAE NO1 MOV CX,POINT NO1: SUB POINT,CX ADD _COUNT,50 MOV DS,BP ;bp = result segment REP MOVSD PUSH CS POP DS PUSH SI MOV SI,OFFSET D_STR2 CALL PRINTF POP SI JMP SHORT NO_LOP NO_QUIT: RET NUM_OUT ENDP INCLUDE SCANF.ASM INCLUDE PRINTF.ASM CODE ENDS END START
INT 21H 中断的 716CH 功能:(打开或建立文件)
输入参数:
AX = 716Ch
BX = 存取模式和共享标志
Bit(s) Description 2-0 file access mode 000 read-only 001 write-only 010 read-write 100 read-only, do not modify file's last-access time 6-4 file sharing modes 7 no-inherit flag 8 do not buffer data (requires that all reads/writes be exact physical sectors) 9 do not compress file even if volume normally compresses files 10 use alias hint in DI as numeric tail for short-name alias 12-11 unused??? (0) 13 return error code instead of generating INT 24h if critical errorCX = 文件属性
Bit(s) Description (Table 01758) 0 open file (fail if file does not exist) 1 truncate file if it already exists (fail if file does not exist) 4 create new file if file does not already exist (fail if exists) Note: the only valid combinations of multiple flags are bits 4&0 and 4&1DS:SI -> ASC 码文件名
AX = FILE HANDLE CX = ACTION TAKEN 0001h file opened 0002h file created 0003h file replacedCF 置位则失败
输入参数:
AX = 7156h
DS:DX -> 原来的 ASC 码文件名
ES:DI -> 新的 ASC 码文件名
返回参数:CF 清除则成功
CF 置位则失败
AX = 7100H 则表示功能不被支持
INT 21H 中断的 7141H 功能:(文件删除)
输入参数:
AX = 7141h
DS:DX -> ASC 码文件名
SI = 属性及是否支持通配符
0000h 不支持通配符,忽略属性
0001h 支持通配符
CL = 属性
CH = must-match attributes
返回参数:CF 清除则成功
CF 置位则失败
AX = 7100H 则表示功能不被支持
源程序:
;长文件名示例之一,建立文件 This is a test file.txt,写入一句文字,再关闭
CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP START1 FILE_NAME DB 'This is a test file.txt',0 D_TEXT DB 'Sample text',0DH,0AH D_TEXT_END EQU THIS BYTE D_ERROR DB 'Create file error !',0DH,0AH,24H START1: MOV AX,716CH MOV BX,2 ;Read and write XOR CX,CX ;Normal attrib MOV DX,0010H ;Create new file MOV SI,OFFSET FILE_NAME XOR DI,DI INT 21H JB ERROR MOV BX,AX MOV AH,40H MOV CX,OFFSET D_TEXT_END - OFFSET D_TEXT MOV DX,OFFSET D_TEXT INT 21H MOV AH,3EH INT 21H INT 20H ERROR: MOV AH,9 MOV DX,OFFSET D_ERROR INT 21H INT 20H CODE ENDS END START ;长文件名示例之二,打开文件 This is a test file.txt,显示文件内容,再关闭 CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP START1 FILE_NAME DB 'This is a test file.txt',0 BUFFER DB 13 DUP (0),0DH,0AH,24H D_ERROR DB 'Open file error !',0DH,0AH,24H START1: MOV AX,716CH MOV BX,2 ;Read and write XOR CX,CX ;Normal attrib MOV DX,1 ;Open file MOV SI,OFFSET FILE_NAME MOV DI,1 INT 21H JB ERROR MOV BX,AX MOV AH,3FH MOV DX,OFFSET BUFFER MOV CX,13 INT 21H MOV AH,9 MOV DX,OFFSET BUFFER INT 21H MOV AH,3EH INT 21H INT 20H ERROR: MOV AH,9 MOV DX,OFFSET D_ERROR INT 21H INT 20H CODE ENDS END START ;长文件名示例之三,把文件 This is a test file.txt 改名到 This is another file name.txt CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP START1 FILE_NAME DB 'This is a test file.txt',0 NEW_NAME DB 'This is another file name.txt',0 D_ERROR DB 'Rename file error !',0DH,0AH,24H START1: MOV AX,7156H MOV DX,OFFSET FILE_NAME MOV DI,OFFSET NEW_NAME INT 21H JB ERROR INT 20H ERROR: MOV AH,9 MOV DX,OFFSET D_ERROR INT 21H INT 20H CODE ENDS END START ;长文件名示例之四,把文件 This is another file name.txt 删除 CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: JMP START1 FILE_NAME DB 'This is another file name.txt',0 D_ERROR DB 'Delete file error !',0DH,0AH,24H START1: MOV AX,7141H MOV DX,OFFSET FILE_NAME XOR SI,SI XOR CX,CX INT 21H JB ERROR INT 20H ERROR: MOV AH,9 MOV DX,OFFSET D_ERROR INT 21H INT 20H CODE ENDS END START