【问题标题】:How does sbrk know what address to start allocation?sbrk 如何知道从哪个地址开始分配?
【发布时间】:2014-04-05 04:08:52
【问题描述】:

我是组装的初学者,我很难让 sbrk 以我想要的方式分配内存。我最终想创建一个二维数组,首先分配一列,然后遍历每一行,一次分配一行。但是,我注意到当我第二次使用 sbrk 时,它并没有从未使用的内存位置开始,而是覆盖了我已经分配的内存地址。所以为了找出我做错了什么,我决定暂时使用一维数组。

当我第一次使用时

li $a0, 3   # array of length 3
li $v0, 9
syscall

它分配内存块0x10040000。然后我将 3 个整数输入到我分配的这三个位置。之后,我再做一次 sbrk 只是为了看看它从哪个地址开始。当我这样做时,它分配0x10040004,覆盖我输入的整数之一。以下是我使用的代码。

# test with 1D array
# $s0 => length of array
# $s1 => address of first element in array
# $s2 => address of second sbrk

li $s0, 3

move $a0, $s0
li $v0, 9
syscall
move $s1, $v0

# use $t1 to go through array
move $t1, $s1

# read first int
li $v0, 5
syscall
sw $v0, ($t1)

addi $t1, $t1, 4

# read second int
li $v0, 5
syscall
sw $v0, ($t1)

addi $t1, $t1, 4

# read third int
li $v0, 5
syscall
sw $v0, ($t1)

# use sbrk for second time
li $a0, 5
li $v0, 9
syscall
move $s2, $v0

# exit
li $v0, 10
syscall

当这个程序结束时,$s1 = 0x10040000$s2 = 0x10040004

为什么 sbrk 从已经分配的位置开始分配内存?有没有办法告诉它从特定地址开始?如果我在做一些没有意义的事情,请纠正我。

【问题讨论】:

    标签: memory-management assembly mips sbrk


    【解决方案1】:

    您应该传递sbrk 的单位是字节。 3 个整数是 3 * sizeof(int) 或(在大多数架构上)12。

    【讨论】:

    • 非常感谢,这解决了我的问题。我不敢相信我花了 4 个多小时,但我仍然无法弄清楚...... :(
    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-05
    • 2020-10-23
    • 2014-07-15
    相关资源
    最近更新 更多