清风微雨 发表于 2013-7-25 15:06:31

win32汇编形参问题

在win32汇编中,如何设置形参类型是结构体类型的,求大神指教

清风微雨 发表于 2013-7-25 17:05:11

难道要自己坐沙发吗?

清风微雨 发表于 2013-7-27 13:04:33

为什么没人回答,就是回答我一声你去百度也是好的呀

dAb 发表于 2013-7-29 00:15:53

支持下楼主,顺便拿币,,,记得老罗的书说过,WIN32汇编,大部分的参数都可以看作是一种类型
那就是dword    以前学过VB的基础,模糊记得形参 实参是什么,不过现在分不清了,因为没细学下去
楼主是想传递一个结构给子程序吗?我理解的WIN32汇编传递的参数只分为传地址或传数值。。把这个结构的地址传给子程序啊。不过同进程子程序直接存取就行了啊。。难道楼主是想在子程序里面定义结构吗?
LOCAL   @WCSS:WNDCLASS   这个吗?定义一个名为@WCSS的WNDCLASS数据结构

dAb 发表于 2013-7-29 00:18:05

没中币啊,再试试。。。

whdd 发表于 2018-9-30 13:48:51

{:9_225:}

学学看看 发表于 2018-11-30 14:09:01

majian890324 发表于 2020-5-2 12:38:32

虽然我看不懂~~~~但是也支持楼主一下

majian890324 发表于 2020-5-2 12:39:14

顺便领个鱼币,奖励自己一下{:5_107:}

majian890324 发表于 2020-5-2 12:39:53

{:5_100:}天哪,为啥我不让我奖励自己

心驰神往 发表于 2020-10-30 15:21:35

顶一下

kkl44stupid 发表于 2021-2-10 13:12:19

支持

xieglt 发表于 2021-2-10 15:11:06

结构体作为形参,可以传值,也可以传地址。不建议用传值的方法,如果结构体定义得比较复杂,如代码里的 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

ridiculum 发表于 2021-6-16 17:37:04

看看

超级玛尼哄 发表于 2021-6-24 18:19:36

{:10_279:}

sunwenwu 发表于 2021-7-9 10:23:15

支持

sunwenwu123 发表于 2021-7-9 10:31:58

{:10_279:}
页: [1]
查看完整版本: win32汇编形参问题