win32汇编环境,函数的编写与调用、传值或返回值等

news2025/1/26 14:11:14

;运行效果

;win32汇编环境,函数的编写与调用、传值或返回值等
;函数在被调用的时候,如果此函数实体在前面,可以不用声明。如果实体在后面,则需要先声明。类似于下面的DlgProc函数,因为它的实体在后面,所以需要在调用之前声明。
;看这一段  DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;DlgProc是函数名称,proto是说明此函数是私有的,就是本程序可以调用。反之则是public,即是公共类型的,可以让其它外面的程序调用,这个一般写在dll文件里面。
;:DWORD则说明这个参数的类型,即为四字节,32位的值。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
; 自定义函数声明
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数声明
AProc   proto                               ;无参数函数声明
BProc   proto :DWORD,:DWORD                 ;有参数函数声明
CProc   proto :DWORD                        ;有参数函数,且参数为指针的声明,看起来体现不出指针的意思,和上面差不多。在汇编的眼中,其实没有什么指针的概念,都是数值,要么是8位的,要么是16位或32位的,就是一串二进制的值。它代表的是什么,由你来决定。
; 数据段;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data 
DlgName      db "MyDialog",0
szCaption    db "提示",0 
szFormat01   db "得到的数值是 %d",0
szText01     db "ABCDE",0 
.data? 
hInstance HINSTANCE             ? 
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
ICO_MAIN   equ 1000      ;图标
IDB01      equ 11        ;按钮控件标识符 
IDB02      equ 12  
IDB03      equ 13    
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start:     
        invoke GetModuleHandle, NULL     
        mov    hInstance,eax     
        invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL     
        invoke ExitProcess,eax 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        LOCAL   @szBuffer01[256]:byte 
        LOCAL   @szBuffer02[256]:byte 
       
        .if     uMsg == WM_INITDIALOG                 
                        invoke    LoadIcon,hInstance,ICO_MAIN            
                        invoke    SendMessage,hWnd,WM_SETICON,ICON_BIG,eax  
        .elseif uMsg == WM_COMMAND                                                  
                mov eax,wParam                                        
                .if     eax == IDB01
                        invoke AProc                                     ;调用无参函数AProc
                        inc eax
                        invoke  wsprintf,addr @szBuffer01,addr szFormat01 ,eax
                        invoke  MessageBox,hWnd,addr @szBuffer01,addr szCaption,MB_OK
                .elseif eax == IDB02
                        invoke BProc,1,2                                 ;调用有参函数BProc并给参数赋值 
                        inc eax                                          ;eax加1.因为返回值是3,再加1,则结果为4
                        invoke  wsprintf,addr @szBuffer01,addr szFormat01 ,eax
                        invoke  MessageBox,hWnd,addr @szBuffer01,addr szCaption,MB_OK
                .elseif eax == IDB03
                        invoke lstrcpy,addr @szBuffer02,addr szText01    ;这里是多此一举,本来可以直接定义一个全局字符数组,就不用在函数里面要地址传进去又传出来。这里这样做,是为了说明这种逻辑,理解这种意思
                        invoke CProc,addr @szBuffer02                    ;调用函数,把地址值,或者说指针当参数传进去,其返回值也是地址值
                        invoke  MessageBox,hWnd,eax,addr szCaption,MB_OK                
                .endif            
        .elseif uMsg == WM_CLOSE                 
                        invoke EndDialog, hWnd,NULL         
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

AProc   proc                        ;无参数函数实体,因为前面进行了声明,所以可以放调用的后面  
        mov eax,1                   ;返回值放eax里面。这是默认的,因为很多的时候,在调用此函数时,可能还调用了其它系统内的函数。如果返回值放其它寄存器,会导致混乱,其它的寄存器不一定是空值,可能在使用中。
        ret 
AProc   endp 

BProc   proc A:DWORD,B:DWORD           
        mov eax,A
        mov ebx,B
        add eax,ebx                 ;A是1,B是2,加了后值在eax里,而eax是返回值
        ret 
BProc   endp 

CProc   proc A:DWORD
    mov esi,A                  ;让esi指向A地址的内容
    mov al,byte ptr [esi+1]    ;把第2个字符复制过来再覆盖第1个字符
    mov byte ptr [esi],al
    mov eax,esi                ;把地址给eax,成为返回值      
        ret 
CProc   endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载
#define    ICO_MAIN    1000    //图标  
#define    IDB01       11         
#define    IDB02       12
#define    IDB03       13

ICO_MAIN    ICON        "Main.ico"

//定义对话框
MyDialog DIALOG 10, 10, 120, 100 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 

CAPTION "对话框程序模版"
 BEGIN
     PUSHBUTTON      "调用无参函数AProc", IDB01,  10,20,100,14           
     PUSHBUTTON      "调用有参函数BProc", IDB02,  10,40,100,12           
     PUSHBUTTON      "调用带指针参数的函数BProc", IDB03,  10,60,100,14           
END 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

填坑 kali 虚拟机磁盘耗尽

今天准备SSH暴力破解,打开kali 虚拟机的时候,发现一直卡在一个地方不动,一开始的时候,我并不知道是磁盘满了,只是跟着网上的解决方案去实施操作,也是通过recovery mode,然后一通操作拿到shell&a…

智能手机“混战”2025:谁将倒下而谁又将突围?

【潮汐商业评论原创】 “去年做手机比较艰难,几乎每个品牌都在调价、压货,像华为这种以前都不给我们分货的厂商,也开始成为我的主要库存。不过今年开头比较好,20号国补一开始,店里的人流和手机销量就明显涨了不少&…

MongoDB文档查询

