# ------------------------------------------------------------------
# COMP2421 Programming Assignment 1
# Due: 11:59pm, 24/03/2023
# @JarvisChoy
# -----------------------------README-------------------------------
# This program converts a decimal number to binary, quaternary, and
# octal. The program will continue to run if user enters 1 after 1
# succesion of conversion, and only stops until the user enters 0
# when prompted to continue. The program converts integer into
# binary, quaternary, and octal by repeatedly dividing the integer
# by 2, 4, and 8 respectively in seperate loops. The remainder of
# each division is stored in buffers of 32 bits. The program then
# prints the contents of the buffer in reverse order using seperate
# loops for each conversion.
# ------------------------------------------------------------------
# The program uses the following registers:
# $s0: input number
# $s1: pointer to buffer (for binary, quaternary, and octal)
# $s5: copy of input (for binary)
# $s6: copy of input (for quaternary)
# $s7: copy of input (for octal)
# $t0, $t3: index of buffer
# $t1: remainder of division
# $t2: counter for printing the buffer
# ------------------------------------------------------------------

.data
ask: .asciiz "\nEnter a number: "
response: .asciiz "\nInput number is "
ans1: .asciiz "\nBinary: "
ans2: .asciiz "\nQuaternary: "
ans3: .asciiz "\nOctal: "
continue: .asciiz "\n\nContinue? (1=Yes/0=No) "
buffer1: .space 32 # allocate space for the binary digits
buffer2: .space 32 # allocate space for the quaternary digits
buffer3: .space 32 # allocate space for the octal digits

.text
.globl main
main:
loop:
 la $a0, ask # print prompt message
 li $v0, 4
 syscall 

 li $v0, 5 # read input
 syscall 
 move $s0, $v0

 la $a0, response # print response message from prompt
 li $v0, 4
 syscall 

 move $a0, $s0 # print read input
 li $v0, 1
 syscall 

 la $a0, ans1 # print binary
 li $v0, 4
 syscall 

 move $s5, $s0 # move input into $s7
 move $s6, $s0 # move input into $s8
 move $s7, $s0 # move input into $s9

 la $s1, buffer1 # load the address of buffer1 into $s1
 li $t0, 0 # initialize the index to 0

bin\_loop:
 div $s5, $s5, 2 # divide the integer by 2
 mfhi $t1 # move the remainder into $t1
 sb $t1, ($s1) # store the remainder in the buffer
 addi $s1, $s1, 1 # move the pointer to the next position
 addi $t0, $t0, 1 # increment the index

 bne $s5, $0, bin\_loop # repeat until the quotient becomes 0

 li $t2, 0

print\_bin\_loop:
 addi $s1, $s1, -1 # move the pointer back to the previous position
 lbu $a0, ($s1) # load the binary digit into $a0
 li $v0, 1
 syscall 

 addi $t2, $t2, 1 # increment the counter
 beq $t2, $t0, end\_bin\_loop # exit the loop when all digits have been printed

 j print\_bin\_loop

end\_bin\_loop:
 la $a0, ans2 # print quaternary
 li $v0, 4
 syscall 

 la $s1, buffer2 # load the address of buffer2 into $s1
 li $t3, 0 # initialize the index to 0

qua\_loop:
 div $s6, $s6, 4 # divide the integer by 4
 mfhi $t1 # move the remainder into $t1
 addi $t1, $t1, '0' # convert the remainder to ASCII code
 sb $t1, ($s1) # store the remainder in the buffer
 addi $s1, $s1, 1 # move the pointer to the next position
 addi $t3, $t3, 1 # increment the index

 bne $s6, $0, qua\_loop # repeat until the quotient becomes 0

 li $t2, 0

print\_qua\_loop:
 addi $s1, $s1, -1 # move the pointer back to the previous position
 lbu $a0, ($s1) # load the quaternary digit into $a0
 li $v0, 11
 syscall 

 addi $t2, $t2, 1 # increment the counter
 beq $t2, $t3, end\_qua\_loop # exit the loop when all digits have been printed

 j print\_qua\_loop

