assembly 汇编函数在数据段中的数据排列

vq8itlhq  于 2023-05-29  发布在  其他
关注(0)|答案(1)|浏览(115)

我知道可以将函数的数据保持在函数附近(例如,在其末尾)或远离函数,在数据部分。另外,我知道最好将数据保存在数据区(像jmp-tables和...这样的数据),让我们考虑一下我们将函数的数据保存在数据区。现在,我的问题是如何安排数据(根据其大小)在数据部分。例如,一个函数有一个jmp-table(8字节地址的列表)和许多DWORD(4字节)数据以及一些WORD(2字节)数据和许多1字节数据:

section code
func:
   ...
section data align 64
 func.jmp_table:
    DQ ...
    DQ ...
    DQ ...
    DQ ...
    DQ ...
    DQ ...
 func.data4:
    DD 0,1,2,3,4,...
 func.data2:
    DW 0,1,2,3,4,...
 func.data1:
    DB 0,1,2,3,4,...

所以我们在数据区放了一个函数data。但是让我们假设我们有10个函数,每个函数都有自己的多大小数据(QWORD,DWORD,WORD,BYTE, ...)。现在我的问题是关于如何把这些数据到数据部分。哪种方式更好?将每个函数的数据放在彼此相邻的(QWORD,DWORD,WORD,BYTE)上,还是将数据部分划分为QWORDs, DWORDs, WORDs, BYTEs并根据其大小排列数据?

Way1(将每个函数的数据背靠背放在它的顶部,让我们做8字节对齐):

section code
 func:
   ...
 func2:
   ...
 func3:
   ...
section data align 64
 func.jmp_table:
    DQ ...,...,...,...,...,...
 func.data4:
    DD ...,...,...,...,...,...
 func.data2:
    DW ...,...,...,...,...,...
 func.data1:
    DB ...,...,...,...,...,...

 align 8
 func2.jmp_table:
    DQ ...,...,...,...,...,...
 func2.data4:
    DD ...,...,...,...,...,...
 func2.data2:
    DW ...,...,...,...,...,...
 func2.data1:
    DB ...,...,...,...,...,...

 align 8
 func3.data1:
    DB ...,...,...,...,...,...
 func3.jmp_table:
    DQ ...,...,...,...,...,...
 func3.data4:
    DD ...,...,...,...,...,...
 func3.data2:
    DW ...,...,...,...,...,...
 func3.data1:
    DB ...,...,...,...,...,...

方式二(按大小拆分函数数据,按大小排列数据段)。

section code
     func:
       ...
     func2:
       ...
     func3:
       ...
    section data align 64
     func.jmp_table:
        DQ ...,...,...,...,...,...
     func2.jmp_table:
        DQ ...,...,...,...,...,...
     func3.jmp_table:
        DQ ...,...,...,...,...,...

     func.data4:
        DD ...,...,...,...,...,...
     func2.data4:
        DD ...,...,...,...,...,...
     func3.data4:
        DD ...,...,...,...,...,...

     func.data2:
        DW ...,...,...,...,...,...
     func2.data2:
        DW ...,...,...,...,...,...
     func3.data2:
        DW ...,...,...,...,...,...

     func.data1:
        DB ...,...,...,...,...,...
     func2.data1:
        DB ...,...,...,...,...,...
     func3.data1:
        DB ...,...,...,...,...,...
mzmfm0qo

mzmfm0qo1#

您的决定应基于***缓存利用率。***
换句话说,经常一起访问的数据应该尽可能靠近地放置,以便最大化落入同一“高速缓存行”的机会。
(“缓存线”是一个历史术语,你可以查找,它基本上意味着“缓存页面”,但页面这个词已经用于其他东西。

相关问题