首页
社区
课程
招聘
[旧帖] [求助]RadAsm编译好.exe文件运行不了 源码如下 0.00雪花
发表于: 2013-7-11 16:22 1984

[旧帖] [求助]RadAsm编译好.exe文件运行不了 源码如下 0.00雪花

2013-7-11 16:22
1984
我很菜,刚开始学Win32汇编,为什么不行希望能解说的详细一点,谢谢

.386
.model flat,stdcall
option casemap:none

;include 文件定义
include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc
include gdi32.inc
includelib gdi32.lib
includelib user32.lib
includelib kernel32.lib
includelib masm32.lib

form equ 1000   ;窗体的ID=1000;Form=100;Equ 等值定义。(定义的是一些窗体的ID和控件的ID)

.data?;数据段
hInstance dd        ? ;定义的是模块句柄的变量 未赋值后面加"?"

.code;代码段
_FormMsg        proc        uses ebx edi esi hWnd,wMsg,wParam,IParam
       
        ;这是一个函数定义
        ;_ProcWinMain:函数
        ;proc:伪指令,表示要声明函数了。。。
        ;uses ebx edi esi:USES操作符,允许列出被过程修改的所有寄存器(次过程中为ebx edi
        ;esi),它只是编译器做两件事,首先在过程的开始出生成PUSH指令在堆栈上保存寄存器
        ;其次,在过程的结束出生成POP指令恢复这些寄存器的值.
        ;
        ;hWnd,uMsg,wParam,IParam:过程的四个参数句柄,windows消息,
        ;WPARAM常常代表一些空间的ID或者高位低位组合起来分别表示鼠标的位置,
        ;如果消息的发送者需要发送另类信息的话,习惯上用LPARAM来传递
                mov        eax,wMsg
                .if        eax == WM_CLOSE
               
                        invoke        EndDialog,hWnd,NULL
                       
                .elseif        eax == WM_INITDIALOG
                .else
               
                        mov eax,FALSE
                       
                .endif
                ret
_FormMsg        endp

               
start:

                invoke GetModuleHandle,NULL
        ;GetModuleHandle 得到模块的句柄
        ;参数为模块的名称,比如abc.dll(也可能有.exe,不过较少)。
        ;如果参数为NULL,表示取当前进程(.exe)的模块句柄
        ;模块句柄实际上就是模块在当前进程空间的装入地址。
        ;exe程序装入句柄一般为0x00400000
                mov        hInstance,eax
                invoke        DialogBoxParam ,hInstance,form,NULL,offset _FormMsg,NULL
                ;为了避免出现错误,建议除在局部变量中引用addr外,其他场合使用offset,
                ;addr伪操作符只能用在 invoke 伪指令汇中
                invoke        ExitProcess,NULL
end        start

*************************下面是RC资源文件内容**********************
#define 123 1000

123 DIALOGEX 10,10,150,100
CAPTION "IDD_DLG"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
BEGIN
END

*************************编译信息*****************************
D:\Program Files\RadASM\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"D:\Program Files\RadASM\Masm32\Include" "尼玛.asm"
Assembling: 尼玛.asm

构建完成.
总共编译时间 265 毫秒
****************************构建信息******************************
D:\Program Files\RadASM\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"D:\Program Files\RadASM\Masm32\Include" "尼玛.asm"
Assembling: 尼玛.asm
D:\Program Files\RadASM\Masm32\Bin\LINK.EXE /SUBSYSTEM:WINDOWS /RELEASE /VERSION:4.0 /LIBPATH:"D:\Program Files\RadASM\Masm32\Lib" /OUT:"尼玛.exe" "尼玛.obj" "尼玛.res"
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

构建完成.
总共编译时间 375 毫秒
******************************执行信息****************************
执行:
"D:\Program Files\RadASM\Masm\Projects\尼玛\尼玛.exe"

