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

学 Win32 汇编[6]: 伪指令 DUP 与数组

 
阅读更多

声明数组实例:


; Test6_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

.data
    ;声明并初始化有三个元素的 DWORD 数组; 该数组每个元素是 4 字节
    val dd 11,22,33
.code
start:
    mov eax, val
    PrintDec eax     ;11
    mov eax, val[4]
    PrintDec eax     ;22
    mov eax, val[8]
    PrintDec eax     ;33
    ret
end start


上面的例子也可以这样写:


; Test6_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

.data
    val dd 11
        dd 22,33
.code
start:
    mov eax, val[4*0]
    PrintDec eax     ;11
    mov eax, val[4*1]
    PrintDec eax     ;22
    mov eax, val[4*2]
    PrintDec eax     ;33
    ret
end start


使用伪指令 DUP:


; Test6_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

.data
    ;声明有三个元素的 DWORD 数组, 并把每个元素初始化为 6
    v1 dd 3 dup(6)
    ;声明有三个元素的 DWORD 数组, 无初始化; 对全局变量, 没有初始化的将用 0 填充
    v2 dd 3 dup(?)
.data?
    ;声明有三个元素的 DWORD 数组
    v3 dd 3 dup(?)

.code
start:
    DumpMem offset v1, 12  ;06 00 00 00 - 06 00 00 00 - 06 00 00 00
    DumpMem offset v2, 12  ;00 00 00 00 - 00 00 00 00 - 00 00 00 00
    DumpMem offset v3, 12  ;00 00 00 00 - 00 00 00 00 - 00 00 00 00
    ret
end start


现在可以区别未初始化的变量在 .data 段和 .data? 的区别:


; Test6_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

.data
    v1 dd 4096 dup(?) ;未初始化变量在 .data 段, 生成的 exe 文件会根据大小分配内存
.code
start:
    PrintText 'Hi'
    ret
end start

; ------------------------------------------------------
; 上面的程序的 exe 是 18944 字节
; 下面的程序的 exe 是 2560 字节
; 它们刚好相差 4096*4 个字节
; 结论: 不需要初始化的变量应该声明在 .data? 段
; ------------------------------------------------------

; Test6_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

.data?
    v1 dd 4096 dup(?) ;未初始化变量在 .data? 段
.code
start:
    PrintText 'Hi'
    ret
end start


继续 dup 的例子:


; Test6_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

.data
    val dd 2 dup(1,2,3)
.code
start:
    DumpMem offset val, 24 ;01000000-02000000-03000000-01000000-02000000-03000000
    ret
end start


嵌套数组:


; Test6_7.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

.data
    val dd 2 dup(3 dup(1,2))
.code
start:
    DumpMem offset val, 48 ;1 2 1 2 1 2  1 2 1 2 1 2
    ret
end start
分享到:
评论

