?? 4.asm
字號:
.386
.model flat,stdcall
option casemap:none
include zuoye.Inc
.code
mess db "wrong in the code ",0
cap db "wrong",0
mess1 db "編譯連接完成點擊run菜單運行!!!",0
cap1 db "OK",0
mess2 db "程序有錯,,可以通過<list文件>菜單察看list文件(可通過<asm文件>菜單恢復(fù)到程序視圖)",0
cap2 db "list文件",0
cat1 db ".OBJ",0
cat2 db ".EXE",0
cat3 db ".LST",0
cat4 db ".asm",0
cattasm db "\\TASM.EXE",0
catlink db "\\TLINK.EXE",0
listcat db " /L",0
addcat db "+",0
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke InitCommonControls
mov iccex.dwSize,sizeof INITCOMMONCONTROLSEX ;prepare common control structure
mov iccex.dwICC,ICC_DATE_CLASSES
invoke InitCommonControlsEx,addr iccex
invoke LoadLibrary,addr RichEditDLL
mov hRichEdDLL,eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
push eax
invoke FreeLibrary,hRichEdDLL
pop eax
invoke ExitProcess,eax
GetPathproc proc
LOCAL bufferpath[MAX_PATH]:byte
invoke GetCurrentDirectory,MAX_PATH,ADDR bufferpath
invoke lstrcpy,addr szFileName1 ,addr bufferpath
invoke lstrcat ,addr szFileName1,addr cattasm
invoke lstrcpy,addr szFileName2 ,addr bufferpath
invoke lstrcat ,addr szFileName2,addr catlink
ret
GetPathproc endp
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL path[MAX_PATH]:byte
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style,CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc,OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,NULL
mov wc.lpszMenuName,IDM_MENU
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov hIcon,eax
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx,addr wc
invoke CreateDialogParam,hInstance,IDD_DLG,NULL,addr WndProc,NULL
mov hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke GetPathproc
invoke UpdateWindow,hWnd
.while TRUE
invoke GetMessage,addr msg,NULL,0,0
.break .if !eax
invoke IsDialogMessage,hFind,addr msg
.if !eax
invoke TranslateMessage,addr msg
invoke DispatchMessage,addr msg
.endif
.endw
mov eax,msg.wParam
ret
WinMain endp
StreamInProc proc hFile:DWORD,pBuffer:DWORD,NumBytes:DWORD,pBytesRead:DWORD
invoke ReadFile,hFile,pBuffer,NumBytes,pBytesRead,0
xor eax,1
ret
StreamInProc endp
StreamOutProc proc hFile:DWORD,pBuffer:DWORD,NumBytes:DWORD,pBytesWritten:DWORD
invoke WriteFile,hFile,pBuffer,NumBytes,pBytesWritten,0
xor eax,1
ret
StreamOutProc endp
SetWinCaption proc
LOCAL buffer[sizeof AppName+3+MAX_PATH]:BYTE
LOCAL buffer1[4]:BYTE
;Add filename to windows caption
invoke lstrcpy,addr buffer,addr AppName
mov eax,' - '
mov dword ptr buffer1,eax
invoke lstrcat,addr buffer,addr buffer1
invoke lstrcat,addr buffer,addr FileName
invoke SetWindowText,hWnd,addr buffer
ret
SetWinCaption endp
SaveFile proc lpFileName:DWORD
LOCAL hFile:DWORD
LOCAL editstream:EDITSTREAM
invoke CreateFile,lpFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
;stream the text to the file
mov editstream.dwCookie,eax
mov editstream.pfnCallback,offset StreamOutProc
invoke SendMessage,hREd,EM_STREAMOUT,SF_TEXT,addr editstream
invoke CloseHandle,hFile
;Set the modify state to false
invoke SendMessage,hREd,EM_SETMODIFY,FALSE,0
mov eax,FALSE
.else
invoke MessageBox,hWnd,addr SaveFileFail,addr AppName,MB_OK
mov eax,TRUE
.endif
ret
SaveFile endp
SaveEditAs proc
LOCAL ofn:OPENFILENAME
LOCAL buffer[MAX_PATH]:BYTE
;Zero out the ofn struct
invoke RtlZeroMemory,addr ofn,sizeof ofn
;Setup the ofn struct
mov ofn.lStructSize,sizeof ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter,NULL
mov buffer[0],0
lea eax,buffer
mov ofn.lpstrFile,eax
mov ofn.nMaxFile,sizeof buffer
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST or OFN_OVERWRITEPROMPT
mov ofn.lpstrDefExt,NULL
;Show save as dialog
invoke GetSaveFileName,addr ofn
.if eax
invoke SaveFile,addr buffer
.if !eax
;The file was saved
invoke lstrcpy,addr FileName,addr buffer
invoke SetWinCaption
mov eax,FALSE
.endif
.else
mov eax,TRUE
.endif
ret
SaveEditAs endp
SaveEdit proc
;Check if filrname is (Untitled)
invoke lstrcmp,addr FileName,addr NewFile
.if eax
invoke SaveFile,addr FileName
.else
invoke SaveEditAs
.endif
ret
SaveEdit endp
WantToSave proc
LOCAL buffer[512]:BYTE
LOCAL buffer1[2]:BYTE
invoke SendMessage,hREd,EM_GETMODIFY,0,0
.if eax
invoke lstrcpy,addr buffer,addr WannaSave
invoke lstrcat,addr buffer,addr FileName
mov ax,'?'
mov word ptr buffer1,ax
invoke lstrcat,addr buffer,addr buffer1
invoke MessageBox,hWnd,addr buffer,addr AppName,MB_YESNOCANCEL or MB_ICONQUESTION
.if eax==IDYES
invoke SaveEdit
.elseif eax==IDNO
mov eax,FALSE
.else
mov eax,TRUE
.endif
.endif
ret
WantToSave endp
OpenEdit proc
LOCAL ofn:OPENFILENAME
LOCAL hFile:DWORD
LOCAL editstream:EDITSTREAM
LOCAL buffer[MAX_PATH]:BYTE
LOCAL chrg:CHARRANGE
;Zero out the ofn struct
invoke RtlZeroMemory,addr ofn,sizeof ofn
;Setup the ofn struct
mov ofn.lStructSize,sizeof ofn
push hWnd
pop ofn.hwndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter,NULL
mov buffer[0],0
lea eax,buffer
mov ofn.lpstrFile,eax
mov ofn.nMaxFile,sizeof buffer
mov ofn.lpstrDefExt,NULL
mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_HIDEREADONLY or OFN_PATHMUSTEXIST
;Show the Open dialog
invoke GetOpenFileName,addr ofn
.if eax
;Open the file
invoke CreateFile,addr buffer,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
.if eax!=INVALID_HANDLE_VALUE
mov hFile,eax
;Copy buffer to FileName
invoke lstrcpy,addr FileName,addr buffer
;stream the text into the richedit control
push hFile
pop editstream.dwCookie
mov editstream.pfnCallback,offset StreamInProc
invoke SendMessage,hREd,EM_STREAMIN,SF_TEXT,addr editstream
invoke CloseHandle,hFile
invoke SendMessage,hREd,EM_SETMODIFY,FALSE,0
mov chrg.cpMin,0
mov chrg.cpMax,0
invoke SendMessage,hREd,EM_EXSETSEL,0,addr chrg
invoke SetWinCaption
mov eax,FALSE
.else
invoke MessageBox,hWnd,addr OpenFileFail,addr AppName,MB_OK
mov eax,TRUE
.endif
.endif
ret
OpenEdit endp
SetFormat proc hWin:DWORD
LOCAL chrg1:CHARRANGE
LOCAL chrg2:CHARRANGE
LOCAL pf:PARAFORMAT2
LOCAL cf:CHARFORMAT
LOCAL tp:DWORD
LOCAL buffer[16]:BYTE
LOCAL pt:POINT
LOCAL hDC:HDC
;Save modify state
invoke SendMessage,hWin,EM_GETMODIFY,0,0
push eax
;Save selection
invoke SendMessage,hWin,EM_EXGETSEL,0,addr chrg1
invoke SendMessage,hWin,EM_HIDESELECTION,TRUE,0
;Select all text
mov chrg2.cpMin,0
mov chrg2.cpMax,-1
invoke SendMessage,hWin,EM_EXSETSEL,0,addr chrg2
;Set font charset
mov cf.cbSize,sizeof cf
mov cf.dwMask,CFM_CHARSET or CFM_FACE or CFM_SIZE or CFM_COLOR
mov al,lfnt.lfCharSet
mov cf.bCharSet,al
mov al,lfnt.lfPitchAndFamily
mov cf.bPitchAndFamily,al
invoke lstrcpyn,addr cf.szFaceName,addr lfnt.lfFaceName,LF_FACESIZE
mov eax,lfnt.lfHeight
neg eax
mov ecx,15
mul ecx
mov cf.yHeight,eax
mov eax,rgb
mov cf.crTextColor,eax
invoke SendMessage,hWin,EM_SETCHARFORMAT,SCF_SELECTION,addr cf
;Get tab width
invoke GetDC,hWin
mov hDC,eax
invoke SelectObject,hDC,hFont
push eax
mov eax,'WWWW'
mov dword ptr buffer,eax
invoke GetTextExtentPoint32,hDC,addr buffer,4,addr pt
pop eax
invoke SelectObject,hDC,eax
invoke ReleaseDC,hWin,hDC
mov eax,pt.x
mov ecx,TabSize
mul ecx
mov ecx,15
mul ecx
shr eax,2
mov tp,eax
;Set tab stops
mov pf.cbSize,sizeof pf
mov pf.dwMask,PFM_TABSTOPS
mov pf.cTabCount,MAX_TAB_STOPS
xor eax,eax
xor edx,edx
mov ecx,MAX_TAB_STOPS
@@:
add eax,tp
mov dword ptr pf.rgxTabs[edx],eax
add edx,4
loop @b
invoke SendMessage,hWin,EM_SETPARAFORMAT,0,addr pf
;Restore modify state
pop eax
invoke SendMessage,hWin,EM_SETMODIFY,eax,0
;Restore selection
invoke SendMessage,hWin,EM_EXSETSEL,0,addr chrg1
invoke SendMessage,hWin,EM_HIDESELECTION,FALSE,0
ret
SetFormat endp
compileproc proc
LOCAL doname[MAX_PATH]:BYTE
LOCAL doname1[MAX_PATH]:byte
LOCAL hFile:DWORD
LOCAL buffer[MAX_PATH]:BYTE
invoke lstrcat,addr doname1,addr FileName
invoke lstrcat,addr doname1,addr listcat
invoke ShellExecute,0,0,addr szFileName1,addr doname1 ,0,SW_HIDE
CMP eax,31
JLE WRONG
invoke lstrlen,addr FileName
sub eax,3
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -