2011-09-28 4 views
5

나는 syscall 기능이있는 SPIMS 또는 MARS와 같은 것을 사용하고 있습니다.문자열의 한 문자에 액세스

나는 문자열에 읽고있다 (나는 그것을 밖으로 인쇄 할 수 있기 때문에 그것은 작동) 다음과 같이

li $v0, 8 
la $a0, string 
li $a1, 256 
syscall 

을하지만, 내가 문자열의 단일 문자를 액세스하는 문제가 있습니다. 내가 첫 번째 문자를 액세스하고 인쇄 할 경우 그래서, 나는이 노력하고 있어요 :

la $t0, string 
lb $a0, ($t0) 
li $v0, 4 
sys call 

나는 이런 식으로 뭔가하려고하면 :

la $a0, string 
li $v0, 4 
syscall 

이가에 문자열 점으로 전체 문자열을 출력을 전체 문자열.

la $a0, string 
lb $a0, ($t0) 
li $v0, 4 
syscall 

그것은 나에게 바운드 부족 오류를 제공합니다 : 내가 좋아하는 뭔가를하려고하면

. 나는 왜 그런지 이해하지 못한다. 하나의 문자가 바이트가 아니며 $ a0에 문자열의 첫 번째 바이트를로드한다.

, 당신

답변

10

당신이 사용하고있는 해당 서비스 사를 볼 수있는 MARS의 콜 기능을위한 documentation 보면 감사 $a0는 "인쇄 null로 끝나는 문자열의 [] 주소"가 될 것으로 기대하고, 보고있는 동작을 설명합니다.

원하는 것은 저수준 바이트를 문자로 인쇄하는 기능 11 "인쇄 문자"입니다. 즉, 다음은 작동해야합니다 (테스트되지 않음).

la $t0, string 
lb $a0, ($t0) 
li $v0, 11 
syscall 
+3

IM LI를 실행하기 전에 항상 레지스터 값을 재설정해야합니다. 상반부 단어가 무엇을 가지고 있는지 알 수 없습니다. – m0skit0

+4

'LI'는 어셈블러가 대개'ORI $ rd, $ zero, low16bits'와'LUI $ rd, hi16bits'로 확장되는 의사 연산입니다. 대상 레지스터의 전체 32 비트는 'LI'명령 다음에 올바르게 설정되므로 'LI'전에 수동으로 레지스터를 재설정 할 필요가 없습니다. – markgz

+0

당신이 틀림없이 맞습니다. – m0skit0

관련 문제