1

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

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”(核心转储)这是波兰语,意思是内存访问违规。

4

2 回答 2

2

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

movl total, %eax

在 Intel 语法中反汇编为:

8b042500000000   mov eax, [0x0]

你需要使用:

movl $total, %eax

它像这样反汇编:

b800000000       mov eax, 0x0

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

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

movl %esi, (%eax)

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

于 2013-04-09T21:09:34.067 回答
0

用。。。来代替

movl %esi, (%eax)
于 2013-04-09T21:09:36.947 回答