【问题标题】:What is causing "Command terminated by signal 11" on mov command是什么导致 mov 命令上的“命令由信号 11 终止”
【发布时间】:2020-04-24 23:26:26
【问题描述】:

我正在为一个类开发一个 NASM 项目,当我尝试将寄存器值移动到内存地址时,我一直遇到问题。我有一个更长的文件,但下面的代码重新创建了相同的情况和结果

section .text

global _start

_start:

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

section .data
    x equ 2

运行此代码时(使用https://www.jdoodle.com/compile-assembler-nasm-online/ 的编译器),它会返回“命令由信号11 终止”消息。问题似乎出在“mov [x],esi”行。有人可以解释这个问题是什么,我该如何纠正它?粗略的谷歌搜索表明这是因为我溢出了地址 [x],但我不确定如何处理该信息。

【问题讨论】:

  • 你认为mov [x], esi被执行后会发生什么?
  • 另外:我建议避免使用在线汇编器来学习汇编。如果您不在自己的系统上运行代码,调试会困难得多。让自己获得 Linux 并从中学习。
  • @fuz,指示的重复并不是真正的问题。问题出在 mov 指令中。 (但是,如果 mov 指令没有出错,那么您将在副本中遇到问题。)
  • @prl 那么...不应该在累死的时候回答问题...
  • former duplicate 可能仍然值得一读,因为在修复当前导致程序崩溃的问题后,这将成为问题。你写的是x equ 2而不是x dd 2

标签: assembly nasm


【解决方案1】:

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

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

 x:

要在数据部分提供空间,请使用不同的预留空间的伪操作。例如,dd,它还允许您为空间赋值:

x: dd 2

这定义了一个值为 2 的双字(4 个字节)。

一旦你解决了这个问题,你会遇到另一个不同的错误,如What happens if there is no exit system call in an assembly program?中所述。

【讨论】:

  • 您可能还想将第一行更改为 mov esi, [x] 以加载 x 的值而不是其地址。
  • 非常感谢您的回复。这些解决了问题,事情变得更有意义了。非常感谢
猜你喜欢
  • 1970-01-01
  • 2017-06-23
  • 2018-11-06
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多