文本比较的x86汇编实现
输入:DataIn1.txt和DataIn2.txt
弹出一个对话框显示不同的行数
.386 .model flat,stdcall option casemap:none include windows.inc ; main windows include file include masm32.inc ; masm32 library include ; ------------------------- ; Windows API include files ; ------------------------- include gdi32.inc include user32.inc include kernel32.inc include Comctl32.inc include comdlg32.inc include shell32.inc include oleaut32.inc include ole32.inc include msvcrt.inc include dialogs.inc ; macro file for dialogs include macros.asm ; masm32 macro file ; libraries ; ~~~~~~~~~ includelib masm32.lib ; masm32 static library ; ------------------------------------------ ; import libraries for Windows API functions ; ------------------------------------------ includelib gdi32.lib includelib user32.lib includelib kernel32.lib includelib Comctl32.lib includelib comdlg32.lib includelib shell32.lib includelib oleaut32.lib includelib ole32.lib includelib msvcrt.lib .DATA szOut byte '%c',0 fileName1 db 'DataIn1.txt',0 fileName2 db 'DataIn2.txt',0 result byte 'The different lines are as follows:',0ah,' ' ;预留一部分空间不然会越界 cr byte 10H lineCnt dd 0 lineRec dd 100 dup(?) ;记录不相等的行号 neCnt dd 0 ;记录不相等的行的个数 Flag byte 0 ;是否相同标志 0相同 1不同 num byte 10 dup(0) num2 byte 10 dup(0) ;用来存放大于10的结果 ten byte 10 .DATA? hFile1 dd ? ByteCnt1 dd ? inBuff1 byte 100 dup(?) hFile2 dd ? inBuff2 byte 100 dup(?) ByteCnt2 dd 100 dup(?) .CODE _main PROC xor edi,edi INVOKE CreateFile,offset fileName1,GENERIC_READ,edi,edi, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,edi mov hFile1,eax mov esi,offset inBuff1 INVOKE ReadFile,hFile1,esi,sizeof inBuff1,offset ByteCnt1,edi INVOKE CloseHandle,hFile1 xor edi,edi INVOKE CreateFile,offset fileName2,GENERIC_READ,edi,edi, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,edi mov hFile2,eax mov esi,offset inBuff2 INVOKE ReadFile,hFile2,esi,sizeof inBuff2,offset ByteCnt2,edi INVOKE CloseHandle,hFile2 mov eax,ByteCnt1 cmp eax,ByteCnt2 je l0 MsgBox 0,"文件大小不相等 !","文件比较", MB_OK jmp end0 l0: mov ecx,0 ;ecx用来记录不同行的项数 mov eax,1 mov lineCnt,eax mov esi,0 ;esi为字节计数 l1: mov dl,inBuff1[esi] ; cmp dl,inBuff2[esi] je l2 mov eax,lineCnt ;有不相同 mov lineRec[ecx],eax inc ecx ;不相等计数加一 mov al,1 ;不相等标志位设为1 mov Flag,al l2: add esi,1 mov al,inBuff1[esi] cmp al,0AH jne l3 inc lineCnt l3: cmp esi,ByteCnt1 jne l1 mov al,1 cmp al,Flag jne l7 mov esi,0 l4: mov al,result[esi] inc esi cmp al,0AH jne l4 ;跳过result的第一行 mov eax,0 l5: cmp al,9 ;对编号大于10的情况进行处理 这里是大于9 jl s4 push eax push edi push ebx mov edi,0 inc al s5: mov ten,10 div ten mov num2[edi],ah inc edi cmp al,10 jnb s5 mov num2[edi],al s6: mov bl,num2[edi] add bl,'0' mov result[esi],bl inc esi dec edi cmp edi,0 jnl s6 pop ebx pop edi pop eax jmp s7 s4: mov dl,al add dl,'1' mov result[esi],dl inc esi s7: mov result[esi],':' inc esi mov result[esi],'I' inc esi mov result[esi],'n' inc esi mov result[esi],' ' inc esi mov result[esi],'l' inc esi mov result[esi],'i' inc esi mov result[esi],'n' inc esi mov result[esi],'e' inc esi mov result[esi],' ' inc esi mov ebx,lineRec[eax] ;把行数装换成ASCII,拼接到result后面 cmp bl,10 ;大于0的数需要分别输出 小于0转l6, jl l6 push eax push edi push ebx mov eax,ebx mov edi,0 s1: mov ten,10 div ten mov num[edi],ah inc edi cmp al,10 jnb s1 mov num[edi],al s3: mov bl,num[edi] add bl,'0' mov result[esi],bl inc esi dec edi cmp edi,0 jnl s3 mov result[esi],0ah ;esi是result计数 pop ebx pop edi pop eax jmp s2 l6: add bl,'0' mov result[esi],bl inc esi mov result[esi],0ah s2: inc eax inc esi cmp eax,ecx jb l5 mov result[esi],0 MsgBox 0,offset result,"文件比较", MB_OK jmp end0 l7: MsgBox 0,"文件完全相同 !","文件比较", MB_OK end0: inkey INVOKE ExitProcess,edi _main ENDP END _main