Memory NASM中简单移动寄存器到内存的SIGSEGV

Memory NASM中简单移动寄存器到内存的SIGSEGV,memory,segmentation-fault,nasm,cpu-registers,mov,Memory,Segmentation Fault,Nasm,Cpu Registers,Mov,我一定错过了一些非常基本的东西。搜索过,但找不到这个问题的答案。以下是我的NASM代码: %include "io64.inc" section .text myvar db "This is not working", 0 global CMAIN CMAIN: mov rbp, rsp; for correct debugging ;write your code here xor rax, rax mov [

我一定错过了一些非常基本的东西。搜索过,但找不到这个问题的答案。以下是我的NASM代码:

%include "io64.inc"

section .text
    myvar db "This is not working", 0
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
    ;write your code here
    xor rax, rax
    mov [myvar], rax
    ret
它在带有SIGSEGV的rax
move[myvar]行上崩溃。我只是想在那个地址存储一些零

谢谢

PS:在64位Windows 10上,使用SASM生成/运行/调试并勾选64位选项(否则为默认设置)


.text
是一个没有写入权限的可执行节。这样做是为了防止某些类型的漏洞。您应该将
myvar
放入一个可写部分,例如
.data
(如果变量应该在整个程序执行期间都有效),将变量放在堆栈上(如果它不应该超过创建它的函数),或者将
.text
更改为可写(出于安全原因不推荐,但)。

是的,谢谢Ruslan!我注意到一件事(我花了一段时间才弄明白)就是
.data
部分必须在末尾。如果我在
.text
部分之后和实际代码之前有
.data
部分,它仍然会崩溃。如果我将
.data
部分移到程序的末尾,它会工作。我相信会有一个解释。不管怎样,非常感谢!@Gec:你可以把<代码>section.data
首先,然后是您想要的数据,然后更改为
section.text
,这样应该可以工作。实际代码之前的最后一个
section
指令需要激活文本部分。
section .text
   myvar db "This is not working", 0