Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 在节数据中存储reg到var时出现SEGFULT_Assembly_X86_Segmentation Fault_Nasm_Sections - Fatal编程技术网

Assembly 在节数据中存储reg到var时出现SEGFULT

Assembly 在节数据中存储reg到var时出现SEGFULT,assembly,x86,segmentation-fault,nasm,sections,Assembly,X86,Segmentation Fault,Nasm,Sections,所以我试图用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。 我遇到的问题是,每当我尝试移动到内存中的位置时,它

所以我试图用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。
我遇到的问题是,每当我尝试移动到内存中的位置时,它都会出错,您使用的是哪种系统/对象格式?我猜您正在Linux或Unix上使用ELF,因为这可以解释您的问题:

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


将您的代码更改为使用
.data
.text
作为节名,它应该可以工作。

为什么要
推送
弹出
来加载
eax
?尝试以下方法:
mov eax,4
。使用push和pop加载到eax是因为这是编译器的一部分,用于计算子表达式的字符串模板可能会用它们的计算值践踏注册表这实际上只是int i=4的编译形式;如果我使用move将4加载到EAX中,尽管你无论如何都要丢弃寄存器(而不是注册表)EAX,segfault仍然会发生。我理解这一点。问题是,如果你有
inti=(5+(7*8))这被转换成一个ast格式
^((VAR_DECL int i)^(+5^(*7 8))
。正在构建的编译器不允许进行任何优化,因此,当它作为字符串模板输出时,它会通过ast表达式进行递归,从下到上进行计算。如果您问为什么它会出现错误,我将尝试帮助您简化代码,以便您可以找到问题。你显示的代码真的崩溃了吗?谢谢,这就是问题所在。