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

 

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

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

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

 

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值