win32汇编环境,结构体的使用示例二

;运行效果

;win32汇编环境,结构体的使用示例二
;举例说明结构体的定义,如何访问其中的成员,使用assume指令指向某个结构体,计算结构数组所需的偏移量得到某个成员值等
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为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   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data 
DlgName    db "MyDialog",0 
szCaption  db "提示",0
szFormat   db "%d",0
szYES      db "Yes",0    

;比如,以下定义3个不同的结构,第2个结构里面嵌套的1个成员是第1个结构体,第3个结构为没有初始化的结构
Aligned_student struct 
   m_A            DWORD    ?                             ;不初始化,DWORD是4字节      
   m_B            BYTE     20    DUP(?)                  ;大小为20字节的字符串数组,即将BYTE重复30次的意思,初始化为0 
   m_C            DWORD    12                       
Aligned_student ends

Bligned_student struct 
   m_Age          DWORD    ?                             ;不初始化,DWORD是4字节  
   m_Name         BYTE     30    DUP(?)                  ;大小为30字节的字符串数组,即将BYTE重复30次的意思,初始化为0  
   m_Score        DWORD    0                             ;整型变量,初始化为0,因为是DWORD型,即4个字节  
   m_Interests    BYTE     "No",0                        ;初始化为 "No\0",N是1个字节,o是1个字节,0是1个字节,共3个字节。如果后面改变它的值,又不止3个字节,则为溢出。一样可以读取,但却成了bug
   m_Add          Aligned_student <>                     ;这个成员是个上面的结构体
Bligned_student ends

Cligned_student struct 
   m_A            DWORD    ?                              
   m_B            BYTE     20    DUP(?)                                     
Cligned_student ends

hData01    Bligned_student          <>                   ;定义1个Bligned_student结构,按其默认值初始化
hData02    Bligned_student    2 dup(<>)                  ;定义2个Bligned_student结构,按其默认值初始化
hData03    Bligned_student          <20,"你好">          ;定义1个自已初始化的Bligned_student结构,第3、4个成员已经初始化,不可再初始化。第5个成员是结构体,也保持默认设置,可以在后面改变它。

hData04      equ    this byte                        ;定义名为hData04的Cligned_student结构数组,并进行初始化。它总共有3个数组成员,每个数组成员都是Cligned_student结构。这种情况与要使用许多头文件里面的结构的操作方法很类似,比如图像列表结构,工具栏中按钮列表结构
Cligned_student    <0,"123">
Cligned_student    <1,"456">
Cligned_student    <2,"789">

.data? 
hInstance HINSTANCE             ? 

.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义

