簡體   English   中英

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

[英]How does sbrk know what address to start allocation?

我是匯編的初學者,我很難讓sbrk以我想要的方式分配內存。 我最終想要創建2D數組,首先分配一列,然后遍歷每一行,一次分配一行。 但是,我注意到,當我第二次使用sbrk時,它不是從未使用的內存位置開始的,而是會覆蓋我已經分配的內存地址。 因此,要找出我做錯了什么,我決定暫時使用一維數組。

當我第一次使用

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

它分配內存塊0x10040000 然后,我向分配的這三個位置輸入3個整數。 在那之后,我又做了一個步驟,只是看它從什么地址開始。 當我這樣做時,它將分配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從已經分配的位置開始分配內存? 有什么辦法告訴它從特定地址開始? 如果我做的事情沒有意義,請糾正我。

您應該通過sbrk傳遞的單位是字節。 3個整數是3 * sizeof(int)或(在大多數體系結構上)12。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM