4. 나눗셈

2023. 4. 11. 19:40·컴퓨터 구조/Ch3. 컴퓨터 연산
Reference :
- 컴퓨터 구조 및 설계 MIPS EDITION [6판] / David A. Patterson / 한빛에듀
- 건국대학교 컴퓨터구조 강의 / 박능수 교수님
- https://developbear.tistory.com/ (김베어의 개발일지)
나눗셈

나눗셈은 곱셈보다 사용 빈도는 낮지만 훨씬 까다롭다.

0으로 나누기와 같이 수학적으로 유효하지 않은 연산을 요구하기도 한다.

 

먼저 0과 1로만 이루어진 십진수의 나눗셈, 1001010 ÷ 1000을 보자.

 

 

나누어지는 수는 피제수(dividend), 피제수를 나누는 수는 제수(devisor)로 부르고,

몫(quotient)이라 불리는 결과와 나머지(remainder)라고 불리는 두 번째 결과가 있다.

 

피제수 = 몫 × 제수 + 나머지

 

 

보통 초등학교에서 배운 나눗셈 방법은 얼마나 큰 수를 뺄 수 있는지를 검사해서 몫의 자리 수를 하나하나 구한다.

 

위의 십진수 예는 0과 1 만을 사용하도록 선택하였으므로, 제수가 피제수에 얼마나 많이 들어갈 수 있는지 쉽게 알 수 있다.

제수는 피제수에 0번 아니면 1번만 들어간다.

 

이진수 나눗셈은 이 두 가지 중 한 가지 선택만으로 제한되므로 계산이 간단하다.

 


초기의 나눗셈 하드웨어

초등학교에서 배운 알고리즘을 그대로 하드웨어로 구현한 것이다.

 

 

제수(divisor) 레지스터, ALU, 나머지(remainder) 레지스터는 모두 64비트이고,

몫(quotient) 레지스터만이 32비트이다.

 

제수는 64비트 제수 레지스터의 왼쪽 절반에 넣어지고,

나머지 레지스터는 피제수로 초기화된다.

 

 

[ 단계 1 ]

컴퓨터는 제수가 피제수보다 작다는 것을 먼저 알 만큼 똑똑하지 않으므로, 일단 나머지 레지스터에서 제수를 빼야 한다.

 

[ 단계 2 ]

나머지 레지스터에서 제수를 뺀 결과가 양수라면 제수는 피제수와 같거나 더 작다는 것이므로 몫에 1을 넣는다.

결과가 음수라면 제수를 나머지 레지스터에 다시 더해서 원래의 값을 회복한다.

 

이러한 복구 연산이 존재하기 때문에 나누기 연산은 복잡하다.

 

[ 단계 3 ]

제수 레지스터를 오른쪽으로 한 비트씩 자리이동(shift right)시킨다.

이는 다음번 반복의 계산을 위해 피제수에 맞추어 제수를 정렬시키기 위함이다.

 

 

최종 결과를 얻기 위해서는 이 세 단계를 33번 반복해야 한다.

 

제수 레지스터에는 사용되지 않는 부분이 존재하는데,

이 부분을 개선하는 것을 통해 덧셈기와 레지스터의 크기를 절반으로 줄일 수 있다.


개선된 나눗셈 하드웨어

제수(divisor) 레지스터, ALU, 몫(quotient) 레지스터는 모두 32비트이며,

나머지(remainder) 레지스터만이 64비트로 남아있다.

 

몫 레지스터는 나머지 레지스터의 오른쪽 절반에 결합되었다.

 

 

초기의 나눗셈 하드웨어에서 자리이동된 제수 레지스터는 가만히 있고,

나머지 레지스터를 왼쪽으로 자리이동(shift left)한다.

 

예시로 0111(7)÷0010(2)의 계산을 적어놓았으니, 찬찬히 보면서 과정을 이해하길 바란다.

 

 

지금까지는 양수만을 다뤄왔다.

부호있는 수의 나눗셈은 어떻게 해야할까?

 

