我的程序为什么不能正常运行呀?

hgwi 2003-05-02 01:05:22
本来想让鼠标一进入窗口按钮就自动移开,但为什么鼠标一进入窗口,按钮就不见了,到底是什么地方出的问题呀?请帮帮我谢谢!
.386
.model flat,stdcall
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
iRand proto :DWORD, :DWORD
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib

.data
ClassName db "SimpleWinClass",0
AppName db "程序演示-控件",0
ButtonClassName db "button",0
ButtonText db "来点我",0
.data?
hInstance HINSTANCE ?
CommandLine LPSTR ?
hwndButton HWND ?
MousePoint POINT <>
ButtonPoint POINT <>
ButtonRect RECT <>
WinRect RECT<>
.const
ButtonID equ 1
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd: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,NULL
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,NULL
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 CreateWindowEx,NULL,ADDR ClassName, \
ADDR AppName, WS_OVERLAPPEDWINDOW,\
CW_USEDEFAULT, CW_USEDEFAULT,\
300,200,NULL,NULL, hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
.IF uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATE
invoke CreateWindowEx,NULL, ADDR uttonClassName,ADDR \ButtonText,WS_CHILD or WS_VISIBLE or \BS_DEFPUSHBUTTON,70,75,140,25,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax
invoke SetFocus, hwndButton
.ELSEIF uMsg==WM_MOUSEMOVE
mov eax,lParam
and eax,0FFFFH
mov MousePoint.x,eax
mov eax,lParam
shr eax,16
mov MousePoint.y,eax
invoke GetWindowRect,hwndButton,ADDR ButtonRect
mov eax,ButtonRect.left
mov edx,ButtonRect.right
.IF MousePoint.x>eax&&MousePoint.x<edx
mov eax,ButtonRect.top
mov edx,ButtonRect.bottom
.IF MousePoint.y>eax&&MousePoint.y<edx
invoke GetWindowRect,hInstance,ADDR WinRect invoke iRand,WinRect.left,WinRect.right
mov ButtonRect.left,eax
invoke iRand,WinRect.top,WinRect.bottom mov ButtonRect.right,eax
.ENDIF
.ENDIF
invoke SetWindowPos,hwndButton,NULL,ButtonRect.left,
\ButtonRect.right,NULL,NULL,SWP_NOSIZE
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
iRand proc uses ecx edx first:DWORD, second:DWORD
invoke GetTickCount ; 取得随机数种子,当然,可用别的方法代替
mov ecx, 23 ; X = ecx = 23
mul ecx ; eax = eax * X
add eax, 7 ; eax = eax + Y (Y = 7)
mov ecx, second ; ecx = 上限
sub ecx, first ; ecx = 上限 - 下限
inc ecx ; Z = ecx + 1 (得到了范围)
xor edx, edx ; edx = 0
div ecx ; eax = eax mod Z (余数在edx里面)
add edx, first ; 修正产生的随机数的范围
mov eax, edx ; eax = Rand_Number
ret
iRand endp
end start
...全文
147 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hgwi 2003-05-04
  • 打赏
  • 举报
回复
对呀我把两个参数传送到EAX,EDX中原因是.IF指令必须比较至少含1个寄存器的两个内容
abutter 2003-05-04
  • 打赏
  • 举报
回复
什么运行不了,是编译不了还是运行出错。

我的经验是,如果你的程序出错但能编译成功,一般是指针的问题,就是API中的指针参数你没有写对造成空指针。

仔细看看程序吧。
用户 昵称 2003-05-04
  • 打赏
  • 举报
回复
有两个地方可能需要注意
1)就是屏幕坐标和窗体坐标的关系
2)就是可能按钮的鼠标移动的消息你接收不到。
用户 昵称 2003-05-02
  • 打赏
  • 举报
回复
我对32位程序不太懂,觉得你对MousePoint.x和MousePoint.y都判断eax,edx是不是不对?
.IF MousePoint.x > eax && MousePoint.x < edx
mov eax,ButtonRect.top
mov edx,ButtonRect.bottom
.IF MousePoint.y > eax && MousePoint.y < edx
invoke GetWindowRect,hInstance,ADDR WinRect
invoke iRand,WinRect.left,WinRect.right
mov ButtonRect.left,eax
invoke iRand,WinRect.top,WinRect.bottom
mov ButtonRect.right,eax
.ENDIF
invoke SetWindowPos,hwndButton,NULL,ButtonRect.left, ButtonRect.right,NULL,NULL,SWP_NOSIZE
.ENDIF
构网型变流器正负序阻抗解耦特性及扫频验证研究(Simulink仿真实现)内容概要:本文围绕构网型变流器的正负序阻抗解耦特性及其扫频验证方法展开研究,基于Simulink平台构建仿真模型,深入分析构网型变流器在不对称电网条件下的阻抗特性。通过建立正负序阻抗模型,揭示其解耦机理,并采用小信号注入法进行扫频仿真,提取频率响应数据以验证理论建模的准确性。研究重点在于掌握构网型变流器在复杂电网环境中的稳定性表现,尤其是其与电网交互作用下的动态响应特性,为提升新型电力系统中逆变器并网稳定性提供理论支持和技术路径。; 适合人群:具备电力电子、电力系统分析或自动控制相关背景,熟悉Simulink仿真工具,从事新能源并网、微电网控制、逆变器建模与稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 掌握构网型变流器正负序阻抗建模与解耦分析方法;② 学习基于扫频法的小信号稳定性评估技术;③ 应用于构网型逆变器控制系统设计与并网稳定性优化;④ 支撑高水平论文撰写与科研项目实施。; 阅读建议:建议读者结合Simulink仿真模型同步操作,深入理解扫频仿真流程与阻抗提取方法,关注正负序耦合对系统稳定性的影响机制,同时参考文中建模思路拓展至其他类型变流器的稳定性分析研究。
【虚拟储能】建筑综合能源优化+热舒适度研究(Matlab代码实现)内容概要:本文围绕“虚拟储能”概念,重点研究建筑综合能源系统的优化运行与热舒适度提升,采用Matlab进行代码实现与仿真分析。通过构建空调与电动汽车联合虚拟储能模型,实现对海岛微电网或建筑能源系统的协同优化调度,旨在平衡能源供需、降低能耗、提高可再生能源利用率,并兼顾用户的热舒适性需求。文中整合了智能优化算法、需求响应机制与多目标优化策略,展示了如何利用虚拟储能技术增强系统灵活性和经济性。; 适合人群:具备一定电力系统、能源系统或自动化背景,熟悉Matlab/Simulink仿真工具,从事相关领域科研工作的研究生及工程技术人员;尤其适合研究综合能源系统、微电网优化、需求侧管理与建筑节能方向的研究者。; 使用场景及目标:① 实现建筑或微电网中空调、电动汽车等柔性负荷参与虚拟储能的建模与仿真;② 掌握基于Matlab的综合能源系统多目标优化调度方法;③ 学习如何将热舒适度指标融入能源优化模型,提升系统的人性化与实用性;④ 为撰写高水平论文(如SCI/EI)或完成硕士/博士课题提供复现案例和技术支持。; 阅读建议:建议结合文中提供的完整资源(包括代码、文献、仿真模型)进行实践操作,重点关注目标函数设计、约束条件设定及算法实现细节。同时可参照其他类似主题(如V2G、需求响应、多能协同优化)的内容拓展研究思路。

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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