鱼C论坛

 找回密码
 立即注册
查看: 3078|回复: 4

[已解决]win32匯編21講 數據結構

[复制链接]
发表于 2019-10-29 17:20:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 kikiatw 于 2019-10-29 21:39 编辑

關於數據結構取址, 取值的問題, 小甲魚講解我感到很困惑
假如一個結構體的定義是這樣
  1. WNDCLASS STRUCT
  2.   style             DWORD      ?
  3.   lpfnWndProc       DWORD      ?
  4.   cbClsExtra        DWORD      ?
  5.   cbWndExtra        DWORD      ?
  6.   hInstance         DWORD      ?
  7.   hIcon             DWORD      ?
  8.   hCursor           DWORD      ?
  9.   hbrBackground     DWORD      ?
  10.   lpszMenuName      DWORD      ?
  11.   lpszClassName     DWORD      ?
  12. WNDCLASS ENDS
复制代码


我們在win32匯編內定義一個WNDCLASS 類型的變數 stWndClass
stWndClass WNDCLASS  <>

問題來了
1. mov eax,stWndClass.lpfnWndProc  (代表把 lpfnWndProc的值給eax)
2. mov eax,offset stWndClass.lpfnWndProc  (代表把 lpfnWndProc的位址給eax)
3. mov eax,[esi+WNDCLASS.lpfnWndProc] (代表 [esi+4] 給eax
4. mov eax,[esi+stWndClass.lpfnWndProc] (代表 [esi+stWndClass.lpfnWndProc的位址] 給eax

從上面弟4點可以推出下面這行
mov eax,[stWndClass.lpfnWndProc] 也是 (代表把 lpfnWndProc的值給eax)

所以為什麼下面兩者是一樣呢?
mov eax,stWndClass.lpfnWndProc 沒有中括號,
mov eax,[stWndClass.lpfnWndProc] 有中括號,

最佳答案
2019-10-29 21:42:17
1.png

事实上就是一样的,编译器就是这样做的,对于单个变量(标识符)也是一样的

  1. 所以為什麼下面兩者是一樣呢?
  2. mov eax,stWndClass.lpfnWndProc 沒有中括號,
  3. mov eax,[stWndClass.lpfnWndProc] 有中括號,
复制代码


你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-10-29 20:54:26 | 显示全部楼层
问题没仔细看,先看看这篇文章参考下:http://bdxnote.blog.163.com/blog/static/844423520096137403605/
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-29 21:29:44 | 显示全部楼层
本帖最后由 kikiatw 于 2019-10-29 21:30 编辑

我的問題是這樣, 我剛剛把它寫成一個程式
  1. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ;MODE define
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4.         .386p
  5.         .model flat,stdcall
  6.         option casemap:none

  7. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  8. ; Include
  9. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10. include                windows.inc
  11. include                user32.inc
  12. includelib        user32.lib
  13. include                kernel32.inc
  14. includelib        kernel32.lib

  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16. ; Data
  17. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  18.         .data
  19. szCaption        db                'title', 0
  20. stWndClass        WNDCLASS <0,1,2,3,4,5,6,7,8,9>
  21. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  22. ; Code
  23. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  24.         .code
  25. start:
  26.         mov eax,stWndClass.lpfnWndProc                ;(代表把 lpfnWndProc的值給eax)
  27.         mov eax,[stWndClass.lpfnWndProc]        ;??
  28.         mov esi,offset stWndClass.lpfnWndProc        ;(代表把 lpfnWndProc的位址給eax)
  29.         mov eax,[esi+WNDCLASS.lpfnWndProc]        ;(代表 [esi+4] 給eax
  30.         mov eax,[esi+stWndClass.lpfnWndProc]        ;(代表 [esi+stWndClass.lpfnWndProc的位址] 給eax
  31.         invoke ExitProcess,NULL

  32. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  33.         end        start               

复制代码



然後看看下面這張圖, 前兩行是一樣的, 為什麼加了中括號還是一樣的?

Snap2.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-10-29 21:42:17 | 显示全部楼层    本楼为最佳答案   
1.png

事实上就是一样的,编译器就是这样做的,对于单个变量(标识符)也是一样的

  1. 所以為什麼下面兩者是一樣呢?
  2. mov eax,stWndClass.lpfnWndProc 沒有中括號,
  3. mov eax,[stWndClass.lpfnWndProc] 有中括號,
复制代码


你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-29 22:41:40 | 显示全部楼层
本帖最后由 kikiatw 于 2019-10-29 22:43 编辑

如果這在c, 就不一樣了, c應該會找到 stWndClass.lpfwndProc 的值, 上面的例子是1, 然後用這個值當位址
確實好像沒甚麼, 編譯器要這樣編譯, 好像也只能死記不能亂用.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-9 19:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表