我喷血建议所有的还对C++(VC)发愁的兄弟们都来学学WIN32位汇编~~~建议大家来看看~我自己的经历

msadmin 2002-12-27 02:46:38
如果你对VC(MFC)愁眉苦脸的话,我建议你们现把它暂时放下来,(那说明你对windows消息机制没理解)好好去学学WIN32汇编(记住不是DOS汇编),等你用它作出第一个窗口时我想你应该对WIN编程有个很清晰的认识了,我自己有很深刻的体验,而且比C(SDK)代码执行效率要高,更精简,更可以去逼迫你去认真学计算机体系结构(Intel80x86).都大有好处~~~我就是当是看MFC非常糊涂,最后究其原因是对WIN编程方法没有理解掌握,准备去学C(SDK),但我又买不其那本160元的《programming windows》其他资料太零碎了,偶而看到本WIN32汇编的CHM,看了看代码,都是调用API,感觉代码很清晰,很多原来不理解的地方豁然开朗,推荐罗云彬的新那本书。
现附上我用WIN32汇编写的第一个窗口程序:是不是感觉代码很优美?

.386
.model flat,stdcall
option casemap:none

include windows.inc
include gdi32.inc
includelib gdi32.lib
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib

.data?
hInstance dd ?
hWinMain dd ?

.const
szClassName db 'MyClass',0
szButton db 'button',0
szCaptionMain db 'My first Window!',0
szText db '狐狸糊涂',0
szButtonText db '&OK',0
.code
;窗口过程

_ProcWinMain proc uses ebx edi esi,hWnd,uMsg,wParam,lParam ;伪指令uses在子程序进入或退出时自动安插上push和pop寄存器指令
local @stPs:PAINTSTRUCT
local @stRect:RECT
local @hDc

mov eax,uMsg ;uMsg 是接收的消息

.if eax == WM_PAINT ;如果是我们感兴趣的消息则加以处理,处理完后,在 eax 寄存器中传递 0
invoke BeginPaint,hWnd,addr @stPs
mov @hDc,eax

invoke GetClientRect,hWnd,addr @stRect
invoke DrawText,@hDc,addr szText,-1,\
addr @stRect,\
DT_SINGLELINE or DT_CENTER or DT_VCENTER
invoke EndPaint,hWnd,addr @stPs

;.elseif eax == WM_CLOSE ;方法一
;invoke DestroyWindow,hWinMain ;DestroyWindow会引发一个WM_DESTROY消息
;invoke PostQuitMessage,NULL
.elseif eax == WM_DESTROY ;方法二
invoke PostQuitMessage,NULL

.elseif eax == WM_CREATE ;建立一个按钮
invoke CreateWindowEx,NULL,\
offset szButton,offset szButtonText,\
WS_CHILD or WS_VISIBLE,\
10,10,65,22,\
hWnd,1,hInstance,NULL
.else
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.endif
xor eax,eax ;将eax清零后返回
ret
_ProcWinMain endp

_WinMain proc
local @stWndClass:WNDCLASSEX ;定义一个WNDCLASSEX结构的变量@stWndClass
local @stMsg:MSG

invoke GetModuleHandle,NULL ;得到应用程序的句柄

mov hInstance,eax
invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;将@stWndClass填为全零,再填写结构的各个字段

;注册窗口类
invoke LoadCursor,0,IDC_ARROW
mov @stWndClass.hCursor,eax
push hInstance
pop @stWndClass.hInstance ;要注册的窗口类属于哪个模块
mov @stWndClass.cbSize,sizeof WNDCLASSEX
mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
mov @stWndClass.lpfnWndProc,offset _ProcWinMain
mov @stWndClass.hbrBackground,COLOR_WINDOW + 1
mov @stWndClass.lpszClassName,offset szClassName
invoke RegisterClassEx,addr @stWndClass ;把结构的地址当参数一次性传给RegisterClassEx

;创建并显示窗口
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW ,\
offset szClassName,offset szCaptionMain,\
WS_OVERLAPPEDWINDOW or WS_VSCROLL,\
100,100,600,400,\
NULL,NULL,hInstance,NULL
mov hWinMain,eax
invoke ShowWindow,hWinMain,SW_SHOWNORMAL
invoke UpdateWindow,hWinMain ;程序调用UpdateWindows,这个函数向窗口过程发送一条WM_PAINT消息

;消息循环

.while TRUE
invoke GetMessage,addr @stMsg,NULL,0,0
.break .if eax == 0
invoke TranslateMessage,addr @stMsg
invoke DispatchMessage, addr @stMsg
.endw
ret

_WinMain endp


start:
call _WinMain
invoke ExitProcess,NULL

end start

