Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
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)相关推荐
- Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度; 但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度! 如果使用对齐 ...
- 【Win32汇编】学习Win32汇编
学习Win32汇编(Windows下的32位汇编) 第一个程序Hello world 控制台输出(新建Console App工程) Debug输出(新建Win32 App工程) 后面代码的头文件在这里 ...
- win32 汇编基础概念整理
一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...
- win32汇编基础概念
一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...
- Win32 汇编环境和入门程序图解
一 安装 在安装的最后,执行VBS脚本,在桌面建立快捷方式:执行快捷方式,会调入Win32汇编的编辑器qeditor.exe,进入到开发环境 二 构建Hello World程序 ;.386是伪指令 告 ...
- C指针原理(23)-win32汇编及.NET调试
2018-12-28 20:36:07 在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS ...
- Win10系统VS2022开发环境中(X86)Win32汇编(MASM32)环境配置和一些示例源码及解释
抱歉,还是只能用米国的软件以及技术以及等等等等......,所以各位勿怪. 如果配置完成,在vs2022调试环境下正确编译运行后,可以看到如下画面: 在VS022中开发学习汇编必然很方便. 这里可以下 ...
- Win32汇编_基础
Win32汇编_基础 包含全部段的源程序结构: .386 .model flat, stdcall Option casemap:none ;<一些include语句> .stack [堆 ...
- 伪指令 .align 的含义
伪指令 .align 的作用是在编译时指示编译器填充位置计数器(类似指令计数器)到一个指定的内存边界处,目的是为 了提高 CPU 访问内存中代码或数据的速度和效率.其完整格式为: .align val ...
最新文章
- Java程序员需要熟悉的库
- 跨域请求设置withCredentials
- 设计模式:享元(FlyWeight)模式
- VS 团队资源管理 强制解锁锁定文件
- 学习angularjs的内置API函数
- 更多Requests的小技巧以及总结
- 【进出理论】投入与收益
- 特征值_陶哲轩数学发现的故事 | 特征值特征向量等式
- Linux 内核修正 5 年历史的严重 bug
- mysql的select的排序_mysql数据分组和排序及SELECT子句顺序
- 《黑镜》黑科技成真 | 解码脑电信号,AI重构脑中的画面
- matlab中的count函数,Excel 中COUNT函数的使用详解,详情介绍
- 第16 17章节-Python3.5-Django知识点整理 15
- ArcGIS:使用镶嵌功能将地理空间数据云下载的多幅DEM合并为一幅
- 架构 高级系统架构师培训笔记
- 产品活跃度做好很难?提高用户活跃度用对方法一点也不难
- Cloud一分钟 |互联网之冬;华为停招,BAT裁员;苹果下线拼多多应用;意媒谈DG风波:中国人记性差...
- 目标决定人生——没有目标就失去一切!
- Python+Excel 华尔街的一股清流
- uniApp和微信小程序好看的我的页面(有源码)