Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
2011-12-04 13:56
295 查看
32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度; 但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度! 如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题. 准备使用的测试文件: ------------------------------------------------------------------------------------------------------------------------------------------ .586 .modelflat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data ;声明三个字节变量 v1 db 0 v2 db 0 v3 db 0 .code main proc ;三个字节变量的默认偏移地址如下(在没有对齐约束的情况下, 它们各占一个字节): PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206593 PrintDec offset v3 ;4206594 ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ALIGN: 指定对齐边界 ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_2.asm .586 .modelflat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data v1 db0 align 4 ;让下一个变量的起始地址保证是 4 的倍数 v2 db0 v3 db0 .code main proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206596 (!) PrintDec offset v3 ;4206597 ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ;align 后面的参数是 2n, 还可测试下: 1、2、8、16 EVEN 是偶对齐, 相当于 ALIGN 2 ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_3.asm .586 .modelflat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data v1 db0 even ;(!) v2 db0 v3 db0 .code main proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206594 (!) PrintDec offset v3 ;4206595 ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ ORG 可以指定从当前位置跨越指定书目的字节再安排下一个数据: ------------------------------------------------------------------------------------------------------------------------------------------ ; Test11_4.asm .586 .modelflat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .data v1 db0 org100 ;(!) v2 db0 v3 db0 .code main proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206692 (!) PrintDec offset v3 ;4206693 ret main endp end main ------------------------------------------------------------------------------------------------------------------------------------------ 这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事. 关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题. 转载于:----博客圆--------- |
相关文章推荐
- 学 Win32 汇编[11]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- 数据挖掘相关算法学习计划目录<1>
- Android学习三 数据存储相关
- Hadoop学习总结(1)——大数据以及Hadoop相关概念介绍
- C++数据对齐#pragma和__declspec(align(n))
- 内存中数据对齐相关
- 数据挖掘领域国内外相关专家(大牛们)及学习资源
- C语言学习笔记(三):数据对齐
- Linux 学习数据专题【管理、编程、源码分析】——Linux相关图书选购指南
- pandas学习笔记-算术运算和数据对齐
- 惭愧,直到今天才对“数据类型字节对齐”有个深入的了解,对以前读书时学习的知识没有深刻理解啊 C/C++学习 C/C++学习 漫漫人生,澎湃的经历不断促使改变自己,永恒不变的是一颗骄傲的心!
- Spark中组件Mllib的学习18之corr:两组数据相关关系计算(Pearson、Spearman)
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识
- Redis学习笔记2--Redis数据类型及相关命令
- 黑马程序员--wpf学习笔记六----数据操作相关
- Krpano学习:在C#中修改全景场景属性(C#操作全景vtour.xml文件及相关瓦片数据/panos/*.tiles)
- 大数据学习——Hadoop平台及相关生态系统
- Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识