Win32ASM学习[19]:结构与联合

本文详细解释了C++中结构(struct)和联合(union)的区别及使用方法,包括嵌套使用、初始化方式和如何通过寄存器引用结构变量。同时,介绍了在实际编程中如何利用SYSTEMTIME结构获取系统时间,以及结构嵌套的应用实例。
 

结构和联合分别用 struct、union 定义, 都是 ends 结束定义.
它们使用方法相同, 并可以互相嵌套; 主要区别是后者的各成员共用同一个地址.
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结构示例:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;定义结构
MyPoint struct
    X dd ?
    Y dd ?
MyPoint ends

.data
    ;声明结构, 使用 <>、{} 均可
    pt1 MyPoint <>
    pt2 MyPoint {}
    pt3 MyPoint <33,44>
    pt4 MyPoint {55,66}
    pt5 MyPoint {77,}
    pt6 MyPoint {,88}
    pt7 MyPoint {,}
.code
main proc
    mov pt1.X, 11
    mov pt1.Y, 22
    inc pt1.X
    PrintDec pt1.X ;12
    PrintDec pt1.Y ;22
    ;
    PrintDec pt2.X ;0
    PrintDec pt2.Y ;0
    ;
    PrintDec pt3.X ;33
    PrintDec pt3.Y ;44
    ;
    PrintDec pt4.X ;55
    PrintDec pt4.Y ;66
    ;
    PrintDec pt5.X ;77
    PrintDec pt5.Y ;0
    ;
    PrintDec pt6.X ;0
    PrintDec pt6.Y ;88
    ;
    PrintDec pt7.X ;0
    PrintDec pt7.Y ;0
    ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

联合示例:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;定义联合
MyUnion union
    D dd ?
    W dw ?
    B db ?
MyUnion ends

.data
    u1 MyUnion <>
    u2 MyUnion {1122h} ;只能有一个初始值
.code
main proc
    mov u1.D, 12345678h
    PrintHex u1.D ;12345678
    PrintHex u1.W ;5678
    PrintHex u1.B ;78
    ;
    PrintHex u2.D ;00001122
    PrintHex u2.W ;1122
    PrintHex u2.B ;22
    ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

用寄存器引用结构变量:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

MyPoint struct
    X dd ?
    Y dd ?
MyPoint ends

.data
    pt1 MyPoint <11,22>
.code
main proc
    lea ebx, pt1
    PrintDec (MyPoint ptr [ebx]).X ;11
    PrintDec (MyPoint ptr [ebx]).Y ;22
    ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

定义时的数据初始化:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

MyStruct struct
    FName db 12 dup(0)
    FAge  db 66
MyStruct ends

.data
    u1 MyStruct <>
    u2 MyStruct <'张三', 88>
.code
main proc
    PrintString u1.FName ;
    PrintDec    u1.FAge  ;66
   
    PrintString u2.FName ;张三
    PrintDec    u2.FAge  ;88
    ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用 SYSTEMTIME 结构获取系统时间的例子:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

;SYSTEMTIME 结构定义在 windows.inc
;GetLocalTime 函数声明在 kernel32.inc
.data
    sysTime SYSTEMTIME <>
.code
main proc
    invoke GetLocalTime, addr sysTime
    PrintDec sysTime.wYear  ;2010
    PrintDec sysTime.wMonth ;4
    PrintDec sysTime.wDay   ;22
    ret
main endp
end main
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

结构嵌套:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

Pt struct
   X dd ?
   Y dd ?
Pt ends

Rect struct
    Left  Pt <>
    Right Pt <>
Rect ends

.data
    r1 Rect <>
    r2 Rect <<55,66>, <77,88>>
.code
main proc
    mov r1.Left.X, 11
    mov r1.Left.Y, 22
    mov r1.Right.X, 33
    mov r1.Right.Y, 44
   
    PrintDec r1.Left.X  ;11
    PrintDec r1.Left.Y  ;22
    PrintDec r1.Right.X ;33
    PrintDec r1.Right.Y ;44
   
    PrintDec r2.Left.X  ;55
    PrintDec r2.Left.Y  ;66
    PrintDec r2.Right.X ;77
    PrintDec r2.Right.Y ;88
    ret
main endp
end main

 

内容概要:本文提出了一种融合模型预测控制(MPC)人工势场法的船舶运动规划方法,旨在解决复杂海上多船遭遇场景下的避碰问题,并严格遵循国际海上避碰规则(COLREG)。该方法通过构建人工势场模型,综合考虑他船、静态障碍物、航道边界产生的排斥力以及目标点的吸引力,形成动态环境势场;同时引入MPC框架,基于船舶非线性动力学模型进行滚动时域优化,实时求解最优航向航速指令,确保路径的安全性、平滑性合规性。研究设计了对遇、交叉、追越及多船混杂等多种典型复杂会遇场景,并通过Matlab仿真验证了该方法在有效规避碰撞、保持航行稳定性以及准确执行COLREG规定避让行为方面的优越性能。; 适合人群:从事智能航运、海洋工程、自动驾驶船舶、智能交通系统及相关路径规划算法研究的科研人员研究生;具备控制理论、优化算法基础及Matlab编程能力的技术开发者。; 使用场景及目标:① 实现复杂动态海况下多船智能避碰决策自主导航;② 开发符合国际航行法规的无人船自主航行核心算法;③ 为智能港口、海上交通管理系统(SMARTS)及无人艇集群协同提供算法支持;④ 用于科研仿真验证、算法对比测试及高校相关课程的教学演示。; 阅读建议:此资源以Matlab代码实现为核心,强调理论建模工程实践的深度融合,建议读者在深入理解MPC人工势场耦合机制的基础上,动手运行并调试所提供的仿真程序,重点分析不同势场参数、预测时域权重系数对避碰行为的影响,从而掌握算法的设计精髓优化策略。
内容概要:本文围绕永磁同步电机(PMSM)在宽速域范围内的无传感器控制技术展开研究,提出了一种基于观测器异构冗余柔性切换的复合控制策略。该策略融合高频信号注入法(适用于零低速区)自适应滑模观测器(SMO,适用于中高速区),通过设计动态加权融合机制实现全速域内转子位置速度的精确估计。系统在静止和低速状态下采用脉振方波高频注入实现初始定位,在中高速运行时则利用模糊超螺旋滑模观测器提升鲁棒性动态响应性能,并引入相位同步校正平滑切换算法以有效抑制模式切换过程中的抖动误差累积。研究在Simulink平台构建了完整的控制系统仿真模型,全面验证了所提方法在启动精度、稳态性能、动态响应及抗负载扰动等方面的优越性。; 适合人群:具备电机控制、现代控制理论及MATLAB/Simulink仿真基础的电气工程、自动化及相关专业的研究生、科研人员和工程技术人员。; 使用场景及目标:①解决永磁同步电机在无机械传感器条件下全速域运行的控制难题;②为高性能电机驱动系统(如电动汽车、精密伺服系统)提供可靠的速度位置估算方案;③深入理解高频注入、滑模观测器、多观测器融合平滑切换等先进控制算法的设计实现。; 阅读建议:此资源以Simulink仿真实现为核心,不仅提供了详细的算法原理模型架构,还包含了完整的运行结果分析。建议读者结合文中框架在MATLAB环境中动手复现仿真模型,重点关注不同速度区间下观测器的切换逻辑参数整定过程,并通过对比实验深入理解各模块的作用机理系统整体性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值