构建完成.
总共编译时间 313 毫秒

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1121
活跃值: (652)
能力值: ( LV5,RANK:66 )
在线值:
发帖
回帖
粉丝
2
最好把程序出错的界面贴出来吧
2013-7-11 16:32
0
雪    币: 622
活跃值: (294)
能力值: ( LV13,RANK:410 )
在线值:
发帖
回帖
粉丝
3
MSDN:http://msdn.microsoft.com/en-us/library/ms645469(v=vs.85).aspx
DialogProc callback function
Typically, the dialog box procedure should return TRUE if it processed the message, and FALSE if it did not.

所以你的_FormMsg结尾这样写应该可以了:
        .else
        mov                eax,FALSE
        ret
        .endif
        mov                eax,TRUE
        ret
_FormMsg  endp
2013-7-11 18:42
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
4
劳驾您将工程Demo, 上传到主贴好么?
00401000  /.  55            push    ebp
00401001  |.  8BEC          mov     ebp, esp
00401003  |.  53            push    ebx
00401004  |.  57            push    edi
00401005  |.  56            push    esi
00401006  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
00401009  |.  83F8 10       cmp     eax, 10
0040100C  |.  75 0C         jnz     short 0040101A
0040100E  |.  6A 00         push    0                                ; /Result = 0
00401010  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
00401013  |.  E8 4A000000   call    <jmp.&user32.EndDialog>          ; \EndDialog
00401018  |.  EB 0E         jmp     short 00401028
0040101A  |>  3D 10010000   cmp     eax, 110
0040101F  |.  75 02         jnz     short 00401023
00401021  |.  EB 05         jmp     short 00401028
00401023  |>  B8 00000000   mov     eax, 0
00401028  |>  5E            pop     esi
00401029  |.  5F            pop     edi
0040102A  |.  5B            pop     ebx
0040102B  |.  C9            leave
0040102C  \.  C2 1000       retn    10
0040102F >/$  6A 00         push    0                                ; /pModule = NULL
00401031  |.  E8 38000000   call    <jmp.&kernel32.GetModuleHandleA> ; \GetModuleHandleA
00401036  |.  A3 00304000   mov     dword ptr [403000], eax
0040103B  |.  6A 00         push    0                                ; /lParam = NULL
0040103D  |.  68 00104000   push    00401000                         ; |DlgProc = test1928.00401000
00401042  |.  6A 00         push    0                                ; |hOwner = NULL
00401044  |.  68 E8030000   push    3E8                              ; |pTemplate = 3E8
00401049  |.  FF35 00304000 push    dword ptr [403000]               ; |hInst = 00400000
0040104F  |.  E8 08000000   call    <jmp.&user32.DialogBoxParamA>    ; \DialogBoxParamA执行后, 直接到了401054, 没进00401000窗口回调
00401054  |.  6A 00         push    0                                ; /ExitCode = 0
00401056  \.  E8 0D000000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess
2013-7-11 20:02
0
雪    币: 112
活跃值: (57)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
5
看了您的代码, 就是一个框架工程.
我生成了一个asm Dlg框架工程, 能跑。
看起来窗口回调处理的定义, 和您描述的不同。

如果您不上工程,别人不能准确定位问题吧?

有可能是您的工程设置, 资源文件ID不对之类的, 或者您手误写代码写错了。
请上传您有问题的MASM工程, 求观摩
上传的附件:
2013-7-11 20:36
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
以为这样就容易让别人看明白了 ,结果还是很难让别人明白。。。。哎 这样吧,对于这个问题 我绝望了,不深究了,哪天我在犯病了 在来回复吧   谢谢你的关注
2013-7-14 16:46
0
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
问题已经解决了 谢谢   
**************资源文件****************
#define IDD_DLG1 1000
IDD_DLG1 DIALOGEX 10,10,171,96
CAPTION "Form1-汇编对话框窗体"
FONT 8,"MS Sans Serif",0,0,0
;STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
STYLE 0x10CF0000                           *问题就是这里 屏蔽掉或者换成这个,但是我不知道为啥,只知道这个功能是 关闭窗口
BEGIN
END
************************************************
2013-7-14 17:59
0
游客
登录 | 注册 方可回帖
返回
//