文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:32
字数 621
阅读 11
收藏 0

声明数组实例:
; 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

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2010/04/04/1704257.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
编程学习基本路线指南(windows)

 1:如果你能够熟练的使用Windows的话,你就可以开始你的程序生涯了!   2:首先从C语言开始。有的朋友可能认为C语言太难了,应该从VB开始。虽然,对于一个初学者来说,用一些控件堆砌成一...

zbing3
2010/01/31
0
0
win32汇编和x64汇编?

win32汇编升到winx64汇编,转型容易吗?我指的是会win32汇编,还学x64汇编吗?我是初学,能不能直接学x64汇编语言,请推荐本书?

IIOWE
2014/10/01
840
3
为什么破解要学win32汇编?

听说破解要学win32汇编,写壳也要用win32汇编?为什么呢?不学不能学破解吗?

IIOWE
2014/10/02
2.4K
13
《汇编语言》总结05 —— 数据处理的两个基本问题

(一)前述 标题所说的两个基本的问题为: 处理的数据在什么地方? 要处理的数据有多长? 这两个问题,在机器指令中必须给以明确或隐含的说明,否则计算机无法工作。 我们定义的描述性符号:...

凡凡不会玩
2018/06/28
0
0
寄存器理解 及 X86汇编入门

本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令。不同架构的CPU指令并不相同,如x86,powerpc,a...

JokerJason
2018/08/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7 安装maven

进入指定目录 cd /usr/local/src/ 下载maven 包 # 打开这个地址选中自己需要的版本补齐后面的地址,再复制到SSH去执行wget http://mirrors.hust.edu.cn/apache/maven/maven-3/ 解压改名 ...

Elson
12分钟前
1
0
推荐一个开源数据库迁移神器SQLines

链接: https://pan.baidu.com/s/1AikdH1X3xNvonpbj4mflgA 提取码: u2jg

Benz001
14分钟前
0
0
面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题

今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一、缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Re...

我最喜欢三大框架
15分钟前
0
0
composer 很慢怎么办?

关于 Composer 的详细安装使用,详见之前的文章:在 PHP 中安装、使用 Composer 包管理工具 Composer 在国内不管是更新还是安装等都有一个「慢」的问题,有的时候真的很煎熬。 因此我们一般会...

whoru
27分钟前
0
0
ffmpeg提取音频文件

问题 从特定的mp3音频文件中,提取一部分作为新的mp3文件 ffmpeg ffmpeg -i a.mp3 -ss 00:25:00 -to 00:28:20 -acodec copy b.mp3 -i输入的文件 -ss从指定时间点开始提取 -to到指定时间点结...

亚林瓜子
35分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部