鱼C论坛

 找回密码
 立即注册
查看: 7093|回复: 16

win32汇编形参问题

[复制链接]
发表于 2013-7-25 15:06:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在win32汇编中,如何设置形参类型是结构体类型的,求大神指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-7-25 17:05:11 | 显示全部楼层
难道要自己坐沙发吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-27 13:04:33 | 显示全部楼层
为什么没人回答,就是回答我一声你去百度也是好的呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-29 00:15:53 | 显示全部楼层
支持下楼主,顺便拿币,,,记得老罗的书说过,WIN32汇编,大部分的参数都可以看作是一种类型
那就是dword    以前学过VB的基础,模糊记得形参 实参是什么,不过现在分不清了,因为没细学下去
楼主是想传递一个结构给子程序吗?我理解的WIN32汇编传递的参数只分为  传地址或传数值。。把这个结构的地址传给子程序啊。不过同进程子程序直接存取就行了啊。。难道楼主是想在子程序里面定义结构吗?
LOCAL   @WCSS:WNDCLASS   这个吗?定义一个名为@WCSS的WNDCLASS数据结构
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-29 00:18:05 | 显示全部楼层
没中币啊,再试试。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-30 13:48:51 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2018-11-30 14:09:01 | 显示全部楼层

回帖奖励 +1 鱼币

提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-2 12:38:32 | 显示全部楼层
虽然我看不懂~~~~但是也支持楼主一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 12:39:14 | 显示全部楼层
顺便领个鱼币,奖励自己一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-2 12:39:53 | 显示全部楼层

回帖奖励 +1 鱼币

天哪,为啥我不让我奖励自己
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-30 15:21:35 | 显示全部楼层

回帖奖励 +1 鱼币

顶一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-10 13:12:19 | 显示全部楼层

回帖奖励 +1 鱼币

支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-16 17:37:04 | 显示全部楼层

回帖奖励 +1 鱼币

看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-24 18:19:36 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-9 10:23:15 | 显示全部楼层
支持
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-7-9 10:31:58 | 显示全部楼层

回帖奖励 +1 鱼币

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 10:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表