为什么80%的码农都做不了架构师?>>>   

声明数组实例:


; Test6_1.asm
.386
.model flat, stdcallinclude    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, valPrintDec eax     ;11mov eax, val[4]PrintDec eax     ;22mov eax, val[8]PrintDec eax     ;33ret
end start

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


; Test6_2.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 11dd 22,33
.code
start:mov eax, val[4*0]PrintDec eax     ;11mov eax, val[4*1]PrintDec eax     ;22mov eax, val[4*2]PrintDec eax     ;33ret
end start

使用伪指令 DUP:


; Test6_3.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.data;声明有三个元素的 DWORD 数组, 并把每个元素初始化为 6v1 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 00DumpMem offset v2, 12  ;00 00 00 00 - 00 00 00 00 - 00 00 00 00DumpMem offset v3, 12  ;00 00 00 00 - 00 00 00 00 - 00 00 00 00ret
end start

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


; Test6_4.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.datav1 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, stdcallinclude    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, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 2 dup(1,2,3)
.code
start:DumpMem offset val, 24 ;01000000-02000000-03000000-01000000-02000000-03000000ret
end start

嵌套数组:


; Test6_7.asm
.386
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.dataval dd 2 dup(3 dup(1,2))
.code
start:DumpMem offset val, 48 ;1 2 1 2 1 2  1 2 1 2 1 2ret
end start

转载于:https://my.oschina.net/hermer/blog/319624

学 Win32 汇编[6]: 伪指令 DUP 与数组相关推荐

  1. 学 Win32 汇编[17]: 关于压栈(PUSH)与出栈(POP) 之一

    记得刚学多线程的时候, 碰到一个结构: //Delphi 的语法描述 PContext = ^TContext; _CONTEXT = recordContextFlags: DWORD;Dr0: D ...

  2. win32汇编中伪指令addr和offset指令的区别

    一.相同点 1.addr 和 offset 操作符都是获得操作数的偏移地址: 2.addr 和 offset 的处理都是先检查处理的是全局还是局部变量,若是全局变量则把其地址放到目标文件中. 二.不同 ...

  3. 学 Win32 汇编[12]: PTR、OFFSET、ADDR、THIS

    为什么80%的码农都做不了架构师?>>>    PTR: 指定要操作的数据尺寸 ; Test12_1.asm .386 .model flat, stdcallinclude win ...

  4. 学 Win32 汇编[27] - 乘除指令: MUL、IMUL、DIV、IDIV

    MUL: 无符号乘 ;影响 OF.CF 标志位 ;指令格式: ;MUL r/m ;参数是乘数;如果参数是 r8/m8, 将把 AL 做乘数, 结果放在 AX ;如果参数是 r16/m16, 将把 AX ...

  5. 学 Win32 汇编[24] - 移位: SHL、SHR、SAL、SAR、ROL、ROR、RCL、RCR、SHLD、SHRD

    SHL.SHR.SAL.SAR: 移位指令 ;SHL(Shift Left): 逻辑左移 ;SHR(Shift Right): 逻辑右移 ;SAL(Shift Arithmetic Left): 算术 ...

  6. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等...

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  7. 学 Win32 汇编[26] - 加减指令: INC、DEC、NEG、ADD、ADC、SUB、SBB、CMP

    为什么80%的码农都做不了架构师?>>>    ;INC(Increment): 加一 ;DEC(Decrement): 减一 ;NEG(Negate): 求补(求反) ;ADD(A ...

  8. 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等

    跳转指令分三类: 一.无条件跳转: JMP; 二.根据 CX.ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转).JECXZ(ECX 为 0 则跳转); 三.根据 EFLAGS 寄存器的标志位 ...

  9. 【Win32汇编】学习Win32汇编

    学习Win32汇编(Windows下的32位汇编) 第一个程序Hello world 控制台输出(新建Console App工程) Debug输出(新建Win32 App工程) 后面代码的头文件在这里 ...

最新文章

  1. wxWidgets刚開始学习的人导引(3)——wxWidgets应用程序初体验
  2. 批量修改文件夹下图片名称(Python)
  3. 好程序员web前端分享HTML基础篇
  4. java调用本地shell_java通过ProcessBuilder执行本地shell命令 获取ip配置信息
  5. Spring的事务传播性
  6. 面试题之--实现取余
  7. 软件设计师 - UML图
  8. FaunaDB and serverless and bmob
  9. 贴一个数据结构老师布置的作业(各种排序) c 语言实现
  10. cad常青藤插件_CAD 2020软件安装包+插件大合集+完整视频教程,自学也可以的
  11. c语言指令 符号表,C语言指令、符号表
  12. Android Studio新建项目出错如何解决
  13. 微信公众号音频在线下载工具 微信公众号音频下载工具 微信公众号视频下载工具
  14. scratch实现秋天的画
  15. PHP 判断日期格式
  16. 传统BI+敏捷BI+智能BI
  17. 查看Ubuntu的版本号,并添加国内镜像源
  18. laravel阿里SDK对接
  19. 先收藏!只需三步,教你做好 618 大促复盘!
  20. 解决Chrome浏览器启动页被劫持篡改为360

热门文章

  1. 计算机没有cpu会怎么样,电脑cpu不好会怎么样
  2. 解码(七):音频重采样SwrContext和swr_convert相关函数详解
  3. c# oldb连接_(转)C#连接OleDBConnection数据库的操作
  4. python生成器迭代器_python 生成器 迭代器
  5. pytorch torch.utils.data.Dataset
  6. flask-sqlalchemy Models
  7. VSCode USER GUIDE Basic Editing
  8. Java JDBC spring-jdbc
  9. 3.5 定向搜索的误差分析
  10. py2neo match