저는 초보자이며, 원하는 방식으로 sbrk에 메모리를 할당하는 데 어려움을 겪고 있습니다. 궁극적으로는 먼저 한 열을 할당 한 다음 각 행을 거쳐 한 번에 한 행을 할당하여 2D 배열을 만들고 싶습니다. 그러나 두 번째로 sbrk를 사용하면 사용하지 않은 메모리 위치에서 시작하지만 이미 할당 한 메모리 주소를 덮어 쓰지 않는 것으로 나타났습니다. 그래서 제가 잘못하고있는 것을 발견하기 위해, 저는 지금 1D 배열을 사용하기로 결정했습니다. I 먼저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 시간 이상 걸리는 것을 믿을 수 없다. 그리고 나는 아직도 그것을 이해할 수 없었다. :( – NigoroJr