zoukankan      html  css  js  c++  java
  • 学 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
    

  • 相关阅读:
    Code First Migrations更新数据库结构(数据迁移) 【转】
    Lambda表达式详解【转】
    @Html.Raw用法
    ASP.NET MVC文件上传【转】
    SQL Server附加数据库拒绝访问错误解决方法
    window.location.href的用法
    vs2013中将复制过来的文件或文件夹显示到解决方案管理
    Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
    VS中的一些标记
    ob_get_contents()
  • 原文地址:https://www.cnblogs.com/del/p/1704257.html
Copyright © 2011-2022 走看看