Assembly 原因是什么;由信号11“终止的命令”;关于mov命令
我正在一个类的NASM项目中工作,当我试图将寄存器值移动到内存地址时,一直遇到一个问题。我有一个较长的文件,但下面的代码以相同的方式重新创建了情况和结果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”消息。问题似乎
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的值而不是其地址。非常感谢您的回复。这些解决了问题,事情变得更有意义。非常感谢