【发布时间】:2018-04-03 22:38:40
【问题描述】:
2 个问题(同一主题):
一些例子:
假设我在 assembly(GCC 编译)中有类似的东西:
movl 12 -4(%rbp)
当我将地址 -4(%rbp) 提供给另一条指令时,系统将如何知道在哪里停止?因为 -4(%rbp) 是起始地址,但我们没有任何关于停靠点的信息,所以它可能是 2x2bytes 而不是 4bytes。
我的第二个问题有点相同,但是堆,考虑到我使用的是sbrk:
当我调用 sbrk(0) 时,它会给出堆中 break 的地址。
假设我使用sbrk(20)然后sbrk(40)将移动中断,现在我正在尝试访问sbrk(20)分配的空间,与程序集相同,系统如何知道何时停止而不是sbrk(40) 空间溢出?
也许这有点令人困惑,如果您希望我进一步发展,请告诉我。
【问题讨论】:
-
地址引用的数据的大小可以从上下文中知道(例如,如果您将整数的地址传递给函数,该函数知道整数始终是四个字节),或者您必须通过地址传递大小。与许多事情一样,随着经验的增加,这一点变得越来越明显。
-
请一次回答一个问题。
-
第二个问题:系统什么都不知道。如果溢出它就会溢出。
-
2x2bytes 和 4bytes 有什么区别?
-
每条指令都有一个您(作为 asm 程序员)选择的操作数大小。这意味着内存操作数的大小。不碰未映射的内存由你决定。
标签: c assembly memory heap-memory sbrk