end\_qua\_loop:
 la $a0, ans3 # print octal
 li $v0, 4
 syscall 

 la $s1, buffer3 # load the address of buffer3 into $s1
 li $t3, 0 # initialize the index to 0

oct\_loop:
 div $s7, $s7, 8 # divide the integer by 8
 mfhi $t1 # move the remainder into $t1
 addi $t1, $t1, '0' # convert the remainder to ASCII code
 sb $t1, ($s1) # store the remainder in the buffer
 addi $s1, $s1, 1 # move the pointer to the next position
 addi $t0, $t0, 1 # increment the index

 bne $s7, $0, oct\_loop # repeat until the quotient becomes 0

 li $t2, 0

print\_oct\_loop:
 addi $s1, $s1, -1 # move the pointer back to the previous position
 lbu $a0, ($s1) # load the octal digit into $a0
 li $v0, 11
 syscall 

 addi $t2, $t2, 1 # increment the counter
 beq $t2, $t0, end\_oct\_loop # exit the loop when all digits have been printed

 j print\_oct\_loop

end\_oct\_loop:
 la $a0, continue # print continue message
 li $v0, 4
 syscall 

 li $v0, 5 # read input
 syscall 
 move $s0, $v0

 beq $s0, $0, end # exit program if input is 0

 j loop # continue loop if input is 1

