我遇到写入已分配内存的问题。这是代码。
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”(核心倾销)这是波兰语,意味着内存访问违规。
答案 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)