【问题标题】:Writing into .long in assembly在汇编中写入 .long
【发布时间】:2013-04-09 21:07:05
【问题描述】:

我在写入分配的内存时遇到问题。这是代码。

total: .long 1       # my memory

movl total, %eax     # I believe I'm copying address of total into eax
movl $53, %esi       # set some value in esi
movl (%esi), %eax    # and put this value into total 

为什么它不起作用?它给出:“Naruszenie ochrony pamięci”(核心转储)这是波兰语,意思是内存访问违规。

【问题讨论】:

  • 括号里的东西是错的。
  • 听起来大学里的组装课程又开始了……

标签: assembly x86 att mov


【解决方案1】:

首先,在 AT&T 语法中,将标签的地址存储到寄存器中,而不是

movl total, %eax

在 Intel 语法中反汇编为:

8b042500000000   mov eax, [0x0]

你需要使用:

movl $total, %eax

反汇编如下:

b800000000       mov eax, 0x0

从这个意义上说,当使用 AT&T 语法时,必须非常小心以避免错误。

那么,如果你修复了上述问题,你仍然需要修复最后一条指令的括号,正如 Seva 和 harold 所提到的。应该是这样的:

movl %esi, (%eax)

代码会导致分段错误,因为它访问您无权访问的内存区域。在保护模式下,您无法访问您希望访问的任何内存地址,您需要对该内存区域具有读/写/执行权限。

【讨论】:

  • 那么,还有其他方法可以将一些数据存储在内存中吗?我不能改变总数?
  • 您可以执行以下一些操作来将一些数据存储在内存中:1. 在代码的data 部分保留内存,或 2. 使用堆栈存储局部变量,或 3. 请求来自你的操作系统的内存块(例如malloc)。
  • @Kmaczek 但无论如何它与gas 组装在一起没有任何警告:)
【解决方案2】:

替换为

movl %esi, (%eax)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 2017-05-18
    • 2016-11-11
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多