곱셈에서와 같이, 간단한 방법은 제수와 피제수의 부호를 기억하고

전부 양수로 변환하여 나눗셈을 실행한 다음, 제수와 피제수의 부호가 달랐을 경우 몫을 음수화하는 것이다.


앞서 설명한 곱셈 하드웨어와 나눗셈 하드웨어가 똑같다는 것을 볼 수 있다.

 

 

즉, 똑같은 순차 하드웨어가 곱셈과 나눗셈 모두에 이용될 수 있다는 것이다.

 

왼쪽이나 오른쪽으로 자리이동될 수 있는 64비트 레지스터와

덧셈과 뺄셈을 할 수 있는 32비트 ALU만 있으면 된다.

 

MIPS는 곱셈과 나눗셈용 64비트 레지스터로 32비트 hi와 lo 레지스터를 사용한다.


MIPS 나눗셈 명령어

MIPS에서는 부호있는 정수와 부호없는 정수를 모두 다루기 위해

두 개의 명령어 div(divide)와 divu(divide unsigned)를 지원한다.

 

div $s0, $s1	# lo = $s0 / $s1
		# hi = $s0 mod $s1

나눗셈 명령이 완료된 뒤 hi는 나머지를, lo는 몫을 갖는다.

 

 

MIPS 어셈블러는 범용 레지스터 세 개를 사용하는 나누기 의사명령어 mflo와 mfhi를 제공한다.

mfhi rd
mflo rd

이들을 통해 원하는 결과를 범용 레지스터에 넣는다.

저작자표시 (새창열림)

'컴퓨터 구조 > Ch3. 컴퓨터 연산' 카테고리의 다른 글

6. 부동 소수점 반올림과 근사  (5) 2023.05.02
5. 부동소수점  (0) 2023.04.12
3. 곱셈  (0) 2023.04.11
2. 덧셈과 뺄셈  (0) 2023.04.11
1. 서론  (0) 2023.04.11
'컴퓨터 구조/Ch3. 컴퓨터 연산' 카테고리의 다른 글
  • 6. 부동 소수점 반올림과 근사
  • 5. 부동소수점
  • 3. 곱셈
  • 2. 덧셈과 뺄셈
