sbrk如何知道开始分配的地址?

时间:2014-04-05 04:08:52

标签: memory-management assembly mips sbrk

我是大会的初学者,我很难让sbrk以我想要的方式分配内存。我最终想要创建一个2D数组,首先分配一列,然后遍历每一行,一次分配一行。但是,我注意到当我第二次使用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从已经分配的位置开始分配内存?有没有办法告诉它从特定地址开始?如果我做了一些没有意义的事情,请纠正我。

1 个答案:

答案 0 :(得分:1)

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