2

我是组装的初学者,我很难让 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 从已经分配的位置开始分配内存?有没有办法告诉它从特定地址开始?如果我在做一些没有意义的事情,请纠正我。

4

1 回答 1

1

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

于 2014-04-05T04:12:56.253 回答