首页
社区
课程
招聘
[求助]请教一个fasm的问题
发表于: 2008-4-6 01:39 8751

[求助]请教一个fasm的问题

2008-4-6 01:39
8751
小弟刚接触asm, 对fasm比较倾向。。 写程序时候遇到问题。 因为fasm没有RtlZeroMemory等。所以小弟采用lea 指令来获取局部变量的地址。这是一个窗口的程序,但是无奈,编译是通过的。窗口不显示,大致觉得肯定是那里获取地址错误了。无奈,fasm相关的资料甚少。找了下fasm自带的窗口例子,都是直接声明的全局变量。没有局部变量的相关例子,没办法,来看雪请教下,不知道是否有志同道合的朋友,帮忙解决下问题。。

小弟在此谢谢了。。

format        PE  GUI  4.0
include '%include%\win32a.inc'
include '%include%\MY_MACRO.INC'

entry _start

section  '.data'  data  readable  writeable
     hInstance     rd      1
     hWinMain           rd           1
     szClassName   db   'Fasm Windows Proc', 0
     szWndName           db        '第一个程序', 0

;        import  section
section  '.import'  import  data  readable  writeable
  library  kernel32, 'KERNEL32.DLL',\
           user32, 'USER32.DLL'
  
  include 'api\kernel32.inc'
  include 'api\user32.inc'

;        code section
section  '.code'    code  readable  executable

;*******************************************************************
;窗口过程函数
;*******************************************************************
proc  _ProcWinMan, hwnd, wmsg, wparam, lparam
        push        ebx esi edi ; 保存指针寄存器
        cmp        [wmsg], WM_DESTROY
        je        .wmdestroy
       
.defwndproc:
        callw        DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
        jmp        .finish
.wmdestroy:
        callw        PostQuitMessage,0
        xor        eax, eax
.finish:       
        pop        ebx  esi edi
        ret
endp
       
proc  _WinMain
        local        @stWndClass : WNDCLASSEX
        local        @stMsg : MSG
        
        callw        GetModuleHandle, NULL
        mov        [hInstance], eax
       
        lea        edi,[@stWndClass]
        mov        ecx, sizeof.WNDCLASSEX/4
        xor        eax,eax
        rep        stosd  

;******************************************************************
;注册窗口类
;******************************************************************
       ;第一个参数则表示图标的模块句柄,NULL则表示使用windows提供标准的图标
       callw        LoadIcon, NULL, IDI_WINLOGO
       mov        [@stWndClass.hIcon], eax
       push        hInstance
       pop        [@stWndClass.hInstance]
       callw        LoadCursor, NULL, IDC_ARROW
       mov        [@stWndClass.hCursor], eax
       mov        [@stWndClass.cbSize], sizeof.WNDCLASSEX
       mov        [@stWndClass.style], CS_HREDRAW or CS_VREDRAW
       mov        [@stWndClass.lpfnWndProc], _ProcWinMan
       mov        [@stWndClass.lpszClassName], szClassName
       mov        [@stWndClass.hbrBackground], COLOR_WINDOW+1
       lea        ebx, [@stWndClass]
       callw        RegisterClassEx, ebx

;******************************************************************
;建立并显示窗口
;******************************************************************
       callw        CreateWindowEx, WS_EX_PALETTEWINDOW, szClassName, szWndName,\
                WS_OVERLAPPEDWINDOW,\
                100, 100, 600, 400,\
                NULL, NULL, hInstance, NULL
       mov        [hWinMain], eax
       callw        ShowWindow, [hWinMain], SW_SHOWNORMAL
       callw        UpdateWindow, [hWinMain]

      
;********************************************************************
;消息循环
;**********************************************************************
msg_loop:      
       lea        ebx, [@stMsg]
       callw        GetMessage, ebx, NULL, 0, 0
       or        eax, eax        ;or做或运算。如果ZF标志位为1,则跳转之标号
       je        end_loop        ;如果zf标志位为1,退出程序。因为这表示发送的是WM_QUIT消息
       callw        TranslateMessage, ebx
       callw        DispatchMessage, ebx
       jmp        msg_loop       
     
end_loop:
      callw ExitProcess, 0
      
      
      ret
endp

_start:
      call        _WinMain
      callw        ExitProcess, NULL

已经解决,版主结贴吧。。。 粗心造成的问题。。 主要是lea获取地址太郁闷。哎 回去封装个宏。。。。。。。。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (19)
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
2
对fasm不太熟悉,不过,有一句却是明显错的,
proc  _ProcWinMan, hwnd, wmsg, wparam, lparam
  push  ebx esi edi ; 保存指针寄存器
  cmp  [wmsg], WM_CLOSE
  je  .wmdestroy ; 这一句不管消息是什么都会跳到关闭窗口的代码中去,窗口当然显示不出来,因为都被你关闭了。
  
  .wmdestroy:
  callw  DestroyWindow,hWinMain
  callw  PostQuitMessage, 0
        xor  eax, eax
  .defwndproc:
  callw  DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
  pop  ebx  esi edi
  ret
endp
2008-4-6 08:10
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢。。。郁闷..修改过了,还是不行。。
2008-4-6 12:51
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这为朋友的句柄在乱用啊,什么时候用进程句柄,什么时候有窗口句柄?
2008-4-6 13:23
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
倒塌。楼上的朋友看清楚代码 。
还有那不是进程句柄 ,是实例句柄。。。
2008-4-6 14:09
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
已经解决。版主结贴吧。。。粗心造成的问题。。。

callw  ShowWindow, [hWinMain], SW_SHOWNORMAL
       callw  UpdateWindow, [hWinMain]
2008-4-6 14:40
0
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
我也在正学用FASM 用法
MY_MACRO.INC 的原型定义是什么
请楼主放上来吧
谢谢
2008-4-7 08:41
0
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
>> callw  DefWindowProc, [hwnd], [wmsg], [wparam], [lparam]
>> callw  PostQuitMessage,0
稍微看了一下内容
callw 是什么
楼主你自定义的嘛

应该是这样才对
invoke        DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
invoke        PostQuitMessage,0
2008-4-7 08:53
0
雪    币: 205
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
是自己定义的宏。。。。。   

; _stdcall  proc
macro  callw  _proc, [_argc]
{
        reverse
          push  _argc
      
        common
          call  [_proc]
}

呵呵 ,其实fasm宏很强大的。。    在来个

macro callp _proc, _argc
{
      reverse
      lea        eax, [_argc]
      push        eax
      
      common
      call     [_proc]  
}

这样就可以和masm的取局部变量的addr一样了。。  呵呵,自己慢慢封装吧。。。
2008-4-7 13:57
0
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
>>这样就可以和masm的取局部变量的addr一样了。。  呵呵,自己慢慢封装吧。。。
那再请教
哪里何处有比较全套的MACRO
FASM 程序怎都没有RC RES
看了好几个范例 都没有这方面的相关Document
2008-4-7 15:59
0
雪    币: 315
活跃值: (23)
能力值: ( LV9,RANK:220 )
在线值:
发帖
回帖
粉丝
11
这些宏都是自己封装的。。。。 没有成套的。

哈哈这个是我的另一个号,郁闷没注意登陆错了。。。

  我记得例子里有自带的资源相关的例子。。。 楼主也是fasm的热爱者??? 我QQ4159175,可以加我一起研讨。。 国内搞fasm的人忒少,相关资料也是甚少。。。。 很多都需要自己去不断的尝试和学习。。
2008-4-7 16:20
0
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12

敝人喜好研究相关Assembler
像是MASM TASM FASM NASM Poasm GoAsm RadASM HLA 等

FASM 的秘笈真是少的可怜
难道FASM 不能RC 嘛
难道不能混合编程嘛
真奇怪啊
2008-4-7 17:48
0
雪    币: 234
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
13
>>我QQ4159175,可以加我一起研讨。。
>>国内搞fasm的人忒少,相关资料也是甚少。。。。 很多都需要自己去不断的尝试和学习。。
今年过年的时候
还有安装QQ
过完年后就移除了(因为... 某些缘故)

所以还是论坛讨论吧
在一蓑烟雨网名CCHLord那边论坛也可以
2008-4-7 17:51
0
雪    币: 104
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
FASM只能在代码里自己写资源,不过作者已经提供了一些宏来辅助。还有一种办法,就是format MS COFF,然后使用golink之类的链接工具和res文件链接在一起。
2008-5-23 09:30
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
你说的是错的
自己不清楚的事,请不要乱用判断句
2008-5-23 10:56
0
雪    币: 104
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
谢谢您指出我的错误,但是不才不明白您所指的是上面所说的哪一句,麻烦您指出来,多谢!
2008-5-23 11:02
0
雪    币: 249
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
17
FASM只能在代码里自己写资源,不过作者已经提供了一些宏来辅助。还有一种办法,就是format MS COFF,然后使用golink之类的链接工具和res文件链接在一起。

"只能"

可以直接在源文件里加上
data resource from 'Dialog.RES'
end data
2008-5-23 11:09
0
雪    币: 104
活跃值: (73)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
您说的对,FASM新版本里的确是有这个指令。谢谢指点。
2008-5-23 11:15
0
雪    币: 210
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
section '.rsrc' resource from 'a.RES' data readable
fasm引用res资源文件,真正用fasm写东西的人肯定不会陌生。
希望谁可以建一个fasm的群或者论坛,方便newbies入门。
2008-5-25 16:48
0
雪    币: 70
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
fasm 群: 3827538
2008-5-26 10:31
0
游客
登录 | 注册 方可回帖
返回
//