2016-12-16 2 views
-2

좋아, 그래서 사용자가 입력으로 정수 주어진 주어진 간단한 프로그램을 가지고 X, string.Works 괜찮 X 위치에서 문자를 찾으려고합니다 ,하지만 약간의 버그가 있습니다. 쉽게 볼 수있는 문자열 길이는 26이므로 사용자가 예를 들어 0을 입력하면 -> a는 인쇄되어야합니다. 그렇지만 나는 25보다 큰 수를 입력하면 (1 차 문자 위치 0에 있습니다.) 오류가 나타나지 않습니다. 예를 들어 40을 입력하면 결과 문자 E ... 누군가가 나를 도울 수 있습니까?문자열에서 N 번째 문자 찾기 및 MIPS32 어셈블러 인쇄

.text   
.globl main 
main: 
    li $s3,26 #string length 


    la $a0, str1 # Load and print string asking for integer 
    li $v0, 4 
    syscall 

    li $v0,5 
    syscall 
    add $s0 ,$v0, $zero #integer now in $s0 



    la $a1,str #address of string now is $a1 
    addu $a1,$a1,$s0 # $a1 = &str[x]. assumes x is in $s0 
    lbu $a0,($a1)  # read the character 
    li $v0,11 
    syscall   # and print it 







    li $v0,10 
    syscall  



.data 
str: .asciiz "abcdefghijklmnopqrstuvwzyz" 
str1: .asciiz "give an integer: " 
+1

문자열 주소를 추가하기 전에 정수 * 범위를 확인하십시오. –

+0

작동하지만 내 질문은 왜 이런 일이 ... 입력으로 문자열 길이보다 더 큰 숫자를주고 오류 메시지를받지 못하는 이유는 무엇입니까? –

+1

프로세서는 사용자가 지정한 모든 메모리 위치를 읽습니다 읽기 (바 접근 허가). '40'의 인덱스는'str1 : .asciiz '의 메모리에있는 * next * 문자열에서''e' '를 선택했습니다. 정수를 지정하십시오 : " –

답변

1

프로세서는 당신이 (바 액세스 권한을) 읽어에게 어떤 메모리 위치를 읽습니다 : As.Here 내 코드입니다. 입력 된 번호의 범위를 확인 40의 인덱스

str1: .asciiz "give an integer: " 

좋은 점에서 메모리에 다음 문자열에서 'e'을 골라 갖는다. 어셈블리 언어에는 더 높은 레버 언어가 갖는 안전 장치가 전혀 없습니다. 하드웨어에 구현 된 메모리 액세스 제약 만 있습니다.

편집 :프로세서에서 다른 붙박이 안전 장치가 있지만 그들은 "언어"지향하지 않습니다. 프로세서에는 워치 독이있을 수 있으며, 프로그래머가 의도하지 않은 프로그램이 멈추지 않도록 규칙적으로 실행해야합니다. 0으로 나누기은 다른 것입니다. 그러나 프로세서의 반응은 잔인하며 프로그램의 논리 흐름에 전혀 도움이되지 않습니다.

일반적으로 어셈블리 프로그램이 처리하는 오류는 asembler 자체에서 가져온 오류와 프로그램에 코딩 한 오류입니다. 따라서 범위를 벗어난 색인에 대한 오류를 원한다면 그것은 당신의 일입니다.

상위 수준 언어가 발전한 이유는 다음과 같습니다.

관련 문제