#**********************컴퓨터학부__박한솔******************************************#숫자 = 도 출력가능 #ra: #queue #t6: ==a0 input 주소값처럼씀, move b #a0: 출력값 #s0: output #s1: output2 #s8: ascii('x') #s9: #queue #s10: #queue #s11: ascii('=') #t1:루프끝날때 연산자,끝나기 전 input content #t2: * 42 #t3: + 43 #t4: - 45 #t5: / 47 #******************************************************************************************* .data input: .space 512 max:.asciz "# " space:.asciz"\n" .text # ascii('=') 61-48=13 li s11, 13 # ascii('x') li s7, 72 #120-48 addi s9,s9,0 #queue addi s10,s10,10#queue main: la a0,max #max >>값을 a0에 입력 li a7,4 ecall #>> 출력 la a0, input #load address input을 a1에 넣음 li a1, 512 #load immit li a7, 8#문자받기 ecall li a7, 4 #문자출력 ecall addi t6, a0, 0 #t6에 한자씩 입력되고 문자면 다음비트로 loop loop_1: lb a3, 0(t6) #a3에 입력된 한바이트 저장 :첫번째 입력된 비트 #beq t1,s11,finish_f # 한자리수 = 일때 addi s0,s9,0 #s0=s9에 자리수 최신화 addi t1,a3,-48 #t1레지스터에 입력된 한바이트에 -48을 한 값이들어감 addi ra,t1,0 mul s9,s9,s10 add s9,s9,ra #t1에 결론적으로 자리수맞게 숫자가 들어가야됨 addi t6, t6, 1 #다음바이트 beq t1,s11,finish_f # 한자리수 = 일때 beq t1, s7, xpass #x일때 빠져나감 bge t1, zero, loop_1 #t1이 zero보다 크면 loop반복 xpass: li t2,42 li t3,43 li t4,45 li t5,47 # ascii('x') li s8,120 #120-48 loop_3: addi t1,t1,48 #원래 연산자값 return #beq t1,t2,mule beq t1,t3,adde beq t1,t4,sube beq t1,t5,dive beq t1,s8,mula dive: #queue reset li s9,0 li s10,0 li ra,0 addi s9,s9,0 #queue#임시 addi s10,s10,10#queue#임시 loop_2_3: beq t1,s11,finish_div lb a3, 0(t6) addi s1,s9,0 addi t1,a3,-48 addi ra,t1,0 mul s9,s9,s10 add s9,s9,ra addi t6, t6, 1 #다음바이트 beq t1, s7, finish_div #추가 mula와 차이//t1이 72일때 같으면 양수라도 빠져나가야됨 bge t1, zero, loop_2_3 #t1이 zero보다 크면 loop반복 beq zero,zero,finish_div sube: li s9,0 li s10,0 li ra,0 addi s9,s9,0 #queue#임시 addi s10,s10,10#queue#임시 loop_2_2: beq t1,s11,finish_sub lb a3, 0(t6) addi s1,s9,0 addi t1,a3,-48 addi ra,t1,0 mul s9,s9,s10 add s9,s9,ra addi t6, t6, 1 #다음바이트 beq t1, s7, finish_sub #추가 mula와 차이//t1이 72일때 양수라도 빠져나가야됨 bge t1, zero, loop_2_2 #t1이 zero보다 크면 loop반복 beq zero,zero,finish_sub adde: li s9,0 li s10,0 li ra,0 addi s9,s9,0 #queue#임시 addi s10,s10,10#queue#임시 loop_2_1: beq t1,s11,finish_add lb a3, 0(t6) addi s1,s9,0 addi t1,a3,-48 addi ra,t1,0 mul s9,s9,s10 add s9,s9,ra addi t6, t6, 1 beq t1, s7, finish_add #추가 mula와 차이//t1이 72일때 양수라도 빠져나가야됨 bge t1, zero, loop_2_1 #t1이 zero보다 크면 loop반복 beq zero,zero,finish_add #x값 mula: li s9,0 li s10,0 li ra,0 addi s9,s9,0 #queue#임시 addi s10,s10,10#queue#임시 loop_2_x: beq t1,s11,finish_mula lb a3, 0(t6) addi s1,s9,0 addi t1,a3,-48 addi ra,t1,0 mul s9,s9,s10 add s9,s9,ra addi t6, t6, 1 #0보다 작으면 나오는 로직 blt t1,zero,finish_mula #다른 연산자 고려 bne t1, s7, loop_2_x beq zero,zero,finish_mula finish_add: add s0,s0,s1 beq zero,zero,finish_f finish_sub: sub s0,s0,s1 beq zero,zero,finish_f finish_div: div s0,s0,s1 beq zero,zero,finish_f finish_mula: mul s0,s0,s1 beq zero,zero,finish_f #연산값 출력,enter,t1값이 =이 나오면 finish로 이동 finish_f: addi a0,s0,0 li a7, 1 ecall beq t1,s11,finish la a0,space li a7,4 ecall #0이 t1(연산자-48==음수)보다 크면 loop반복 #x처리 72이면 loof3돌아라 beq t1, s7, loop_3 bge zero, t1, loop_3 # Exit finish: li a7 10 ecall |
'[CS] 컴퓨터 공학 > CS 수업 정리' 카테고리의 다른 글
[CS] 컴파일러 compiler (0) | 2023.07.05 |
---|---|
[CS] OS 운영체제 (0) | 2023.07.05 |
[CS] 자료구조 및 시스템 프로그래밍 TOP , disk I/O diskstats 구현 (2) | 2022.12.11 |
[CS] 컴퓨터구조 ch.2 (0) | 2022.09.15 |
[CS] 컴퓨터 구조 ch1 (0) | 2022.09.13 |