一、实验目的 1. 理解MongoDB文档数据库的基本概念和特性。 2. 掌握在MongoDB中创建集合和插入文档数据的方法。 3. 学习使用MongoDB进行文档查询操作,包括查询、过滤和排序等。 二、实验环境准备 1. JAVA环境准备:确保Java Development Kit (J…

【Python・机器学习】多元回归模型(原理及代码)

前言 自学笔记,分享给语言学/语言教育学方向的,但对语言数据处理感兴趣但是尚未入门,却需要在论文中用到的小伙伴,欢迎大佬们补充或绕道。ps:本文最少限度涉及公式讲解(文科生小白友好体质)&am…

Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭

文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注:vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…

Adobe的AI生成3D数字人框架:从自拍到生动的3D化身

一、引言 随着人工智能技术的发展,我们见证了越来越多创新工具的出现,这些工具使得图像处理和视频编辑变得更加智能与高效。Adobe作为全球领先的创意软件公司,最近推出了一项令人瞩目的新技术——一个能够将普通的二维自拍照转换成栩栩如生的三维(3D)数字人的框架。这项技…

2025.1.20——四、[强网杯 2019]Upload1 文件上传|反序列化

题目来源:buuctf [强网杯 2019]Upload 1 目录 一、打开靶机,查看信息 二、解题思路 step 1:登陆进去看情况 step 2:大佬来支援——问题在cookie step 3:测试两个思路 1.目录穿越 2.目录扫描 step 4&#xff…

Docker—搭建Harbor和阿里云私有仓库

Harbor概述 Harbor是一个开源的企业级Docker Registry管理项目,由VMware公司开发。‌它的主要用途是帮助用户迅速搭建一个企业级的Docker Registry服务,提供比Docker官方公共镜像仓库更为丰富和安全的功能,特别适合企业环境使用。‌12 Harb…

组播IGMP协议报文介绍

1 IGMP协议 1.1 定义 IGMP(Internet Group Management Protocol)是因特网协议家族中的一个组播协议,它共有三个版本:v1、v2和v3。 IGMPv1中定义了基本的组成员查询和报告过程,IGMPv2在此基础上添加了查询器选举和组…

hedfs和hive数据迁移后校验脚本

先谈论校验方法,本人腾讯云大数据工程师。 1、hdfs的校验 这个通常就是distcp校验,hdfs通过distcp迁移到另一个集群,怎么校验你的对不对。 有人会说,默认会有校验CRC校验。我们关闭了,为什么关闭?全量迁…

性能优化之动态加载

在过去近三十年的职业生涯里,有几年专注于运行时环境的开发与实现。在runtime中,动态加载技术是其中的基石之一。动态加载技术是指在系统运行过程中,根据需要把程序和数据从外存或网络加载到内存中的过程。其中,lazy loading&…

数据从前端传到后端入库过程分析

数据从前端传到后端入库过程分析 概述 积累了一些项目经验,成长为一个老程序员了,自认为对各种业务和技术都能得心应手的应对了,殊不知很多时候我们借助了搜索引擎的能力,当然现在大家都是通过AI来武装自己。 今天要分析的话题是…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法,特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵,然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤: [精确算法] 列主元高斯消元法 步骤 1&am…

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发,结合硬件如太赫兹源、平移台、锁相放大器等,实现了高效、精准的成像功能。系统采用蛇形扫描方式,通过动态调整扫描参数,达到优化成像质量的目的。 ​ 项目背景 在非…

Quartus:开发使用及 Tips 总结

Quartus是Altera(现已被Intel收购)推出的一款针对其FPGA产品的综合性开发环境,用于设计、仿真和调试数字电路。以下是使用Quartus的一些总结和技巧(Tips),帮助更高效地进行FPGA项目开发: 这里写目录标题 使用总结TIPS…

Android 自定义View时四个构造函数使用详解

该文章我们以自定义View继承TextView为例来讲解 创建自定义View命名MyTextView,并使其继承TextView 1、自定义View时第一个构造函数 // 第一个构造函数主要是在Java代码中声明一个MyTextView时所用 // 类似这种(MyTextView myTextViewnew MyTextView(this);) // 不…

C#PaddleOCRSharp使用

using PaddleOCRSharp;namespace PaddleOCRSharpDemo {internal class Program{static void Main(string[] args){//中英文模型V3模型OCRModelConfig config null;//OCR参数OCRParameter oCRParameter new OCRParameter();oCRParameter.cpu_math_library_num_threads 6;//预…

vscode配置C/C++环境(详细步骤教程)

本章教程,主要介绍如何在vscode中配置c/c++环境的具体步骤。 一、安装mingw64 链接:https://pan.baidu.com/s/1fwS-CwC7dgIYJTanaINOhA?pwd=rdks 提取码:rdks 下载之后,配置将mingw64添加到系统环境变量中。 二、安装vscode插件 需要在vscode插件商店,安装c/c++插件 三、配…

隐私保护+性能优化,RyTuneX 让你的电脑更快更安全

RyTuneX 是一款专为 Windows 10 和 11 用户量身打造的系统优化工具,采用先进的 WinUI 3 框架开发,以其现代化的设计风格和强大的功能集合脱颖而出。这款工具不仅界面简洁美观,还提供了多样化的系统优化选项,旨在帮助用户最大化设备…

JAVA:Spring WebClient 的应用指南

1、简述 随着微服务架构的普及,服务间的 HTTP 通信需求也越来越多。Spring 提供的 WebClient 是 RestTemplate 的替代方案,支持响应式编程,具有非阻塞的特点,非常适合处理高并发的 HTTP 请求。本文将介绍 WebClient 的基本用法及…