• 学 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
    

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

  • 相关阅读:
    RHCE考试(Linux7)
    RHCSA考试(Linux7)
    调整Linux最大文件打开数
    记一次渗透测试面试题
    反序列化漏洞
    cisp-pte靶场通关思路分享----xss篇
    cisp-pte靶场通关思路分享----远程文件包含篇
    利用python轻松搭建http服务器
    cisp-pte靶场通关思路分享----综合题篇
    cisp-pte靶场通关思路分享----日志分析篇
  • 原文地址:https://www.cnblogs.com/del/p/1705795.html
Copyright © 2020-2023  润新知