kikiatw 发表于 2019-10-29 17:20:58

win32匯編21講 數據結構

本帖最后由 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, (代表 給eax
4. mov eax, (代表 給eax

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

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

发表于 2019-10-29 20:54:26

问题没仔细看,先看看这篇文章参考下:http://bdxnote.blog.163.com/blog/static/844423520096137403605/

kikiatw 发表于 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,        ;??
        mov esi,offset stWndClass.lpfnWndProc        ;(代表把 lpfnWndProc的位址給eax)
        mov eax,        ;(代表 給eax
        mov eax,        ;(代表 給eax
        invoke ExitProcess,NULL

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




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

人造人 发表于 2019-10-29 21:42:17



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

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

你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀

kikiatw 发表于 2019-10-29 22:41:40

本帖最后由 kikiatw 于 2019-10-29 22:43 编辑

如果這在c, 就不一樣了, c應該會找到 stWndClass.lpfwndProc 的值, 上面的例子是1, 然後用這個值當位址
確實好像沒甚麼, 編譯器要這樣編譯, 好像也只能死記不能亂用.
页: [1]
查看完整版本: win32匯編21講 數據結構