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, 有中括號,
问题没仔细看,先看看这篇文章参考下:http://bdxnote.blog.163.com/blog/static/844423520096137403605/ 本帖最后由 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
然後看看下面這張圖, 前兩行是一樣的, 為什麼加了中括號還是一樣的?
事实上就是一样的,编译器就是这样做的,对于单个变量(标识符)也是一样的
所以為什麼下面兩者是一樣呢?
mov eax,stWndClass.lpfnWndProc 沒有中括號,
mov eax, 有中括號,
你能告诉我C语言中的 i += 1 和 i = i + 1为什么两者是一样的吗?
对呀,好像没有为什么,编译器就支持这种写法呀
本帖最后由 kikiatw 于 2019-10-29 22:43 编辑
如果這在c, 就不一樣了, c應該會找到 stWndClass.lpfwndProc 的值, 上面的例子是1, 然後用這個值當位址
確實好像沒甚麼, 編譯器要這樣編譯, 好像也只能死記不能亂用.
页:
[1]