鱼C论坛

 找回密码
 立即注册
查看: 6291|回复: 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,传值麻烦。

  1. .386
  2. .MODEL FLAT

  3. INCLUDE WINDOWS.INC
  4. INCLUDELIB IMPORT32.LIB

  5. EXTRN        ExitProcess:PROC
  6. EXTRN        MessageBoxA:PROC
  7. EXTRN        LoadLibraryA:PROC
  8. EXTRN        GetProcAddress:PROC

  9. .Data
  10.         myFirst        STRUC
  11.                 _v1 DD 0
  12.                 _v2        DD 0
  13.                 _v3 DD 0
  14.         myFirst        ENDS

  15.         mySecond STRUC
  16.                 _v4        DD 0
  17.                 _v5        DB 100 dup (0)
  18.         mySecond ENDS

  19.         user32                        DB        "User32.Dll",0
  20.         szMessageBoxA        DB        "MessageBoxA",0
  21.         ddMessageBoxA        DD        0
  22.        
  23.         str1        myFirst <012345678H,01234ABCDH,0FFFFFFFFH>

  24. .Code

  25. ;[ebp+16] = myFirst._v3
  26. ;[ebp+12] = myFirst._v2
  27. ;[ebp+8] = myFirst._v1
  28. ;[ebp+4] = return address
  29. ;[ebp] = old ebp
  30. ;结构体传值函数
  31. _PassValue        PROC
  32.         PUSH        EBP
  33.         MOV                EBP,ESP
  34.         PUSH        ECX
  35.         PUSH        ESI
  36.         PUSHF
  37.        
  38.         ;指针指向结构体第一元素
  39.         MOV                ESI,EBP
  40.         ADD                ESI,8

  41.         MOV                ECX,3
  42.         ;循环显示3个元素的值
  43. _PV_Show:
  44.         LODSD
  45.         PUSH        ddMessageBoxA
  46.         PUSH        EAX
  47.         CALL        _ShowDWORD
  48.         LOOP        _PV_Show

  49.         POPF
  50.         POP                ESI
  51.         POP                ECX
  52.         MOV                ESP,EBP
  53.         POP                EBP
  54.         RET                12
  55. _PassValue        ENDP

  56. ;[ebp+8] = myFirst address
  57. ;[ebp+4] = return address
  58. ;[ebp] = old ebp
  59. ;结构体传址函数
  60. _PassAddress PROC
  61.         PUSH        EBP
  62.         MOV                EBP,ESP
  63.         PUSH        ECX
  64.         PUSH        ESI
  65.         PUSHF
  66.        
  67.         ;指针指向结构体地址
  68.         MOV                ESI,DWORD PTR [EBP+8]
  69.         MOV                ECX,3

  70.         ;循环显示3个元素的值
  71. _PA_Show:
  72.         LODSD
  73.         PUSH        ddMessageBoxA
  74.         PUSH        EAX
  75.         CALL        _ShowDWORD
  76.         LOOP        _PA_Show

  77.         POPF
  78.         POP                ESI
  79.         POP                ECX
  80.         MOV                ESP,EBP
  81.         POP                EBP
  82.         RET                4
  83. _PassAddress ENDP

  84. _Start:
  85.         NOP
  86.         NOP

  87.         PUSH        OFFSET user32
  88.         CALL        LoadLibraryA

  89.         PUSH        OFFSET szMessageBoxA
  90.         PUSH        EAX
  91.         CALL        GetProcAddress

  92.         MOV                ddMessageBoxA,EAX
  93.        
  94.         ;传值函数调用,把结构体的每一个元素的值入栈
  95.         PUSH        str1._v3
  96.         PUSH        str1._v2
  97.         PUSH        str1._v1
  98.         CALL        _PassValue

  99.        ;调用传址函数,把结构体的地址入栈
  100.         PUSH        OFFSET str1
  101.         CALL        _PassAddress
  102.        
  103.         PUSH        0
  104.         CALL        ExitProcess

  105. ;***********************************************************
  106. ;        _ShowDWORD PROC stdcall,dd2Show:DWORD,addrOfMBA:DWORD
  107. ;        功能:                用MessageBox的方式显示一个双字的16进制值
  108. ;        参数说明:
  109. ;                                dd2Show:        要显示的双字
  110. ;                                addrOfMBA:        API MessageBoxA 的地址
  111. ;        调用方式:       
  112. ;                                PUSH        addrOfMBA
  113. ;                                PUSH        dd2Show
  114. ;                                CALL        _ShowDWORD
  115. ;***********************************************************
  116. _ShowDWORD        PROC
  117.         PUSH        EBP
  118.         MOV                EBP,ESP

  119.         SUB                ESP,12

  120.         PUSH        EAX
  121.         PUSH        ECX
  122.         PUSH        EDI
  123.         PUSHF
  124.        
  125.         STD

  126.         MOV                EDI,EBP
  127.         DEC                EDI
  128.        
  129.         MOV                AL,0
  130.         STOSB
  131.         MOV                AL,'H'
  132.         STOSB
  133.        
  134.         MOV                EAX,DWORD PTR [EBP+8]
  135.         MOV                ECX,8

  136. _Hex2Ascii:
  137.         PUSH        EAX
  138.         AND                AL,0FH
  139.         ADD                AL,030H
  140.         CMP                AL,039H
  141.         JLE                _IsNumber
  142.         ADD                AL,7
  143. _IsNumber:
  144.         STOSB
  145.         POP                EAX
  146.         SHR                EAX,4
  147.         LOOP        _Hex2Ascii
  148.        

  149.         MOV                AL,'X'
  150.         STOSB
  151.         MOV                AL,'0'
  152.         STOSB

  153.         INC                EDI
  154.         CLD

  155.         PUSH        0
  156.         PUSH        0
  157.         PUSH        EDI
  158.         PUSH        0
  159.         CALL        DWORD PTR [EBP + 12]
  160.        
  161.         POPF
  162.         POP                EDI
  163.         POP                ECX
  164.         POP                EAX
  165.        
  166.         ADD                ESP,12
  167.         MOV                ESP,EBP
  168.         POP                EBP
  169.         RET                8
  170. _ShowDWORD        ENDP

  171. 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-4-27 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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