我知道可以将函数的数据保持在函数附近(例如,在其末尾)或远离函数,在数据部分。另外,我知道最好将数据保存在数据区(像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 ...,...,...,...,...,...
1条答案
按热度按时间mzmfm0qo1#
您的决定应基于***缓存利用率。***
换句话说,经常一起访问的数据应该尽可能靠近地放置,以便最大化落入同一“高速缓存行”的机会。
(“缓存线”是一个历史术语,你可以查找,它基本上意味着“缓存页面”,但页面这个词已经用于其他东西。