본문 바로가기
[CS] 컴퓨터 공학/CS 수업 정리

[CS] 컴퓨터구조 어셈블리 계산기

by pjhcsol 2023. 2. 9.
#**********************컴퓨터학부__박한솔******************************************#숫자 = 도 출력가능
#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