ICO_MAIN   equ 1000    ;图标标识符
IDB        equ 10      ;按钮控件标识符
IDB01      equ 11 
IDB02      equ 12  
IDB03      equ 13  
IDB04      equ 14 
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.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 @szBuffer[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  wsprintf,addr @szBuffer,addr szFormat,sizeof Bligned_student       ;Bligned_student结构,里面4个成员,分别是4字节、30字节、4字节、3字节,加起来就是41字节,里面还包含Aligned_student结构,而Aligned_student有28字节,则总共69字节
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK  
                .elseif ax == IDB02                                                                ;读取hData02结构变量中嵌入结构内的第3个值,即默认的12。这里定义的是2个重复的Bligned_student结构,现在读取的是第1个Bligned_student结构的第3个值。
                        mov ebx,offset hData02
                        assume  ebx:ptr Bligned_student
                        mov eax,[ebx].m_Add.m_C
                        invoke  wsprintf,addr @szBuffer,addr szFormat,eax 
                        invoke  MessageBox,NULL,addr @szBuffer,addr szCaption,MB_OK 
                        assume  ebx:nothing
                .elseif ax == IDB03                                                                ;显示hData02结构变量的第2个成员 
                        invoke  MessageBox,NULL,addr hData03.m_Name,addr szCaption,MB_OK                     
                .elseif ax == IDB04                                                                ;开始读取hData04结构变量的第3个数组内的第2个值,即读取到“789”.这里要计算“789”所在的偏移量
                        mov ecx,sizeof Cligned_student                                             ;得到Cligned_student结构的字节数
                        mov eax,2                                                                  ;乘以2,因为要读取的值在第3个数组内,所以要把指针向后推2个Cligned_student结构字节量
                        mul ecx                                                                   
                        add eax,offset hData04                                                     ;加上hData04的地址值,就是第3个数组的地址值。结果地址值在eax里面
                        assume  eax:ptr Cligned_student                                            ;用assume把eax绑定到Cligned_student结构定义。
                        invoke  MessageBox,NULL,addr [eax].m_B,addr szCaption,MB_OK                ;这里就可以引用到第3个数组的第2个成员的值了
                        assume  eax:nothing                                                        ;走时用assume把eax解绑                        
                .endif                               
        .elseif uMsg == WM_CLOSE                 
                        invoke EndDialog, hWnd,NULL         
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define    ICO_MAIN    1000    //图标  
#define    IDB01       11         
#define    IDB02       12
#define    IDB03       13
#define    IDB04       14
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//定义对话框
MyDialog DIALOG 10, 10, 140, 100 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 11, "宋体"
BEGIN
     PUSHBUTTON      "查看结构有多少字节", IDB01,  10,10,120,14 
     PUSHBUTTON      "显示嵌套结构中的成员值", IDB02,  10,30,120,14 
     PUSHBUTTON      "显示结构的第2个成员", IDB03,  10,50,120,14 
     PUSHBUTTON      "显示结构数组成员内的值", IDB04,  10,70,120,14 
END 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 设计模式 - 访问者模式

一&#xff1a;概述 访问者模式将作用于对象层次结构的操作封装为一个对象&#xff0c;并使其能够在不修改对象层次结构的情况下定义新的操作。 《设计模式&#xff1a;可复用面向对象软件的基础》一书中的访问者模式因两个原因而具有传奇色彩&#xff1a;一是因为它的复杂性&a…

deepseek本地部署-linux

1、官网推荐安装方法&#xff08;使用脚本&#xff0c;我绕不过github&#xff0c;未采用&#xff09; 登录ollama下载网站https://ollama.com/download/linux&#xff0c;linux下有下载脚本。 正常来说&#xff0c;在OS系统下直接执行脚本即可。 2、手动安装方法 2.1获取ol…

Spring Boot Actuator(官网文档解读)

定义 Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的模块。它能够提供各种生产级别的功能&#xff0c;如健康检查、度量指标收集、配置属性查看等&#xff0c;帮助开发者了解应用的内部状态并进行故障排查。 Actuator 引入 要启用 Actuator…

保姆级教程Docker部署Zookeeper模式的Kafka镜像

目录 一、安装Docker及可视化工具 二、Docker部署Zookeeper 三、单节点部署 1、创建挂载目录 2、命令运行容器 3、Compose运行容器 4、查看运行状态 5、验证功能 四、部署可视化工具 1、创建挂载目录 2、Compose运行容器 3、查看运行状态 一、安装Docker及可视化工…

【力扣】279.完全平方数

AC截图 题目 思路 总结动态规划方程得出的思路 找到最小子问题&#xff0c;涉及到当前数和上一个数的跨度&#xff0c;以及上一个数的结果如何变成当前数的结果这两个点。 1&#xff0c;当前数n和上一个数的跨度&#xff1a; 假设n12&#xff0c; 上一个数可以是11&#xff0c…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…

使用Redis解决使用Session登录带来的共享问题

在学习项目的过程中遇到了使用Session实现登录功能所带来的共享问题&#xff0c;此问题可以使用Redis来解决&#xff0c;也即是加上一层来解决问题。 接下来介绍一些Session的相关内容并且采用Session实现登录功能&#xff08;并附上代码&#xff09;&#xff0c;进行分析其存在…

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库&#xff08;如 sklearn、pan…

深度学习系列--04.梯度下降以及其他优化器

目录 一.梯度概念 1.一元函数 2.二元函数 3.几何意义上的区别 二.梯度下降 1.原理 2.步骤 3.示例代码&#xff08;Python&#xff09; 4.不同类型的梯度下降 5.优缺点 三.动量优化器&#xff08;Momentum&#xff09; 适用场景 1.复杂地形的优化问题 2.数据具有噪声的问…

π0开源了且推出自回归版π0-FAST——打造机器人动作专用的高效Tokenizer:比扩散π0的训练速度快5倍但效果相当

前言 过去的半个多月 对于大模型 deepseek火爆全球&#xff0c;我对其的解读也写成了整整一个系列 详见《火爆全球的DeepSeek系列模型》&#xff0c;涉及对GRPO、MLA、V3、R1的详尽细致深入的解读 某种意义来讲&#xff0c;deepseek 相当于把大模型的热度 又直接拉起来了——…

导航守卫router.beforeEach

router.beforeEach 是一个全局前置守卫&#xff0c;在每次路由跳转之前都会触发。 //index.jsrouter.beforeEach((to, from, next) > {// 打印即将要进入的目标路由信息console.log(即将要进入的目标路由信息:, to)// 打印当前正要离开的路由信息console.log(当前正要离开的…

[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别

前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中&#xff0c;第三方库的使用是基于项目&#xff08;工程&#xff09;的。具体而言&#xff0c;只有当你为一个特定的项目添加了某个第三方库后&#xff0c;该项目才能使用该库。这些第三方库的文…

了解AI绘图,Stable Diffusion的使用

AI绘图对GPU算力要求较高。 个人电脑配置可参考&#xff1a; CPU&#xff1a;14600kf 盒装 显卡&#xff1a;RTX 4080金属大师 OC&#xff0c;16G显存 主板&#xff1a;z790吹雪d4 内存&#xff1a;芝奇皇家戟4000c18,162G 硬盘&#xff1a;宏基gm7000 1T 散热&#xff1a;追风…

linux环境自动化golang项目启动脚本解析

一.场景介绍 当在本地创建了golang项目,修改了代码功能,怎么在远程测试服务器上更新该功能呢,可以使用下面的步骤来解决该问题(这只是其中一种方法): (1).推送最新代码到远程仓库 (2).在测试服务器上创建该项目并拉取最新代码 (3).创建deploy.sh脚本 (4).运行deploy.sh脚本 二.…

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域&#xff0c;归一化&#xff08;Normalization&#xff09;和伪彩&#xff08;Pseudo-coloring&#xff09;是两个不同的概念&#xff0c;虽然它们都涉及图像像素值的调整&#xff0c;但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…

基于DeepSeek API和VSCode的自动化网页生成流程

1.创建API key 访问官网DeepSeek &#xff0c;点击API开放平台。 在开放平台界面左侧点击API keys&#xff0c;进入API keys管理界面&#xff0c;点击创建API key按钮创建API key&#xff0c;名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D&#xff0c;鼠鼠我是一个代码小白&#xff0c;下文是学习开源项目Open WebUI过程中的一点笔记记录&#xff0c;希望能帮助到你&#xff5e; 本人菜鸟&#xff0c;持续成长&#xff0c;能力不足有疏漏的地方欢迎一起探讨指正&#xff0c;比心心&#xff5e…

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码&#xff1a;2.保存物品信息代码&#xff1a;3.删除仓库信息代码&#xff1a; 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SSM框架开发的仓库…

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展&#xff0c;详细解释了如何利用Python进行微博爬虫&#xff0c;爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了&#xff0c;就是用户利用代码模拟Ajax请求&#xff0c;发…

时序数据库:Influxdb详解

文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置&#xff08;1&#xff09;用户初始化 三、入门&#xff08;Web UI&#xff09;1、加载数据&#xff08;1&#xff09;上传数据文件&#xff08;2&#xff09;代码接入模板 2、管理存储桶&#xff08;1&#xff09;创建…