ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

学 Win32 汇编[11]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)

2021-04-30 12:03:38  阅读:228  来源: 互联网

标签:11 main 伪指令 ALIGN includelib db offset include inc


学 Win32 汇编[11]: 数据对齐相关的伪指令(ALIGN、EVEN、ORG)


32 位的寄存器容量是 4 字节, 如果内存中的数据都按 4*n 字节对齐, 肯定会加快吞吐速度;
但事实并非如此, 不同大小的数据可能会让寄存器别别扭扭地去处理, 从而降低了运行速度!

如果使用对齐, 就会浪费掉一些内存空间; 其实这是一个需要权衡 "速度" 与 "内存" 得失的问题.

准备使用的测试文件:
; Test11_1.asm
.586
.model flat, 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
.model flat, 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
    align 4 ;让下一个变量的起始地址保证是 4 的倍数
    v2 db 0
    v3 db 0
.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
.model flat, 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
    even    ;(!)
    v2 db 0
    v3 db 0
.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
.model flat, 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
    org 100 ;(!)
    v2 db 0
    v3 db 0
.code
main proc
    PrintDec offset v1  ;4206592
    PrintDec offset v2  ;4206692 (!)
    PrintDec offset v3  ;4206693
    ret
main endp
end main

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

posted on 2010-04-06 22:45  万一  阅读(4036)  评论(0)  编辑  收藏

标签:11,main,伪指令,ALIGN,includelib,db,offset,include,inc
来源: https://blog.51cto.com/u_14617575/2745507

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有