end:
 li $v0, 10 # exit program
 syscall
 ------------------------------------------------------------------## COMP2421 프로그래밍 과제 1# 마감일: 24/03/2023 오후 11시 59분# @JarvisChoy# -----------------------------README-------------------------------이 프로그램은 10진수를 2진수, 4진수, #8진수로 변환합니다.# 옥탈로 변환합니다. 사용자가 1 뒤에 1을 입력하면 프로그램이 계속 실행됩니다.1을 입력하면 계속 실행되며, 계속하라는 메시지가 표시되면 # 사용자가 0을 입력할 때까지만 중지됩니다.# 을 입력할 때까지만 중지합니다. 이 프로그램은 정수를 다음 형식으로 변환합니다.정수를 2, 4, 8로 반복적으로 나누어 # 2진수, 4진수, 8진수로 변환합니다.# 2, 4, 8로 각각 반복하여 2진수, 4진수, 8진수로 변환합니다. 나머지는# 각 나눗셈은 32비트 버퍼에 저장됩니다. 그러면 프로그램은# 버퍼의 내용을 역순으로 인쇄합니다.# 각 변환에 대해 별도의 루프를 사용하여 버퍼의 내용을 역순으로 인쇄합니다.# ------------------------------------------------------------------# 프로그램은 다음 레지스터를 사용합니다:# $s0: 입력 번호# $s1: 버퍼에 대한 포인터(2진, 4진, 8진용)# $s5: 입력 복사본(2진수의 경우)# s6: 입력 복사본(4진수의 경우)# s7: 입력 복사본(8진수의 경우)# $t0, $t3: 버퍼의 인덱스# $t1: 나눗셈의 나머지 부분# $t2: 버퍼를 인쇄하기 위한 카운터# ------------------------------------------------------------------.dataask: .asciiz "\n숫자 입력: "응답 .asciiz"\n입력 번호는 "ans1: .asciiz"\n이진수: "ans2: .asciiz"\n4진수: "ans3: .asciiz"\n8진수: "계속: .asciiz"\n\n계속? (1=예/0=아니요) "buffer1: .space 32 # 이진 숫자를 위한 공간 할당buffer2: .space 32 # 4진수를 위한 공간 할당buffer3: .space 32 # 8진수 자릿수 공간 할당.text.globl mainmain:loop: la $a0, ask # 프롬프트 메시지 인쇄 li $v0, 4 syscall  li $v0, 5 # 입력 읽기 syscall  move $s0, $v0 la $a0, 응답 # 프롬프트에서 응답 메시지 인쇄 li $v0, 4 syscall  move $a0, $s0 # 읽기 입력 인쇄 li $v0, 1 syscall  la $a0, ans1 # 바이너리 인쇄 li $v0, 4 syscall  move $s5, $s0 # 입력을 $s7로 옮깁니다. move $s6, $s0 # $s8로 입력 이동 move $s7, $s0 # 입력을 $s9로 옮깁니다. la $s1, buffer1 # 버퍼1의 주소를 $s1에 로드합니다. li $t0, 0 # 인덱스를 0으로 초기화합니다.bin\_loop: div $s5, $s5, 2 # 정수를 2로 나누기 mfhi $t1 # 나머지를 $t1로 이동합니다. sb $t1, ($s1) # 나머지를 버퍼에 저장합니다. addi $s1, $s1, 1 # 포인터를 다음 위치로 이동합니다. addi $t0, $t0, 1 # 인덱스 증가 bne $s5, $0, bin\_loop # 몫이 0이 될 때까지 반복합니다. li $t2, 0print\_bin\_loop: addi $s1, $s1, -1 # 포인터를 이전 위치로 다시 이동합니다. lbu $a0, ($s1) # 이진수를 $a0에 로드합니다. li $v0, 1 syscall  addi $t2, $t2, 1 # 카운터 증가 beq $t2, $t0, end\_bin\_loop # 모든 자릿수가 인쇄되면 루프를 종료합니다. j print\_bin\_loopEND\_BIN\_LOOP: la $a0, ans2 # 4진수 인쇄 li $v0, 4 syscall  la $s1, buffer2 # 버퍼2의 주소를 $s1에 로드합니다. li $t3, 0 # 인덱스를 0으로 초기화합니다.쿼\_루프: div $s6, $s6, 4 # 정수를 4로 나누기 mfhi $t1 # 나머지를 $t1로 이동합니다. addi $t1, $t1, '0' # 나머지를 아스키 코드로 변환합니다. sb $t1, ($s1) # 나머지를 버퍼에 저장합니다. addi $s1, $s1, 1 # 포인터를 다음 위치로 이동합니다. addi $t3, $t3, 1 # 인덱스를 증가시킵니다. bne $s6, $0, qua\_loop # 몫이 0이 될 때까지 반복합니다. li $t2, 0인쇄\_쿼\_루프: addi $s1, $s1, -1 # 포인터를 이전 위치로 다시 이동합니다. lbu $a0, ($s1) # $a0에 4차 자릿수를 로드합니다. li $v0, 11 syscall  addi $t2, $t2, 1 # 카운터 증가 beq $t2, $t3, end\_qua\_loop # 모든 자릿수가 인쇄되면 루프를 종료합니다. j print\_qua\_loopEND\_QUA\_LOOP: LA $A0, AS3 # 8진수 인쇄 li $v0, 4 syscall  la $s1, buffer3 # 버퍼3의 주소를 $s1에 로드합니다. li $t3, 0 # 인덱스를 0으로 초기화합니다.oct\_loop: div $s7, $s7, 8 # 정수를 8로 나누기 mfhi $t1 # 나머지를 $t1로 이동합니다. addi $t1, $t1, '0' # 나머지를 아스키 코드로 변환합니다. sb $t1, ($s1) # 나머지를 버퍼에 저장합니다. addi $s1, $s1, 1 # 포인터를 다음 위치로 이동합니다. addi $t0, $t0, 1 # 인덱스를 증가시킵니다. bne $s7, $0, oct\_loop # 몫이 0이 될 때까지 반복합니다. li $t2, 0인쇄\_옥타브\_루프: addi $s1, $s1, -1 # 포인터를 이전 위치로 다시 이동합니다. lbu $a0, ($s1) # 8진수를 $a0에 로드합니다. li $v0, 11 syscall  addi $t2, $t2, 1 # 카운터 증가 beq $t2, $t0, end\_oct\_loop # 모든 자릿수가 인쇄되면 루프를 종료합니다. J PRINT\_OCT\_LOOPEND\_OCT\_LOOP: la $a0, 계속 # 계속 메시지 인쇄 li $v0, 4 syscall  li $v0, 5 # 입력 읽기 syscall  move $s0, $v0 beq $s0, $0, end # 입력이 0이면 프로그램 종료 j loop # 입력이 1이면 계속 루프end: li $v0, 10 # 프로그램 종료 syscall