Assembly 原因是什么;由信号11“终止的命令”;关于mov命令

Assembly 原因是什么;由信号11“终止的命令”;关于mov命令,assembly,nasm,Assembly,Nasm,我正在一个类的NASM项目中工作,当我试图将寄存器值移动到内存地址时,一直遇到一个问题。我有一个较长的文件,但下面的代码以相同的方式重新创建了情况和结果 section .text global _start _start: mov esi, x add esi, 2 mov [x], esi section .data x equ 2 运行此代码时(使用处的编译器),它返回“command terminated by signal 11”消息。问题似乎

我正在一个类的NASM项目中工作,当我试图将寄存器值移动到内存地址时,一直遇到一个问题。我有一个较长的文件,但下面的代码以相同的方式重新创建了情况和结果

section .text

global _start

_start:

    mov esi, x
    add esi, 2
    mov [x], esi

section .data
    x equ 2

运行此代码时(使用处的编译器),它返回“command terminated by signal 11”消息。问题似乎出现在“mov[x],esi”行中。有人能解释一下这个问题是什么,我怎样才能纠正它吗?粗略的谷歌搜索表明,这是因为我溢出了地址[x],但我不确定该如何处理该信息。

伪操作赋予符号
x
值2,因此mov指令试图写入地址2,这是大多数操作系统上受保护的内存地址

要将
x
定义为数据部分中的符号,请将其写为标签:

 x:
要在数据段中提供空间,请使用另一个保留空间的伪操作。例如,
dd
,它还允许您为空格指定值:

x: dd 2
这定义了一个值为2的dword(4字节)


解决此问题后,将出现另一个不同的故障,如中所述。

您认为执行
mov[x],esi
后会发生什么情况?另外:我建议避免使用在线汇编程序学习汇编。如果不在自己的系统上运行代码,调试就会困难得多。让自己使用Linux并从中学习。@fuz,指示的副本并不是真正的问题。故障在mov指令中。(但是,如果mov指令没有故障,那么您将在副本中遇到问题。)@prl那么。。。在极度疲劳的情况下不应该回答这个问题……这个问题可能仍然值得一读,因为在你修复了当前正在崩溃的程序之后,这将是一个问题。也就是说,您编写了
x eq 2
而不是
x dd 2
。您可能还希望将第一行更改为
movesi,[x]
以加载x的值而不是其地址。非常感谢您的回复。这些解决了问题,事情变得更有意义。非常感谢