【发布时间】:2019-06-21 19:14:32
【问题描述】:
我想知道数据部分和文本部分在特定部分的整个代码方面有什么区别。
我试图运行我在此处添加的代码。 在数据部分中,它运行并打印“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:
预期的代码会产生相同的结果,但事实证明并非如此。
【问题讨论】:
-
文本段可执行但不可写,数据段可写但不可执行。某些操作系统无法强制执行“不执行”规则。
-
.text通常是只读的、可执行的。.data是读写的,不应该是可执行的,尽管有时(如你的情况)它是可执行的。请注意,这些只是内置的默认属性。另请参阅 nasm 手册中的 7.9.2 elf Extensions to the SECTION Directive。 -
您的代码似乎过于复杂。您使用慢速
loop指令,但在循环内将循环计数器重置为3。并且您无缘无故地使用pushad/popad保存/恢复所有寄存器。只需使用jmp _start而不是loop。或者,如果您想要一个非无限循环,请为计数器使用不同的寄存器。 -
要是我有发言权就好了..这是我教授的怪脑袋哈哈