32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;
但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!

如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.

准备使用的测试文件:


; Test11_1.asm
.586
.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 db 0v2 db 0v3 db 0
.code
main proc ;三个字节变量的默认偏移地址如下(在没有对齐约束的情况下, 它们各占一个字节):PrintDec offset v1  ;4206592PrintDec offset v2  ;4206593PrintDec offset v3  ;4206594ret
main endp
end main


ALIGN: 指定对齐边界


; Test11_2.asm
.586
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.datav1 db 0align 4 ;让下一个变量的起始地址保证是 4 的倍数v2 db 0v3 db 0
.code
main procPrintDec offset v1  ;4206592PrintDec offset v2  ;4206596 (!)PrintDec offset v3  ;4206597ret
main endp
end main

;align 后面的参数是 2n, 还可测试下: 1、2、8、16


EVEN 是偶对齐, 相当于 ALIGN 2


; Test11_3.asm
.586
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.datav1 db 0even    ;(!)v2 db 0v3 db 0
.code
main procPrintDec offset v1  ;4206592PrintDec offset v2  ;4206594 (!)PrintDec offset v3  ;4206595ret
main endp
end main


ORG 可以指定从当前位置跨越指定书目的字节再安排下一个数据:


; Test11_4.asm
.586
.model flat, stdcallinclude    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib.datav1 db 0org 100 ;(!)v2 db 0v3 db 0
.code
main procPrintDec offset v1  ;4206592PrintDec offset v2  ;4206692 (!)PrintDec offset v3  ;4206693ret
main endp
end main


这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事.
关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题.

Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)相关推荐

  1. Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)

    32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度; 但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度! 如果使用对齐 ...

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

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

  3. win32 汇编基础概念整理

    一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...

  4. win32汇编基础概念

    一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...

  5. Win32 汇编环境和入门程序图解

    一 安装 在安装的最后,执行VBS脚本,在桌面建立快捷方式:执行快捷方式,会调入Win32汇编的编辑器qeditor.exe,进入到开发环境 二 构建Hello World程序 ;.386是伪指令 告 ...

  6. C指针原理(23)-win32汇编及.NET调试

    2018-12-28 20:36:07 在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS ...

  7. Win10系统VS2022开发环境中(X86)Win32汇编(MASM32)环境配置和一些示例源码及解释

    抱歉,还是只能用米国的软件以及技术以及等等等等......,所以各位勿怪. 如果配置完成,在vs2022调试环境下正确编译运行后,可以看到如下画面: 在VS022中开发学习汇编必然很方便. 这里可以下 ...

  8. Win32汇编_基础

    Win32汇编_基础 包含全部段的源程序结构: .386 .model flat, stdcall Option casemap:none ;<一些include语句> .stack [堆 ...

  9. 伪指令 .align 的含义

    伪指令 .align 的作用是在编译时指示编译器填充位置计数器(类似指令计数器)到一个指定的内存边界处,目的是为 了提高 CPU 访问内存中代码或数据的速度和效率.其完整格式为: .align val ...

最新文章

  1. Java程序员需要熟悉的库
  2. 跨域请求设置withCredentials
  3. 设计模式:享元(FlyWeight)模式
  4. VS 团队资源管理 强制解锁锁定文件
  5. 学习angularjs的内置API函数
  6. 更多Requests的小技巧以及总结
  7. 【进出理论】投入与收益
  8. 特征值_陶哲轩数学发现的故事 | 特征值特征向量等式
  9. Linux 内核修正 5 年历史的严重 bug
  10. mysql的select的排序_mysql数据分组和排序及SELECT子句顺序
  11. 《黑镜》黑科技成真 | 解码脑电信号,AI重构脑中的画面
  12. matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍
  13. 第16 17章节-Python3.5-Django知识点整理 15
  14. ArcGIS:使用镶嵌功能将地理空间数据云下载的多幅DEM合并为一幅
  15. 架构 高级系统架构师培训笔记
  16. 产品活跃度做好很难?提高用户活跃度用对方法一点也不难
  17. Cloud一分钟 |互联网之冬;华为停招,BAT裁员;苹果下线拼多多应用;意媒谈DG风波:中国人记性差...
  18. 目标决定人生——没有目标就失去一切!
  19. Python+Excel 华尔街的一股清流
  20. uniApp和微信小程序好看的我的页面(有源码)

热门文章

  1. Java NIO系列教程(一) Java NIO 概述
  2. 网页打不开,却能上qq,何解?
  3. SendTextMessage 等方便的消息发送函数
  4. 怎么删除XP中无法删除的文件
  5. The Elements of C# Style -Naming
  6. 【AJAX】反向Ajax第1部分:Comet介绍
  7. 关键路径法及C语言实现
  8. 国办支持乡村医生建设 医疗信息化提速
  9. 前端开发工程师如何在新的一年里提升自己
  10. 物联网正在给批发业带来新的商业模式