您的位置:首页 > 其它

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

org
100 ;(!)

v2 db0

v3 db0

.code

main proc

PrintDec offset v1 ;4206592

PrintDec offset v2 ;4206692 (!)

PrintDec offset v3 ;4206693

ret

main endp

end
main

------------------------------------------------------------------------------------------------------------------------------------------

这些伪指令不对局部变量产生影响, 因为伪指令作用在编译之前, 局部变量使用内存是程序运行之后的事.

关于局部变量的对齐和速度, 除了编译的工作外, 我们在安排变量类型和次序时也应该考虑到 "对齐" 的问题.

转载于:----博客圆---------

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