我想知道就特定部分中的整个代码而言,数据部分和文本部分之间有什么区别。
我正在尝试运行在此添加的代码。 在数据段中,它运行并显示“ af)a” 如果我将其更改为第2行的文本部分,则会出现段错误。
我不知道关键的区别是什么。 谢谢:)
global _start
section .data
_start: mov ecx, 3
xor byte [_start + 1], 0x02
pushad
mov eax, 4
mov ebx, 1
mov edx, ecx
mov ecx, dword blah
int 0x80
blah: popad
sub bx, ax
loop _start
mov eax, 1
mov ebx, 2
int 0x80
fin:
预期的代码会产生相同的结果,但事实证明并非如此。
答案 0 :(得分:3)
.text
和.data
之间的差异
我不知道MASM汇编程序,但是GNU汇编程序有两个区别:
.text
,另一种情况下为.data
)。但是,此名称被操作系统忽略。SHF_ALLOC | SHF_EXECINSTR
代表.text
和SHF_ALLOC | SHF_WRITE
for .data
“部分标志”告诉操作系统该部分中存在哪种数据以及允许哪种操作:
SHF_EXECINSTR
表示该节包含可以执行的代码。如果此标志未命中,则如果该部分包含代码,则该程序将在大多数操作系统中崩溃。较早的32位CPU不支持此功能,因此在运行32位程序时,许多操作系统都会忽略此标志。显然,您的操作系统会忽略此标志;否则,程序的.data
变体将崩溃,因为代码位于.data
部分。
SHF_WRITE
意味着该节中的数据可以被覆盖。如果缺少此标志,而您正在尝试对该部分中的数据执行写操作,则程序将崩溃。
当然,可以通过在.text
节中设置SHF_WRITE
标志的方式来处理可执行文件。 (并且某些汇编程序允许直接为.text
部分设置此标志。)在这种情况下,如果您写入.text
部分,则程序不会崩溃。