鱼C论坛

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

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

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

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

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

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

關於數據結構取址, 取值的問題, 小甲魚講解我感到很困惑
假如一個結構體的定義是這樣
WNDCLASS STRUCT
  style             DWORD      ?
  lpfnWndProc       DWORD      ?
  cbClsExtra        DWORD      ?
  cbWndExtra        DWORD      ?
  hInstance         DWORD      ?
  hIcon             DWORD      ?
  hCursor           DWORD      ?
  hbrBackground     DWORD      ?
  lpszMenuName      DWORD      ?
  lpszClassName     DWORD      ?
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

事实上就是一样的,编译器就是这样做的,对于单个变量(标识符)也是一样的
所以為什麼下面兩者是一樣呢?
mov eax,stWndClass.lpfnWndProc 沒有中括號, 
mov eax,[stWndClass.lpfnWndProc] 有中括號,

你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-10-29 20:54:26 | 显示全部楼层
问题没仔细看,先看看这篇文章参考下:http://bdxnote.blog.163.com/blog/static/844423520096137403605/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include                windows.inc
include                user32.inc
includelib        user32.lib
include                kernel32.inc
includelib        kernel32.lib

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Data
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .data
szCaption        db                'title', 0
stWndClass        WNDCLASS <0,1,2,3,4,5,6,7,8,9>
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        mov eax,stWndClass.lpfnWndProc                ;(代表把 lpfnWndProc的值給eax)
        mov eax,[stWndClass.lpfnWndProc]        ;??
        mov esi,offset stWndClass.lpfnWndProc        ;(代表把 lpfnWndProc的位址給eax)
        mov eax,[esi+WNDCLASS.lpfnWndProc]        ;(代表 [esi+4] 給eax
        mov eax,[esi+stWndClass.lpfnWndProc]        ;(代表 [esi+stWndClass.lpfnWndProc的位址] 給eax
        invoke ExitProcess,NULL

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end        start                


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

Snap2.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

事实上就是一样的,编译器就是这样做的,对于单个变量(标识符)也是一样的
所以為什麼下面兩者是一樣呢?
mov eax,stWndClass.lpfnWndProc 沒有中括號, 
mov eax,[stWndClass.lpfnWndProc] 有中括號,

你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 03:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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