相关推荐

    汇编常用伪指令表

    汇编语言中的伪指令表解析 汇编语言中,伪指令是一种特殊的指令,它们不是机器指令,而是编译器或汇编器用来控制编译或汇编过程的指令。下面是常用伪指令的解析: 1. DB/DW/DD/DT:定义数据属性 DB(Define Byte...

    伪指令及其作用

    **ASSUME** 用于告知汇编器哪些段寄存器与特定段关联,以便正确生成指令的目标代码。 - 一般格式: ``` ASSUME 段寄存器:段名[, 段寄存器:段名, ...] ``` - 示例: ``` ASSUME CS:CODE ``` 通过上述介绍...

    汇编语言的处理数组数据

    在IT领域,汇编语言是一种低级编程语言,它与机器指令系统紧密相关,可以直接控制计算机硬件。在处理数组数据时,汇编语言提供了一种高效且直接的方式,尽管这通常需要对内存管理和指针操作有深入理解。下面将详细...

    -单片机汇编伪指令-

    为了提高编程效率与代码的可读性,汇编语言中引入了多种伪指令。这些伪指令并非机器可以直接识别的指令,而是由汇编器在汇编过程中进行处理的特殊命令。本文将详细介绍一些常见的汇编伪指令及其用法。 #### 二、...

    8086的伪指令

    #### 知识点一:伪指令与存储空间分配及初始化数据 **伪指令**是汇编语言中的一种特殊指令,它们并不被CPU直接执行,而是由汇编器在汇编过程中处理。伪指令主要用于辅助程序的编写和调试,比如定义变量、分配内存等...

    吉林大学微机接口章-汇编语言程序设计(与“伪指令”有关文档共86张).pptx

    - `DB`伪指令用于定义字节数据,如`DATA2 DB 10 DUP(0)`定义10个字节的0。 - `END`伪指令标识程序结束,`START`可能是程序的入口点。 汇编语言程序设计是计算机科学的基础,对于理解计算机底层工作原理和优化程序...

    微型计算机原理与接口技术:宏汇编语言.ppt

    数据定义伪指令是用于定义数据的,包括常量符号赋值伪指令、各种类型变量定义伪指令、重复操作符 DUP 等。 六、符号定义伪指令 符号定义伪指令用于定义符号,包括 EQU 和=两种定义方式。EQU 定义的符号不可更改,...

    汇编语言及汇编程序设计.pptx

    常见的伪指令包括符号定义伪指令、内存数据定义伪指令、段定义伪指令、段寄存器说明伪指令、定位伪指令、子程序伪指令等。 符号定义伪指令EQU用于给符号名赋值,格式为:<符号名> EQU <表达式>。例如:EQU 88HPORT ...

    8086 汇编编程 pdf

    段定义伪指令`SEGMENT`用于定义一个新的段,它告诉汇编器一个新段的开始。例如,在给定的部分内容中,有数据段、堆栈段和代码段的定义: ```assembly DATASEGMENT BUFDB 23H,16H,08H,20H,64H,8AH,91H,35H,2BH,FFH ...

    汇编语言指令 掌握良好 开头

    **DUP**:重复数据指令,用于初始化数据段中的数组。 **SEGMENT/ENDS**:段定义指令,用于定义代码段或数据段。 **ASSUME**:假设指令,用于指定段寄存器和段之间的关联。 **ORG**:起始位置指令,用于指定段的...

    sevenforths:前进 dup dup dup dup dup dup

    在JavaScript编程中,"dup"可能与对象复制、函数重复调用或数组元素复制有关。开发者可能使用了某种技巧或模式来实现代码的复用和模块化。例如,他们可能利用了JavaScript的`Object.assign()`方法进行对象复制,或者...

    跟着锅子一步步学习32位汇编

    ### 汇编语言基础与实践:跟着锅子学习32位汇编 #### 一、初识32位汇编:编写第一个程序 在学习32位汇编的过程中,锅子采用了一种较为纯粹的方法,尽量脱离Windows API,以便更好地理解底层原理。本次介绍的第一个...

    win10 null.sys 文件 fatal:open /dev/null or dup failed: No such file or directory

    win10安装git报错 fatal:open /dev/null or dup failed: No such file or directory错误,将该文件复制到C:\Windows\System32\drivers 替换掉原有的null.sys文件重启即可

    汇编语言程序设计练习题及参考答案[汇编].pdf

    13. DUP伪指令:汇编语言中,DUP伪指令用于定义数组。例如,问题17中,DA1 DB 2 DUP(3,5,7)可等同于DA1 DB 3,5,7。 本资源涵盖了汇编语言程序设计的多个方面,旨在帮助学生和开发人员提高汇编语言编程能力。

    微机原理实验二——循环程序结构和过程调用程序设计

    本次实验主要通过几个具体的编程任务来加深理解汇编语言中循环结构和过程调用的应用,掌握8086 CPU的基本指令系统,尤其是循环、分支结构以及子程序调用的相关指令。实验具体分为以下几个部分: 1. **两个数组之和*...

    汇编指令词汇大全 全集

    汇编语言是计算机系统中的低级编程语言,它直接对应于机器的指令集,对于理解计算机的工作原理至关重要。本篇文章将详细介绍汇编指令词汇大全,涵盖各种基本操作,包括数据传输、算术运算、逻辑操作、控制流以及输入...

    单片机原理及应用-汇编语言程序设计简介P(与“程序”有关文档共77张).pptx

    6. **赋值伪指令 (EQU)**:EQU伪指令用于为符号赋予一个常数值或已有的符号,如`LEN EQU 10`,`BLOCK EQU 22H`。在后续指令中,可以用LEN和BLOCK替代相应的值。 此外,汇编语言的语句格式包括四个字段:标号、操作...

    王爽著《汇编语言》课件及课后习题答案和实验解答

    汇编语言是各种CPU所提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作。汇编语言是很多相关课程(如:数据结构、操作系统、微机原理等)的重要基础。为了更好地引导、帮助读者学习汇编语言...

    专升本专业课的笔记 微型计算机技术与接口技术 农学院授课教案6

    ##### 伪指令与伪操作 1. **定义符号的伪指令**: - **EQU**:用于定义常量。 - **=**:用于定义可变的符号。 - **PURGE**:用于删除符号的定义。 2. **定义数据的伪指令**: - `DB`:定义字节。 - `DW`:...

    java虚拟机指令dup详解

    在创建数组时,dup 指令也可以用于复制数组的引用,以便将其传递给相关的方法。 在 Java 中,dup 指令的使用非常频繁,例如在创建异常对象时,需要使用 dup 指令来复制对象的引用,以便将其传递给实例初始化方法。...

Global site tag (gtag.js) - Google Analytics