2014-09-26 1 views
1

과제에 대해 이름 배열과 해당 이름의 나이를 나타내는 정수 배열이 제공됩니다 (기본적으로 사전 또는지도). 우리는 사용자로부터 문자열을 읽어야하고, 그 이름이 배열에 있으면 그 사람을 나이로 인쇄합니다. Heres는 지금까지 무엇을 :MIPS : 문자열 배열의 요소에 액세스하여 비교하기

.data 
names: .asciiz "steve","john","chelsea","julia","ryan" 
ages: .byte 20,25,22,21,23 
out1: .asciiz "Please enter a name:" 
out2: .asciiz "Age is: " 
notfound: .asciiz "Not found!" 
input: .asciiz 

.text 
li $v0, 4 
la $a0, out1 
syscall  #prompts user for name 

li $v0, 8 
la $a0, input 
li $a1, 20 
syscall  #Reads a name into address "input" 

CheckNames: #needs to compare the input string with each element of "names" array and return 1 if they match 
la $t0, (names) 
la $t1, (input) 
beq $t1, $t0, printAge 

printAge: 

내 CheckNames 기능이 잘못 실현,하지만 난 사용할 수 있기 때문에 각각의 이름이 (크기가 다른 경우 나는 이름의 배열을 반복하는 방법을 모른다

+0

이 답변보기 : http://stackoverflow.com/a/26045398/583570 – markgz

답변

1

오늘 나는이 문제에 직면했다. 그것이 여전히 당신 (또는 다른 사람들)에게 도움이된다면, Assembly에서의 .asciiz 데이터가 특별한 신호로 항상 끝나는 여러 가지 charactereres라는 사실을 이용하여이 문제를 극복했습니다 : NUL. 아스키의 아래 표는 도움이 ilustrate 수 : 모든 문자 정보의 8 비트 (1 바이트)를 채우고 마음에

ASCII Table

키핑, 당신은 문자열의 배열에 모든 바이트 통해 이동이 지식을 사용할 수 있으며 로드 바이트를 $ 0 레지스터 (또는 0과 동등한 데이터를 가진 레지스터)와 비교하여 각 세계의 끝을 식별합니다. 배열이 크고, 특수 경우 - 반복 될 수있는 매우 느린 :

move $a1, $s0 # $s0 register store the normal index of the string names(1), for example 
li $t0, 0 
li $t2, 0 # cont to know how many word did you pass 
li $t1, maxSpace # maxSpace is that maximum space in the array 
while ($t2<$t1) { 
    branch to "final", if $t1 == $a1 
    lb $t3, names($t0) 
    branch to "isnotNUL", if $t3 != $0 
    $t2 = $t2 + 1 
    $t0 = $t0 + 1 
    isnotNUL: 
    $t0 = $t0 + 1 
} 
# normal part of code to print a string .asciiz passing the start adress to $a0 
final: 
    li $v0, 4 
    la $a0, names($t0) 
    syscall 
    jr $ra 

이 방법으로 하나의 문제가 있습니다 :

의사 코드는 자신의 코드를 구성하기 위해 아래에 제시되어 문자열도 크다. 이 경우 귀하가 원하지 않는 경우 배열의 각 문자열에있는 바이트 수를 저장하고이 정보를 사용하여 LUT (Look Up Table)을 구성하도록 코드를 수정할 수 있습니다. 따라서 프로그램 시작시이 함수를 실행하면 정보를 인쇄 할 시간이되면 배열의 초기 주소를로드하고 LUT에 저장된 번호를 추가하여 시작하는 주소를 이미 알고 있습니다. .