在汇编中写入.long

时间:2013-04-09 21:07:05

标签: assembly x86 att mov

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

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 

为什么不能正常工作?它给出了:“Naruszenieochronypamięci”(核心倾销)这是波兰语,意味着内存访问违规。

2 个答案:

答案 0 :(得分:2)

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

movl total, %eax

在英特尔语法中反汇编为:

8b042500000000   mov eax, [0x0]

你需要使用:

movl $total, %eax

以这样的方式反汇编:

b800000000       mov eax, 0x0

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

然后,如果您解决了上述问题,您仍然需要修复最后一条指令的括号,如Seva和Harold所述。它应该是这样的:

movl %esi, (%eax)

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

答案 1 :(得分:0)

替换为

movl %esi, (%eax)