2012-10-03 3 views
0

문자의 ascii 값을 표시 할 수있는 프로그램을 만들려고합니다. 문제는 실제 ascii 값을 표시하지 않는다는 것입니다. 나는 MIPS 어셈블리에서이 코드를 만들고 있는데 이것은 보통의 어셈블리 언어와 매우 비슷하다. 다음은 코드입니다.문자의 Ascii 값 표시

.data 

User: .asciiz "Bush" 
Line: .asciiz "\n" 
Address: .word User 

.text 

main: 
li $t0,1 
li $t1,2 
li $t2,3 
li $t3,4 
li $t4,5 

lb $a0,User($0) 
li $v0,1 
syscall 

la $a0,Line 
li $v0,4 
syscall 

lb $a0,User($t0) 
li $v0,1 
syscall 

la $a0,Line 
li $v0,4 
syscall 

lb $a0,User($t1) 

li $v0,1 
syscall 

la $a0,Line 
li $v0,4 
syscall 

lb $a0,User($t2) 

li $v0,1 
syscall 

la $a0,Line 
li $v0,4 
syscall 

lb $a0,User($t3) 

li $v0,1 
syscall 

la $a0,Line 
li $v0,4 
syscall 

li $t1,-1 
jal Length 

j Exit 

Length: 

beq $a0,0,End 
addi $t1,$t1,1 
lb $a0,User($t1) 
j Length 

End: 
move $a0,$t1 
li $v0,1 
syscall 

jr $ra 

Exit: 
li $v0,10 
syscall 

실제 ASCII 값이 표시되지 않는 이유는 무엇입니까? 또한 모든 영어 알파벳의 ascii 값을 찾는 프로그램을 만들려고 할 때 실행 시간 오류가 발생합니다.이 중 하나가 도움이 될 수 있다면 큰 도움이 될 것입니다.

감사합니다.

답변

0

무엇을 기대하고 있으며 현재 무엇을하고 있습니까? 여기에 나에 대한 출력입니다 :

66 
117 
115 
104 
0 
4 

당신은 표시 할 실제 문자를 원하는 print character vectorsyscall, 벡터 (11) 대신 1을 사용하는 경우 :

B 
u 
s 
h 

4 

lb $a0,User($0) 
li $v0,1 
syscall 

User의 주소에서 1 바이트를로드하여 $a0에 넣습니다. 그런 다음 해당 값 을 정수으로 인쇄합니다. User의 값은 ASCII 문자 'B'의 값인 66이므로 66을 인쇄합니다. 올바르지 않습니까?

la $a0,Line 
li $v0,4 
syscall 

이것은 $a0Line의 주소를두고 한 다음 해당 주소에 저장된 문자열을 출력합니다. 이 경우 줄 바꿈 문자열이므로 줄 바꿈이 인쇄됩니다. 이 말이 맞습니다. 이제,이 경우 1 $t0 오프셋 어드레스를 가질 제외

lb $a0,User($t0) 
li $v0,1 
syscall 

이것은는 'B'후 바이트를로드 즉, 첫 번째 블록과 거의 동일합니다 ("U"). 'u'의 ASCII 값은 117이며 그 값이 인쇄됩니다. 이게 맞지 않아?

"Bush"의 처음 다섯 글자에 대해 계속됩니다. (문자열은 0 값으로 null로 끝났음을 기억하십시오) 올바른 값이 인쇄 된 것처럼 보이므로 잘못된 점을 알려주십시오 .

Length 루틴에 버그가 있습니다. 첫 번째 문자는 User이 아니고 Length입니다.

addi $t1,$t1,1 
lb $a0,User($t1) 
beq $a0,0,End 
j Length 
알파벳 물건에 관해서는

는, 별도의 질문을 입력하고 문제의 충분히 상세하게 제공 : 같은 순서를 변경하면 시도 무엇을, 그것을 할 무엇을, 어떤이는로 가정된다 그렇게해라.$ S1 = "0"= 48 결과는 0x30 = 0 가 ASCII 확인

0

$ S1은

li $v0, 11  #print character 
    move $a0, $s1 
    syscall 

예 레지스터 $의 S1에서의 문자의 ASCII 값

쇼 레지스터 $ s1에서 십진수로의 값

li $v0, 1 
move $a0, $s1 
syscall 

예 : $ s1 = "0"= 0x30 = 48 결과 : 48

+0

서식을 개선하십시오. 모든 것은 코드 형식으로되어 있지만 코드처럼 보이지는 않습니다 (예 : "레지스터 $ s1의 캐릭터보기" – Alexander

관련 문제