阅读:636回复:0
关于Iczelion Win32“汇编”教程
我刚看了下那个中文版,我不知道下面这段从那里摘出来的代码和C有什么不同。
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX LOCAL msg:MSG LOCAL hDlg:HWND 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,COLOR_BTNFACE+1 mov wc.lpszMenuName,OFFSET MenuName mov wc.lpszClassName,OFFSET ClassName invoke LoadIcon,NULL,IDI_APPLICATION mov wc.hIcon,eax mov wc.hIconSm,eax invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor,eax invoke RegisterClassEx, addr wc invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL mov hDlg,eax invoke ShowWindow, hDlg,SW_SHOWNORMAL invoke UpdateWindow, hDlg invoke GetDlgItem,hDlg,IDC_EDIT invoke SetFocus,eax .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke IsDialogMessage, hDlg, ADDR msg .IF eax ==FALSE invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDIF .ENDW mov eax,msg.wParam ret WinMain endp 改写成C就是 DWORD WinMain(................) { WNDCLASSEX wc; MSG msg; HWND hDlg; wc.cbSize = sizeof(WNDCLASSEX); wc.xxx = xxxxx; ............ LoadIcon(NULL,IDI_APPLICATION); .................... while(TRUE) { if(!GetMessage(&msg,NULL,0,0)) break; if(sDialogMessage(hDlg,msg) == FALSE) { TranslateMessage(msg); DispatchMessage(msg ); } } } 好简单,几乎和C一模一样。 但既然这样,我不明白有什么理由不用C而用汇编。而且C里还可以内嵌汇编。 这种写法,失去了汇编的乐趣。 如果只用invoke或者带参数的call,倒是可以理解,因为这样只是少写几个push,你还能完全控制代码。但那些.IF之类的,把代码的控制完全交给汇编器了。这种情况汇编器更像一个编译器,那么这种汇编真的和C没什么区别,失去了玩弄汇编的乐趣。 很多用MASM的人奉Iczelion教程为经典,这东西在Win32方面确实值得一看,但在汇编方面,则实在没什么值得一看的了。 大多数用MASM的人都这样写代码,虽然可以不这么写,完全自己写,但我还是不敢用MASM了。 btw,TASM里一样可以写成上面那样,但我看到的比较少,所以不会反感。 [编辑 - 11/4/02 by Koms Bomb] |
|
|