将reg移至var时的Segfault x86代码

时间:2014-09-27 22:34:33

标签: x86 segmentation-fault

所以我试图用x86编写一些代码,而我似乎无法将寄存器的内容移到内存中的某个位置。

代码就是这个

global  main

SECTION .DATA
  var_i: DD  0

SECTION .TEXT
    main:
      push  DWORD 4
      pop   EAX
      mov   [var_i], EAX

    mov   EAX,  0
    ret

我在代码上使用nasm和gcc。 我遇到的问题是,每当我尝试移动到内存中时,它就会出现段错误

1 个答案:

答案 0 :(得分:2)

您使用的是哪种系统/对象格式?我猜你在Linux或Unix上使用ELF,因为这可以解释你的问题:

ELF中的部分名称区分大小写,并且大多数基于ELF的操作系统的特殊部分.text.data都被理解,但您的部分.TEXT和{{1没有任何意义。因此,他们只是在其他部分之后陷入可执行文件并获得相同的访问权限。如果您只是链接上面的代码,那么它将位于.DATA部分之后,因此它将是可执行的并且是只读的。因此,当您尝试写入变量时,会出现段错误。

将您的代码更改为使用.fini.data作为部分名称,它应该有效。