win32汇编形参问题
在win32汇编中,如何设置形参类型是结构体类型的,求大神指教难道要自己坐沙发吗? 为什么没人回答,就是回答我一声你去百度也是好的呀 支持下楼主,顺便拿币,,,记得老罗的书说过,WIN32汇编,大部分的参数都可以看作是一种类型
那就是dword 以前学过VB的基础,模糊记得形参 实参是什么,不过现在分不清了,因为没细学下去
楼主是想传递一个结构给子程序吗?我理解的WIN32汇编传递的参数只分为传地址或传数值。。把这个结构的地址传给子程序啊。不过同进程子程序直接存取就行了啊。。难道楼主是想在子程序里面定义结构吗?
LOCAL @WCSS:WNDCLASS 这个吗?定义一个名为@WCSS的WNDCLASS数据结构
没中币啊,再试试。。。 {:9_225:} 虽然我看不懂~~~~但是也支持楼主一下 顺便领个鱼币,奖励自己一下{:5_107:} {:5_100:}天哪,为啥我不让我奖励自己 顶一下 支持 结构体作为形参,可以传值,也可以传地址。不建议用传值的方法,如果结构体定义得比较复杂,如代码里的 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
; = myFirst._v3
; = myFirst._v2
; = myFirst._v1
; = return address
; = 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
; = myFirst address
; = return address
; = old ebp
;结构体传址函数
_PassAddress PROC
PUSH EBP
MOV EBP,ESP
PUSH ECX
PUSH ESI
PUSHF
;指针指向结构体地址
MOV ESI,DWORD PTR
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
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
POPF
POP EDI
POP ECX
POP EAX
ADD ESP,12
MOV ESP,EBP
POP EBP
RET 8
_ShowDWORD ENDP
End _Start 看看 {:10_279:} 支持 {:10_279:}
页:
[1]