2016-11-24 3 views
0

나는 특별한 제한없이 여러 문자를 읽지 만 Enter 키를 눌러 프로그램을 만들고 싶다. (Enter 키의 아스키 코드가 13이라는 것을 발견했다. 'm 잘못)와 종류의 "스티치".어셈블리 MIPS : 함께 syscall 12 서비스에 의해 주어진 sticking 문자

예를 들어, 사용자가 '3', '4', '5'문자를 입력하면 프로그램은 정수 '345'를 표시해야합니다. 따라서 각 문자는 약간 일치해야합니다. 때문에 "매장 바이트"에 :

.text 
.globl main 
main: 

add $t0, $zero, $zero  #counter 

loop: 
    li $v0, 12   #v0 = the character that was read 
    syscall 
    subi $v0, $v0, 48   

#from the register column, I found that after the syscalls, the v0 
#register always adds 48 to the given character 

    beq $v0, 13, exit  #if Enter is given, exit from the loop 

    move $t1, $v0 #move the character to t1 

    sb $t1, ($t0)  #store the character to t0 

    addiu $t0, $t0, 1  #point to the next spot of the t0 

j loop 
exit: 

add $a0, $t0, $zero   #load the contents of t0 to a0 

li $v0, 1    #print the result 
syscall 

li $v0, 10 
syscall 

내 awkardly 작성된 코드를 보여줍니다 오류는 "주소 범위를 0x00000000에서 런타임 예외 0x00400020에서"

나는 다음과 같이 루프로 재생하려고 명령.

오프셋을 주어야합니까?

"저장소 바이트"전체가 근본적으로 잘못 되었습니까?

given_character-48은 매번 필요합니까?

어떻게해야합니까?

+0

난 네이티브 큰 정수를 다루는 방법에 대해서는 아무것도 대답하지 않았습니다. 현재의 어셈블리 기술 IMO에서는 너무 복잡해 보입니다. 그래서 나는 당신을 "문자열"해결책으로 밀어 넣을 것이지만, 아마도 그것이 당신이 기대했던 것이 아닙니다. – Ped7g

+0

BTW, 왜 '3', '4', '5'입력이 출력시 '347'을 생성해야하는지 파악할 수 없습니다. 귀하의 질문에서 명확하지 않은 것은 입력 값으로 어떤 계산을하고 싶은지 ... 그래서 오타라고 생각합니다. – Ped7g

+0

정말 오타입니다 – Coursal

답변

0

이 코드에 몇 가지 문제가 있고 당신이 일을 이해 어떻게 하나입니다 :이 값 0-9'0' - '9' 문자에서 ASCII 숫자를 변환합니다

subi $v0, $v0, 48 

, 나중에 계산을위한 숫자로 사용할 수 있도록 .

문자열로 "함께 결합"하고 싶으므로 ASCII 문자를 숫자로 변환하지 않고 그대로 유지하십시오.


다른 하나는 다음

sb $t1, ($t0) 

t1 레지스터로부터 값을 취하고, 연락처와 메모리 칩 명령 "주소 t0 그것을 기록". 그러나 t0은 0이고, 메모리 주소 0x00000000은 쓰기 위해 사용할 수 없습니다.

컴퓨터 데이터를 임의의 크기로 유지할 수 없기 때문에 메모리 크기가 한정되어 있으므로 저장할 최대 문자열을 결정해야합니다 (압축되지 않은 형식으로 유지하기 때문에 예약 된 바이트 수는 문자열은 ASCII 문자의 동일한 양에서 1을 뺀 문자열을 직접 제한하고, 마지막 하나는 문자열의 null 종결자를위한 것입니다.

(데이터 세그먼트에서) 결과에 대한 메모리 버퍼를 할당하고 la $t0,result_buffer을 먼저 수행하십시오.

마지막 문자 다음 (또는 예약 된 공간이 부족한 후에 올바른 안전한 응용 프로그램을 만들려면 입력 된 문자열의 최대 길이를 확인하는 카운터가 있어야합니다.) 한 바이트 더 뒤에 저장하십시오. 결과적으로 널 종결 문자열을 갖게됩니다.


그리고 한 기능 li $v0, 4 함께 출력 할 수있다 (그리고 다시 a0 result_buffer의 주소를 포함한다). 1은 정수를 출력하기위한 것으로 입력으로부터 정수를 생성하지 않습니다.당신이 [자신의 네이티브가 아닌 긴 정수 지원을 코딩없이 다음 입력의 정수를 구축하려면


당신은 그래서 당신이 입력하는 동안 약간의 여분의 레지스터에 저장할 수 있습니다 (32B)의 정수 (제한됩니다 메모리에 공간을 예약 할 필요가 없으므로 모든 단계에서 result = 10 * result + input을 수행하십시오. 따라서 최대 숫자 2 -1 ("정수 인쇄"가 부호있는 숫자에 작동하는 경우)를 입력 할 수 있습니다.


편집 : 그리고 물론 SPIM의/MARS가 내장 된 디버거를, 당신이 실제로 무엇을하고 있는지 확인하기 위해 코드를 통해 명령에 의해 단계의 명령이 있어야합니다. 그 오류 메시지에서 0x00000000에 쓰고 있다는 것을 깨닫지 못했다면, 디버깅하고 t0 = 0이라는 sb을보고있는 것이 아마 벨을 울리지 않을 것입니다.

그래도 적어도 시도해야합니다. 더 빨리 디버거를 이해하고 디버거가 어떻게 표시되는지 알게 될수록 더 빨리 코드를 작성할 수 있습니다. (SO는 디버깅 서비스가 아니며 품질에 대한 질문은 대개 downvoted되고 닫힙니다.

+0

내 질문이 가장 밝지 않다는 것을 알고 있습니다. 나는 혼자서 립을 배우려고 노력하는데 누군가 도와주지 않으면 어려워진다. 영어는 제 1 언어가 아니기 때문에 당신은 의회에서 경험 한 것보다 정직하게 보입니다. 때로는 여러 용어가 내 머리 위로 날아 다니는 경우가 있습니다. "result_buffer"것 또는 제 1 언어로 느슨하게 번역 된 다른 용어들처럼. 나는 당신 같은 사람들이 노력을 기울이고 내 질문에 좌절감을 느끼지만, 당신의 도움에 감사드립니다. 나는 시도 할 것이다. – Coursal

+0

@Coursal 그냥 혼란스러워 게시 계속, 내가 다른 말로 설명하려고합니다 .. 버퍼에 대한 문자열 어셈블리의 일련입니다. 그래서 당신은 어딘가에 여분의 메모리를 몇 바이트 길이 (최대 문자열을 위해) 가지고 있어야합니다. 그리고 MIPS ASM 소스에서 몇 바이트를 할당하는 가장 쉬운 방법은'.data' 섹션 add'result_buffer : .space 25' ->에서하는 것입니다. 첫 번째 것을 가리키는 레이블'result_buffer'로 25 바이트를 예약합니다. 이 대답을 확인할 수도 있습니다 (x86 용이지만 ASCII 문자열은 MIPS에서 동일합니다) : http://stackoverflow.com/questions/40575898/how-to-use-strings-in-emu8086/40580889#40580889 – Ped7g