Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
来源:互联网 发布:航天开票系统数据导出 编辑:程序博客网 时间:2024/04/28 20:41
32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;
但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!
如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.
准备使用的测试文件:
ALIGN: 指定对齐边界
EVEN 是偶对齐, 相当于 ALIGN 2
ORG 可以指定从当前位置跨越指定书目的字节再安排下一个数据:
这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事.
关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题.
但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!
如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.
准备使用的测试文件:
; Test11_1.asm.586.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data ;声明三个字节变量 v1 db 0 v2 db 0 v3 db 0.codemain proc ;三个字节变量的默认偏移地址如下(在没有对齐约束的情况下, 它们各占一个字节): PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206593 PrintDec offset v3 ;4206594 retmain endpend main
ALIGN: 指定对齐边界
; Test11_2.asm.586.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data v1 db 0 align 4 ;让下一个变量的起始地址保证是 4 的倍数 v2 db 0 v3 db 0.codemain proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206596 (!) PrintDec offset v3 ;4206597 retmain endpend main;align 后面的参数是 2n, 还可测试下: 1、2、8、16
EVEN 是偶对齐, 相当于 ALIGN 2
; Test11_3.asm.586.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data v1 db 0 even ;(!) v2 db 0 v3 db 0.codemain proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206594 (!) PrintDec offset v3 ;4206595 retmain endpend main
ORG 可以指定从当前位置跨越指定书目的字节再安排下一个数据:
; Test11_4.asm.586.model flat, stdcallinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.lib.data v1 db 0 org 100 ;(!) v2 db 0 v3 db 0.codemain proc PrintDec offset v1 ;4206592 PrintDec offset v2 ;4206692 (!) PrintDec offset v3 ;4206693 retmain endpend main
这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事.
关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题.
- Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- Win32ASM学习[5]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- EVEN,ALIGN,ORG,dup指令的理解
- 请教汇编ALIGN伪指令的问题
- ARM汇编align伪指令
- arm汇编align伪指令
- 数据及指令对齐(align)
- arm汇编align伪指令详解
- ARM汇编相关的伪指令
- 80386(win32汇编) .if .else .endif 伪指令的使用
- 数据对齐的作用(于ALIGN密切相关)
- 《Inter汇编语言程序设计》10.1.1 结构中域的对齐(ALIGN伪指令)
- 汇编中ORG伪指令(转载)
- ALIGN 边界对齐指令
- win32汇编中伪指令addr和offset指令的区别
- win32汇编中伪指令addr和offset指令的区别
- 汇编伪指令的学习
- ORG伪指令的作用
- cocos2dx的android工程出现library错误
- 在ubuntu12.04中安装JDK和eclipse
- 计算机网络读书笔记:IP地址
- 偶遇EXP-00091: Exporting questionable statistics
- updown控件的使用
- Win32汇编数据对齐相关的伪指令(ALIGN、EVEN、ORG)
- 保持前行,珍惜磨难
- 理解小波消失矩
- JAVA 单例模式实现-整理
- 07-EasyUI_layout的引入
- linux 下php 的安装及配置
- 494 - Kindergarten Counting Game
- 接口技术原理
- 手机设计11