【问题标题】:How the system know the end of data segment系统如何知道数据段的结束
【发布时间】: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) 空间溢出?

也许这有点令人困惑,如果您希望我进一步发展,请告诉我。

【问题讨论】:

  • 地址引用的数据的大小可以从上下文中知道(例如,如果您将整数的地址传递给函数,该函数知道整数始终是四个字节),或者您必须通过地址传递大小。与许多事情一样,随着经验的增加,这一点变得越来越明显。
  • 请一次回答一个问题。
  • 第二个问题:系统什么都不知道。如果溢出它就会溢出。
  • 2x2bytes4bytes 有什么区别?
  • 每条指令都有一个您(作为 asm 程序员)选择的操作数大小。这意味着内存操作数的大小。不碰未映射的内存由你决定。

标签: c assembly memory heap-memory sbrk


【解决方案1】:

movl 的 'l' 表示 long(32 位整数,64 位浮点数)。 最后一个字母定义了大小(在气体语法中)。 维基:https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 2011-06-07
    • 2019-11-07
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多