`
zzc1684
  • 浏览: 1224471 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 Win32 汇编[31] - 结构与联合

 
阅读更多

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



结构示例:


; Test31_1.asm
.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


联合示例:


; Test31_2.asm
.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


用寄存器引用结构变量:


; Test31_3.asm
.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


定义时的数据初始化:


; Test31_4.asm
.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 结构获取系统时间的例子:


; Test31_5.asm
.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


结构嵌套:


; Test31_6.asm
.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
分享到:
评论

相关推荐

    用MasmPlus 学习Win32 汇编

    《用MasmPlus 学习Win32汇编》 在计算机科学的世界里,汇编语言作为底层编程的一种,扮演着至关重要的角色。MasmPlus是Microsoft Macro Assembler的一个增强版本,专门用于编写Windows 32位平台上的汇编程序。通过...

    Win32-ASM.zip_Asm_win-asm

    Win32汇编语言(ASM)是编程领域中一种低级语言,它允许程序员直接对计算机硬件进行控制。Win32-ASM.zip_Asm_win-asm这个资源包显然是针对Win32汇编语言编程的一个详细教程,对于想要深入理解计算机工作原理、优化...

    Intel汇编语言程序设计 第四版

    从用纯汇编编写程序到用VC++,BC++等最新编译器与汇编的混合接口编程;从16位实模式下BIOS,DOS实模式文本及图形程序设计到32位保护模式的Windows程序设计;从磁盘基础知识到Intel指令编码、浮点运算等相关知识都做...

    Intel汇编语言程序设计

    Intel汇编语言程序设计的第四版还新增了Win32程序设计的内容,包括控制台API和图形应用程序。对于已经熟悉了16位实模式下BIOS和DOS实模式文本及图形程序设计的读者来说,32位保护模式下的Windows程序设计是一个新的...

    Intel汇编语言程序设计(第四版)

    从用纯汇编编写程序到用VC++,BC++等最新编译器与汇编的混合接口编程;从16位实模式下BIOS,DOS实模式文本及图形程序设计到32位保护模式的Windows程序设计;从磁盘基础知识到Intel指令编码、浮点运算等相关知识都做...

    nasm中文手册.pdf

    3. **结构与联合**:可以定义结构体(struct)和联合(union)来组织数据。 4. **内联汇编**:在高级语言(如C/C++)中嵌入汇编代码,提高性能或解决特定问题。 **六、学习资源** 《NASM中文手册》提供了详细的语法...

    c语言入门教程详细介绍

    常用的C语言IDE包括Microsoft Visual C++、Dev-C++、Code::Blocks、Borland C++、Watcom C++、Borland C++ Builder、GNU DJGPP C++、Lccwin32 C Compiler 3.1、High C、Turbo C、C-Free、win-tc、xcode等。...

    C#微软培训资料

    2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...

    windows驱动开发技术详解-part2

     2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 ...

    Windows驱动开发技术详解的光盘-part1

     2.2.2 应用程序与Win32子系统  2.2.3 其他环境子系统  2.2.4 Native API  2.2.5 系统服务  2.2.6 执行程序组件  2.2.7 驱动程序  2.2.8 内核  2.2.9 硬件抽象层  2.2.10 Windows与微内核  2.3 ...

Global site tag (gtag.js) - Google Analytics