其实WINDOWS编程说白就是用户在窗口作了动作,WINDOWS发消息给应用程序,用它的窗口过程来相应消息。谁掌握的API多+对OS的理解,WINDOWS编程不难
...全文
302 88 打赏 收藏 转发到动态 举报
写回复
用AI写文章
88 条回复
切换为时间正序
请发表友善的回复…
发表回复
giantzz 2003-02-09
  • 打赏
  • 举报
回复
当了懂事才"董事",学了汇编才"会编"
这个"会编"敢问谁能理解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
心雨楼 2003-02-09
  • 打赏
  • 举报
回复
realdreamer,久仰大名,特来拜见
msadmin 2003-02-09
  • 打赏
  • 举报
回复
up
snowshow 2003-01-19
  • 打赏
  • 举报
回复
0101001
招RD和QA 2003-01-19
  • 打赏
  • 举报
回复
up
hurry2002 2003-01-19
  • 打赏
  • 举报
回复
学习,大家的话好精彩!!
我也想去学asm,我还是比较喜欢在了解内部的前提下来用上层的东西,这样,对全局都有一个了解,可以实现最优化!
我是电子专业的,当我不知道变压器(发电厂的那种)的机构和原理时,我可不敢乱碰它!
msadmin 2003-01-19
  • 打赏
  • 举报
回复
用汇编的思想去学SDK,语言就用C就可以了
OldNewton 2003-01-19
  • 打赏
  • 举报
回复
up
ilian 2003-01-16
  • 打赏
  • 举报
回复
看到楼主这么穷真是…

http://www.vcroad.net/progbook/sdkbook/ProgrammingWindows_tw.chm

希望对你有帮助啦!

ilian 2003-01-16
  • 打赏
  • 举报
回复
win32asm 和 win c 开发程序全用 api 都是 sdk 式的编程 ,除了语言的差

异外其它的并没有多少的区别,总之学sdk,汇编要学C也要学。

开发程序如果要选择的话C是最好的,开发木马什么的,做出来的并不比汇编的大

多少,汇编嘛调式和破解就用到了,和和。

beasts 2003-01-16
  • 打赏
  • 举报
回复
折衷方案:C/C++内嵌汇编
msadmin 2003-01-15
  • 打赏
  • 举报
回复
UP
elabs 2003-01-03
  • 打赏
  • 举报
回复
老兄不会吧,学VC不入门,WIN32汇编却没问题??

我学了一段VC了,基本会使了


但WIN32汇编看了点,一点都没有头绪啊.
明天去抢劫 2003-01-03
  • 打赏
  • 举报
回复
你累不累啊
farfh 2003-01-03
  • 打赏
  • 举报
回复
汇编,烦死了,哪儿有c来得方便啊,晕死,win32汇编还不是一样调用api,为了编译出来的那一点效率去浪费大量时间写一堆无聊枯燥的代码实在不划算(我的建议是干脆用全asm的,不调用api,慢慢画一个窗口出来,这样才酷毙了,哈哈)。学习windows消息模型,直接学c语言的sdk就行,而且简单明了,个人建议,如果更深层次了解,学驱动编写吧。
msadmin 2003-01-03
  • 打赏
  • 举报
回复
WIN32汇编
andy_jqh 2003-01-02
  • 打赏
  • 举报
回复
JoshuaLi(上述操作保证造成内存泄露)
你真是厉害阿 这么尖锐的问题都被你发现了、
厉害,请阁下去遍名字解释分类字典吧
msadmin 2003-01-02
  • 打赏
  • 举报
回复
up
rivershan 2003-01-02
  • 打赏
  • 举报
回复
用汇编写大程序纯粹是自己跟自己过不去~
写写关键代码还可以~
msadmin 2002-12-31
  • 打赏
  • 举报
回复
我就这个问题已经向罗云彬老师讨教了,
他给我回了封信,在这里我很感谢他对我的帮助
以下是他的原文:

你好!

我以前学习Windows编程的过程就和你的学习过程一模一样,感想也是如此,就是:自从学会了从汇编的角度去看系统以后,再学其他的语言似乎很简单,因为你可以感觉到这些语言的底层是怎么运行的。
实际上,我觉得很多人的误区在于一定要说什么语言是最好的,而除此之外的都是不好的,但事实上并不是如此,任何语言都有它的长处和短处,关键在于怎么去发挥长处而避免短处。比如用汇编写杀毒软件、驱动、小巧精悍的系统工具很方便,用PB去写数据库应用程序很不错,
而反过来就是自讨苦吃。就拿我自己来说,我除了用汇编,用ASP、Oracle也用得很多,也偶尔用用VC,我的原则是并不是我喜欢汇编、精通汇编就一定要什么都用汇编,而是用什么合适就用什么。

还有一点就是,当一个学了VB的人去学了VC后,会觉得VB是白学了,但学了Win32汇编以后,再学任何东西都不会觉得汇编是白学的!你说呢? :)
加载更多回复(68)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