写入内存地址

时间:2014-10-25 12:01:12

标签: assembly x86 gas

以下编译没有任何障碍:

movl %eax, 16

和segfaults替换为16的值。

我相信我读到现代系统不允许进程写入内存地址。我记得没错吗? 如果是这样,为什么这种语法在GAS中仍然存在? 如果没有,我的错误在哪里,我怎么能让这一行不是段错?

谢谢!

编辑:如果这是Kerrek SB评论的原因,这是GNU程序集(AT& T)语法。

1 个答案:

答案 0 :(得分:4)

该指令“移动”(实际上是复制)32位(l长)值到内存地址16.在现代操作系统上,该地址不可写(它可能是可读的,你可以尝试),所以你得到分段错误。

要写入内存,您需要一个可写地址,例如变量的地址。您可以使用变量名称指定它(检查汇编程序和编译器文档的确切语法),而不是通过提供绝对文字地址。它可以使用文字地址,你只是不能轻易知道它是什么,所以你不能写它。

因此,在现代操作系统中,写入内存可以并且一直在完成,这是大多数程序花费大部分实际CPU时间所做的事情。您只需要一个允许进程写入的地址。