`
zzc1684
  • 浏览: 1224578 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 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


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

分享到:
评论

相关推荐

    DSP汇编伪指令汇总

    ### DSP汇编伪指令概述 #### 一、引言 在DSP(数字信号处理器)的开发过程中,汇编语言作为一种底层编程技术,被广泛应用于性能敏感的应用场景中。为了提高编程效率并简化复杂的代码结构,DSP汇编语言支持一系列伪...

    汇编伪指令汇总

    ### 汇编伪指令汇总 #### 一、定义段的伪指令 1. **`.asect "sectionname", address`** - **说明**:该伪指令用于定义一个绝对命名且已被初始化的段,但现在已被标记为过时。 2. **`.bss symbol, sizeinwords[,...

    汇编语言程序设计 第二版

    4.3.2 对齐伪指令ALIGN 4.3.3 调整偏移量伪指令ORG 4.3.4 偏移量计数器的值 4.4 复合内存变量的定义 4.4.1 重复说明符DUP 4.4.2 结构类型的定义 4.4.3 联合类型的定义 4.4.4 记录类型的定义 4.4.5 数据类型的自定义 ...

    专升本专业课的笔记 微型计算机技术与接口技术 农学院授课教案6

    ### 汇编语言与基本伪指令知识点详解 #### 教学目的 - 掌握微型计算机汇编语言的基本格式和程序设计方法。 #### 教学要求 1. **熟悉汇编语言程序的结构**:了解语句类型及其格式。 2. **数据项及表达式的认识**:...

    在Visual_C++中使用内联汇编

    4. **EVEN和ALIGN指示符**:这些指示符可以确保代码对齐到特定的边界,提高某些处理器的效率。 5. **MASM宏指示符**:内联汇编不支持MASM的宏指令。 6. **段说明**:必须使用寄存器来指定段。 7. **类型和变量大小**...

    DSP程序编写和调试环境简介PPT课件PPT学习教案.pptx

    汇编伪指令是汇编语言中用于辅助程序编译和组织的特殊指令,主要分为七类: - **段定义伪指令**:用于划分程序的不同部分,如.asect, .bss, .sect, .text, .usect 和 .data。 - **常数初始化伪指令**:用于在程序...

    20秋大工《微机原理与控制技术》在线作业2答案.docx

    15. **对准伪操作**:`ALIGN`或`EVEN`伪指令用于使下一个字节地址成为偶数,确保数据在特定边界对齐。 16. **DOS功能调用**:在汇编语言中进行DOS功能调用时,如果要实现键盘输入并回显,同时返回输入字符的ASCII码...

    2022年在Visual C++中使用内联汇编C语言教程.docx

    需要注意的是,内联汇编不支持大多数 MASM 指示符,但支持 EVEN 和 ALIGN 指示符,可以在汇编代码中加入 NOP 指令使标号对齐到特定边界,以提高某些处理器的执行效率。 在内联汇编中,需要使用寄存器来说明段,跨越...

    在 Visual C++ 中使用内联汇编

    尽管如此,内联汇编支持EVEN和ALIGN指示符,它们可以通过插入NOP指令确保代码在特定边界对齐,提高某些处理器的指令加载效率。 #### 段引用 内联汇编中,段必须使用寄存器而非名称引用,段跨越需明确声明。 #### ...

    汇编语言期末复习知识点总结

    - **Even伪指令**:用于确保变量对齐到偶地址。 - **Align伪指令**:NUM必须是2的幂,使内存对齐。 - **ORG伪指令**:指定内存变量的起始偏移量。 - **DUP重复说明符**:如BUFFER DB 100DUP(?),创建100个未知值...

    在 Visual C++ 中使用内联汇编.pdf

    1. **指令集**:内联汇编支持Intel Pentium 4和AMD Athlon的所有指令,以及通过`_EMIT`伪指令自定义的其他处理器指令。 2. **MASM表达式**:在内联汇编中,MASM表达式的使用提供了灵活性,但不支持MASM的全部特性...

    在vc中使用内嵌汇编.doc

    尽管如此,`EVEN`和`ALIGN`指令可用于对齐目的,以优化处理器的指令读取。`_EMIT`伪指令可用来插入单字节数据,类似于MASM的`DB`指令。 内联汇编可以与C/C++语言元素混合使用,这意味着可以访问C/C++的变量和函数。...

    在Visual C++中使用内联汇编

    不过,`EVEN`和`ALIGN`指令被保留,用于对齐代码,提高某些处理器的执行效率。 汇编语言指令可以直接引用C/C++的变量和表达式,比如`MOV EAX, 1`。通过`LENGTH`、`SIZE`和`TYPE`,可以获取C/C++数组的元素数量、...

    uboott移植实验手册及技术文档

    static inline u32 NF_Read_ECC(void) { S3C2410_NAND * const nand = S3C2410_GetBase_NAND(); return(nand->NFECC); } static inline void NF_SetCE(NFCE_STATE s) { S3C2410_NAND * const nand = S3C...

Global site tag (gtag.js) - Google Analytics