Assembly .text和.data之间的差异
我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别 我试图运行我在这里添加的代码。 在数据部分,它运行并打印“af)a” 如果我将其更改为第2行中的文本部分,则表示seg故障 我搞不清楚关键的区别是什么。 谢谢:) 预期代码会产生相同的结果,但事实证明并非如此Assembly .text和.data之间的差异,assembly,x86,nasm,Assembly,X86,Nasm,我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别 我试图运行我在这里添加的代码。 在数据部分,它运行并打印“af)a” 如果我将其更改为第2行中的文本部分,则表示seg故障 我搞不清楚关键的区别是什么。 谢谢:) 预期代码会产生相同的结果,但事实证明并非如此 .text和.data 我不知道MASM汇编程序,但GNU汇编程序有两个区别: 名称(.text在一种情况下,另一种情况下,.data)。但是,此名称被操作系统忽略 可执行文件中的节标志: SHF_ALLOC | SHF_EX
.text
和.data
我不知道MASM汇编程序,但GNU汇编程序有两个区别:
.text
在一种情况下,另一种情况下,.data
)。但是,此名称被操作系统忽略
用于SHF_ALLOC | SHF_EXECINSTR
和.text
forSHF|u ALLOC;SHF|u WRITE
。data
表示该节包含可执行的代码。如果此标志未命中,则在大多数OSs中,如果该部分包含代码,程序将崩溃。较旧的32位CPU不支持此功能,因此许多操作系统在运行32位程序时忽略了此标志。显然,你的操作系统忽略了这个标志;否则,程序的SHF_EXECINSTR
变体将崩溃,因为代码位于.data
部分.data
表示可以覆盖节中的数据。如果缺少此标志,并且您正试图对节中的数据执行写入操作,则程序将崩溃SHF_WRITE
当然,可以通过一种方式操纵可执行文件,
.text
部分设置了SHF_WRITE
标志。(有些汇编程序允许直接为.text
部分设置此标志。)在这种情况下,如果您写入.text
部分,程序不会崩溃。文本部分可执行但不可写,数据部分可写但不可执行。某些操作系统无法执行“不执行”规则。。text
通常是只读的可执行文件.data
是读写的,不应该是可执行的,尽管有时(如您的情况)是可执行的。请注意,这些只是内置的默认属性。另请参见nasm手册。您的代码似乎过于复杂。使用慢速循环
指令,但在循环内将循环计数器重置为3
。您可以使用pushad
/popad
无原因地保存/恢复所有寄存器。只需使用jmp\u start
而不是loop
。或者,如果你想要一个非无限循环,请为计数器使用不同的寄存器。。这是我的教授,hahaYou可以通过链接gcc-zexecstack
获得可执行的.data
(以及堆栈和BSS)。ld
手册页文档ld-N
(又称ld--omagic
)授予文本段读写权限。(并且.text
部分链接到可执行文件的文本段)。
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: