2014-04-05 1 views
0

저는 초보자이며, 원하는 방식으로 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는 이미 할당 된 위치부터 메모리를 할당합니까? 특정 주소에서 시작하도록 지시 할 수있는 방법이 있습니까? 제가 이치에 맞지 않는 일을하고 있다면 저를 시정하십시오.

답변

1

sbrk을 전달해야하는 단위는 바이트입니다. 3 정수는 3 * sizeof(int) 또는 (대부분의 아키텍처에서) 12

+0

내 문제를 해결해 주셔서 감사합니다. 나는 그것이 4 시간 이상 걸리는 것을 믿을 수 없다. 그리고 나는 아직도 그것을 이해할 수 없었다. :( – NigoroJr

관련 문제