|
发表于 2021-2-10 15:11:06
|
显示全部楼层
回帖奖励 +1 鱼币
结构体作为形参,可以传值,也可以传地址。不建议用传值的方法,如果结构体定义得比较复杂,如代码里的 mySecond,传值麻烦。
- .386
- .MODEL FLAT
- INCLUDE WINDOWS.INC
- INCLUDELIB IMPORT32.LIB
- EXTRN ExitProcess:PROC
- EXTRN MessageBoxA:PROC
- EXTRN LoadLibraryA:PROC
- EXTRN GetProcAddress:PROC
- .Data
- myFirst STRUC
- _v1 DD 0
- _v2 DD 0
- _v3 DD 0
- myFirst ENDS
- mySecond STRUC
- _v4 DD 0
- _v5 DB 100 dup (0)
- mySecond ENDS
- user32 DB "User32.Dll",0
- szMessageBoxA DB "MessageBoxA",0
- ddMessageBoxA DD 0
-
- str1 myFirst <012345678H,01234ABCDH,0FFFFFFFFH>
- .Code
- ;[ebp+16] = myFirst._v3
- ;[ebp+12] = myFirst._v2
- ;[ebp+8] = myFirst._v1
- ;[ebp+4] = return address
- ;[ebp] = old ebp
- ;结构体传值函数
- _PassValue PROC
- PUSH EBP
- MOV EBP,ESP
- PUSH ECX
- PUSH ESI
- PUSHF
-
- ;指针指向结构体第一元素
- MOV ESI,EBP
- ADD ESI,8
- MOV ECX,3
- ;循环显示3个元素的值
- _PV_Show:
- LODSD
- PUSH ddMessageBoxA
- PUSH EAX
- CALL _ShowDWORD
- LOOP _PV_Show
- POPF
- POP ESI
- POP ECX
- MOV ESP,EBP
- POP EBP
- RET 12
- _PassValue ENDP
- ;[ebp+8] = myFirst address
- ;[ebp+4] = return address
- ;[ebp] = old ebp
- ;结构体传址函数
- _PassAddress PROC
- PUSH EBP
- MOV EBP,ESP
- PUSH ECX
- PUSH ESI
- PUSHF
-
- ;指针指向结构体地址
- MOV ESI,DWORD PTR [EBP+8]
- MOV ECX,3
- ;循环显示3个元素的值
- _PA_Show:
- LODSD
- PUSH ddMessageBoxA
- PUSH EAX
- CALL _ShowDWORD
- LOOP _PA_Show
- POPF
- POP ESI
- POP ECX
- MOV ESP,EBP
- POP EBP
- RET 4
- _PassAddress ENDP
- _Start:
- NOP
- NOP
- PUSH OFFSET user32
- CALL LoadLibraryA
- PUSH OFFSET szMessageBoxA
- PUSH EAX
- CALL GetProcAddress
- MOV ddMessageBoxA,EAX
-
- ;传值函数调用,把结构体的每一个元素的值入栈
- PUSH str1._v3
- PUSH str1._v2
- PUSH str1._v1
- CALL _PassValue
- ;调用传址函数,把结构体的地址入栈
- PUSH OFFSET str1
- CALL _PassAddress
-
- PUSH 0
- CALL ExitProcess
- ;***********************************************************
- ; _ShowDWORD PROC stdcall,dd2Show:DWORD,addrOfMBA:DWORD
- ; 功能: 用MessageBox的方式显示一个双字的16进制值
- ; 参数说明:
- ; dd2Show: 要显示的双字
- ; addrOfMBA: API MessageBoxA 的地址
- ; 调用方式:
- ; PUSH addrOfMBA
- ; PUSH dd2Show
- ; CALL _ShowDWORD
- ;***********************************************************
- _ShowDWORD PROC
- PUSH EBP
- MOV EBP,ESP
- SUB ESP,12
- PUSH EAX
- PUSH ECX
- PUSH EDI
- PUSHF
-
- STD
- MOV EDI,EBP
- DEC EDI
-
- MOV AL,0
- STOSB
- MOV AL,'H'
- STOSB
-
- MOV EAX,DWORD PTR [EBP+8]
- MOV ECX,8
- _Hex2Ascii:
- PUSH EAX
- AND AL,0FH
- ADD AL,030H
- CMP AL,039H
- JLE _IsNumber
- ADD AL,7
- _IsNumber:
- STOSB
- POP EAX
- SHR EAX,4
- LOOP _Hex2Ascii
-
- MOV AL,'X'
- STOSB
- MOV AL,'0'
- STOSB
- INC EDI
- CLD
- PUSH 0
- PUSH 0
- PUSH EDI
- PUSH 0
- CALL DWORD PTR [EBP + 12]
-
- POPF
- POP EDI
- POP ECX
- POP EAX
-
- ADD ESP,12
- MOV ESP,EBP
- POP EBP
- RET 8
- _ShowDWORD ENDP
- End _Start
复制代码 |
|