smile blog
smile blog
건국대 첨단바이오공학부 & 컴퓨터공학부 BT & IT 기술로 희망을 꿈 꿉니당
  • smile blog
    스마일 블로그
    smile blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (835) N
      • 일상 생각들 (3)
      • 학과에 대해 (4)
        • 첨단바이오공학부 (4)
        • 컴퓨터공학부 (0)
      • -------- 프로젝트 -------- (0)
      • [DS] 토이 프로젝트 (1)
      • [Web, Game, XR] 토이 프로젝트 (11)
      • 경진대회 (1)
      • -------- 진로 -------- (0)
      • 생물정보학자 (19)
        • 데이터 과학이란? (0)
        • 되는 방법 (9)
        • 책 추천 (2)
        • 인강 (1)
        • 대학 (2)
        • 회사 (1)
        • 학원 (2)
        • 학회 (2)
      • 디지털 헬스케어 (72)
        • 방법 (8)
        • 생각들 (10)
        • 공부법 (4)
        • 책 추천 (2)
        • 학원 (2)
        • 참고 (2)
        • 대학 (3)
        • 회사 (3)
        • 인강 (2)
        • 게임 엔진들 (1)
        • 게임 프로그래머 개론 (2)
        • 게임 프로그래머 취업 전략 가이드 (7)
        • 취업 서류 (1)
        • 애정하는 게임들 (4)
        • XR 테크니컬 아티스트 (9)
        • 영화, 애니메이션 테크니컬 디렉터 (12)
      • -------- 기초 학문 -------- (0)
      • 생명과학 이야기 (2)
        • 대학 강의 (2)
      • 화학 이야기 (0)
      • 컴퓨터과학 이야기 (0)
      • 통계학 이야기 (0)
      • 수학 이야기 (1)
        • 공학 수학 (1)
      • 영어 이야기 (1)
      • 심리학 이야기 (7)
        • 현대인과 정신건강 (7)
      • -------- 컴퓨터 언어 -------- (0)
      • Python (3)
        • 나도코딩의 파이썬 입문 (1)
        • 파이썬 관련 정보 (1)
      • SQL (0)
      • C 언어 (32)
        • 혼자 공부하는 C언어 요약 (1)
        • [책 정리] 혼자 공부하는 C언어 (31)
      • C++ (33)
        • 명품 C++ 프로그래밍 요약 (1)
        • [책 정리] 명품 C++ 프로그래밍 (27)
        • C++ STL (0)
        • 뇌를 자극하는 C++ STL (5)
      • -------- 생명과학 -------- (0)
      • 생화학 (8)
        • 대학 강의 (8)
      • 분자세포생물학 (6)
        • 대학 강의 (6)
      • 유전자치료공학 (4)
        • 대학 강의 (4)
      • 생명정보학 (7)
        • 대학 강의 (7)
      • 약리학 (2)
        • 대학 강의 (2)
      • -------- 컴퓨터과학 -------- (0)
      • 자료구조와 알고리즘 (8)
        • 자료구조와 알고리즘의 정의 (3)
        • [책 정리] C언어로 쉽게 풀어쓴 자료구조 요약 (1)
        • [인강] 자료구조와 알고리즘 (2)
        • 코딩 테스트 대비하기! (1)
      • 컴퓨터 회로 (0)
      • 컴퓨터 구조 (43)
        • 컴퓨터 구조와 운영체제 요약 (1)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 구조 및 설계 (1)
        • Ch1. 컴퓨터 추상화 및 관련 기술 (8)
        • Ch2. 명령어 : 컴퓨터 언어 (11)
        • Ch3. 컴퓨터 연산 (8)
        • Ch4. 프로세서 (11)
        • Ch5. 메모리 계층구조 (3)
        • Ch6. 병렬 프로세서 : 클라이언트에서 클라우드까지 (0)
      • 시스템 프로그래밍 (15)
        • [책 정리] 시스템 프로그래밍 유닉스 & 리눅스 (0)
        • [인강] 리눅스 시스템 프로그래밍 (2)
        • 리눅스에서 코딩이란? (8)
        • 대학교 강의 정리 (5)
      • 운영체제 (0)
      • 컴퓨터 네트워크 (37)
        • 모두의 네트워크 요약 (1)
        • [책 정리] 모두의 네트워크 (10)
        • ---------------------------------------- (0)
        • [전공 책 정리] 컴퓨터 네트워킹 하향식 접근 8판 (1)
        • Ch1. 컴퓨터 네트워크와 인터넷 (7)
        • Ch2. 애플리케이션 계층 (7)
        • Ch3. 트랜스포트 계층 (8)
        • Ch4. 네트워크 계층 : 데이터 평면 (3)
        • Ch5. 네트워크 계층 : 제어 평면 (0)
        • Ch6. 링크 계층과 근거리 네트워크 (0)
        • Ch7. 무선 및 이동 네트워크 (0)
        • Ch8. 컴퓨터 네트워크 보안 (0)
      • 데이터베이스 (1)
      • -------- 데이터과학 -------- (0)
      • 데이터 사이언스 (8)
        • 인강 (8)
      • 데이터 분석 (2)
        • 인강 (2)
      • 머신러닝 (2)
        • 대학 수업 (2)
      • 인공지능 (11)
        • 대학교 강의 정리 (10)
        • 인공지능 관련 정보 (1)
      • -------- +a -------- (0)
      • Visual Studio Community (7)
        • 설치법 (1)
        • 단축키 (1)
        • 오류 (5)
      • Visual Studio Code (0)
      • 노션 (1)
      • 깃허브 (7)
        • 깃허브 사용법 (5)
        • 유니티, 언리얼 & 깃허브 (1)
        • 깃허브 주의사항 (1)
      • 챗GPT 활용법 (0)
      • 기타 feat. 프로그래밍 (7)
        • 프로그래머로 살아남기 (5)
        • 코딩 vs 프로그래밍 (1)
        • 애플 비전 프로 (1)
      • 메타버스 (5)
      • -------- 예술 -------- (0)
      • 음악 (1)
      • 미술 (0)
      • -------- XR -------- (0)
      • 유니티 이야기 (23)
        • 레트로의 유니티 게임 프로그래밍 에센스 요약 (4)
        • 유니티 관련 정보 (1)
        • 유니티 디버깅 (13)
        • 유니티 인강 (3)
        • 대학교 게임 프로그래밍 강의 (2)
      • 언리얼 이야기 (0)
        • 인생 언리얼 교과서 요약 (0)
      • 컴퓨터 그래픽스 (6)
        • OpenGL (6)
      • 가상현실 & 증강현실 (4)
        • 유니티 vr (4)
      • HCI 와 UI UX (7)
        • [책 정리] HCI 개론 (6)
      • -------- Design -------- (0)
      • 캐릭터 (1)
        • 모델링 (0)
        • 리깅 (1)
      • 포토샵 (3)
      • 3ds Max (7)
      • Maya (9)
        • 블로그 (1)
        • 인강 (6)
        • 대학교 (2)
      • Blender (14)
        • 책 (1)
        • 인강 (7)
        • 기타 (3)
        • 대학교 (3)
      • 아트 작업물들 (2)
      • 에셋 사이트 (1)
      • -------- 건강관리 -------- (0)
      • 건강관리 ft. 정현 (12)
        • 목 디스크 (2)
        • 눈 관리 (2)
        • 일상생활 습관 (6)
        • 일상생활 꿀팁 (2)
        • 사무직 꿀팁 (0)
      • 헬스의 정석 ft. 정현 (28)
        • 헬스와 건강 (8)
        • 헬스 구체화 정보 (6)
        • 헬스 유튜버 (1)
        • 헬스 서적 (1)
        • 도전 바디프로필! (11)
        • 헬스장 패션 (1)
      • -------- etc -------- (0)
      • 진로 관련 잡다한 글들 (34)
        • 진도율 (9)
        • 진로 관련 글들 (15)
        • 학교 강의 관련 글들 (10)
      • 인생 꿀 Tip (23)
        • 컴퓨터 초기 설정 (9)
        • 원격 데스크톱 (1)
        • 노트북 발열 (1)
        • 전자기기 (2)
        • 중고기기 팔기 (1)
        • 아이패드 필기 어플 (1)
        • 에어팟 (1)
        • 커피 (1)
        • 맥북 (1)
        • lg 그램 (1)
        • 검색엔진에서 내 티스토리 검색 (1)
        • hELLO 다크 모드 없애기 (1)
        • 인터넷 연결 문제 (1)
        • 키보드 문제 해결 (1)
      • 유튜브 (3)
      • 청춘 그리고 추억 (1)
      • 인생 계획표 (2)
        • 2024년 2학기 (1)
        • 2024년 여름방학 (0)
        • 2024년 1학기 (0)
        • 2023년 겨울방학 (1)
      • 다양한 글들 (98)
        • C++ STL (6)
        • Win32 API (24)
        • PushPush 게임 (13)
        • 컴퓨터구조 (1)
        • 자료구조와 알고리즘 (50)
        • 게임의 정의 (3)
        • 영상 회사 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • Dream
    • 코딩을 시작한 이유
    • 나를 소개합니다!
    • 블로그 공부법
    • IT & 가치 있는 일들
  • 인기 글

  • 태그

    의생명정보알고리즘
    코딩
    유니티
    생명과학
    컴퓨터 네트워크
    연산자
    심리학
    자료구조
    의생명공학과
    스택
    C언어
    명령어
    unity
    알고리즘
    AI
    컴퓨터구조
    포인터
    첨단바이오공학부
    생명공학
    배열
    C++
    의생명공학
    인공지능
    데이터사이언스
    블렌더
    생물정보학
    데이터과학
    리눅스
    함수
    건국대
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
smile blog
4. 나눗셈
상단으로

티스토리툴바