2012-03-30 2 views
0

자, 기본적으로 내가 가지고있는 문제는 이것입니다.동적 메모리를 사용하여 MIPS에 문자열을 저장할 수 있습니까?

구조체를 동적으로 저장하는 MIPS 프로그램을 작성하도록 지정되었습니다.

기본적으로 ID, 연도, 제목 및 설명이 저장됩니다. 이진 검색 트리를 사용하여 저장해야합니다.

C++로 스택을 코딩 한 적이 있다면, 내가 무슨 말을하는지 알 것입니다. ID와 제목을 메모리에 동적으로 저장했습니다. 하지만 사용자가 입력 한 문자열을 저장하는 데 문제가 있습니다.

:

이 복잡한 문제이며 다음은이 :

좀 도와 수 있을지는 소품 있도록 온라인으로 찾을 수있게되었습니다 많은 정보가 아니라 내 메모리 설정입니다

$ S5 - 상점 루트 노드

$ S7 - (필요 없음) 나무의 크기는

각 새 항목은 344 바이트의 덩어리가 들어 상점

,536 91,363,210

바이트 같은 설치 위치 :

8 바이트 - [ID]

8 바이트 - [년]

64 바이트 - [TITLE]

256 바이트 - [설명]

8 바이트 - [LastNodeAddress]

8 바이트 - [NextNodeAddress]

0,123,516

여기에 코드 그리고 당신은 문제가 나타날 수 있습니다

li $v0, 9   #allocate memory for new record 
li $a0, 344   #enough memory for 2 addresses and all the data 
syscall 


move $s0, $v0   #hang onto the initial address of all our info 

li $v0, 4   #prompt for ID 
la $a0, addid 
syscall 

li $v0, 5   #enter integer 
syscall 

sw $v0, 0($s0)   #store our ID into memory Offset: 0 

li $v0, 4   #prompt for add year 
la $a0, addyear 
syscall 

li $v0, 5   #enter integer 
syscall 

sw $v0, 4($s0)   #store year into our memory Offset: 4 

li $v0, 4   #prompt for add title 
la $a0, addtitle 
syscall 

li $v0, 8   #read title into titlebuffer 
la $a0, titlebuffer 
li $a1, 64 
syscall 

sw $a0, 8($s0)   #store title into our memory Offset: 8 

li $v0, 4   #prompt for add description 
la $a0, adddescription 
syscall 

li $v0, 8   #read from input into descriptionbuffer 
la $a0, descriptionbuffer 
li $a1, 256 
syscall 

sw $a0, 72($s0)   #store description into our memory Offset: 72 

bne $s7, 0, setlocations #if this isn't root node let's set the locations 

add $s7, $s7, 1   #add 1 to the size of the records 

move $s5, $s0   #store this address as root node for now 

문제가 저장되는 것 모두가 버퍼의 주소인지입니다.

.data 
titlebuffer: .space 64 
descriptionbuffer: .space 256 

은 내가 끝낼 것은 내가 , 할당 된 메모리에 저장 바로 주소를 내가 어떻게 할당 된 메모리에 문자열을 저장하는 아무 생각이 : 버퍼는이처럼 내 데이터 섹션에 정의되어 있습니다.

도움이 될 것입니다. :)

+0

여기 그것입니다 : D : D : D : D : D 선생님이 내가 놓친 믿을 수 없어 어떻게하는지 보여 주었다 대신 라 $ A0의 descriptionbuffer 대신 라 $ A0의 , XX titlebuffer 사용 : 라 $ a0, 8 ($ s0) 라 $ a0, 72 ($ s0) 동일한 것을 인쇄하십시오! :) 호프가 도움이되기를 바랍니다. – user1274820

답변

2

원래 질문에서 보여준 것처럼 프로그램 시작시 메모리 정의가 필요하지 않습니다.

대신 할당하고 값을 동적 메모리의 올바른 오프셋으로 읽으십시오.대신 la $a0, descriptionbuffer

대신 la $a0, titlebuffer

사용 :

la $a0, 8($s0)

다음

la $a0, 72($s0)

내가 move $s0, $v0를 사용 $s0에 메모리 주소를 이동하고 int로 값을 읽어 올바른 오프셋.

같은 것을 인쇄하십시오!

li $v0, 9   #allocate memory for new record 
li $a0, 344   #enough memory for 2 addresses and all the data 
syscall 

move $s0, $v0   #hang onto the initial address of all our info 

li $v0, 8   #read our title into the allocated space 
la $a0, 8($s0)   #Offset: 8 
li $a1, 64 
syscall 

li $v0, 8   #read our description into the allocated space 
la $a0, 72($s0)   #Offset: 72 
li $a1, 256 
syscall 

또한, 여기에 최종 솔루션을 찾을 수 있습니다 : 여기

는 작업 코드 https://stackoverflow.com/a/9953839/1274820

편집 : 음, 10K 전망 후에, 나는 그래서 여기에 더 많은 정보를 추가하기로 결정 당신은 나중에 코드를 통해 검색 할 필요가 없습니다

다음은 4 가지 데이터 조각을 메모리에 저장하는 전체 코드입니다 :

li $v0, 9   #allocate memory for new record 
li $a0, 344   #[334 = how much memory - in bytes] 
syscall 

move $s0, $v0  #store the address of our allocated memory in $s0 

li $v0, 5   #enter integer 
syscall 
sw $v0, 0($s0)  #store our ID into memory Offset: 0 

li $v0, 5   #enter integer 
syscall 
sw $v0, 4($s0)  #store year into our memory Offset: 4 

li $v0, 8   #read our title into the allocated space 
la $a0, 8($s0)  #Offset: 8 
li $a1, 64 
syscall 

li $v0, 8   #read our description into the allocated space 
la $a0, 72($s0)  #Offset: 72 
li $a1, 256 
syscall 

ID, 연도, 제목 및 설명을 저장합니다. 오프셋은 동적 메모리에 데이터를 저장하는 위치입니다.

I (위처럼) 334 바이트의 블럭이 있는지 상상해 [ 334 ]

우리는 ID 정수 (4 바이트 데이터)를 저장하기에 이런 오프셋 0 :

[(ID) 330 ]

그런 다음 그 옆에 년을 오프셋 4에 저장합니다.

[(ID)(YR) 326 ]

등등 ...

그것을 인쇄하려면, 그것은 다음과 같이 수행합니다 나는 솔루션 !!!!!!!!을 알아 낸

li $v0, 1   #Print the ID stored at $s0  [Offset: 0] 
lw $a0, 0($s0) 
syscall 
li $v0, 1   #Print the Year stored at $s0 [Offset: 4] 
lw $a0, 4($s0) 
syscall 
li $v0, 4   #Print the Title stored at $s0 [Offset: 8] 
la $a0, 8($s0) 
syscall 
li $v0, 4   #Print descript stored at $s0 [Offset: 72] 
la $a0, 72($s0) 
syscall