Top 35 컴퓨터 구조 및 설계 5 판 한글 Pdf Top 104 Best Answers

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 컴퓨터 구조 및 설계 5 판 한글 pdf on Google, you do not find the information you need! Here are the best content compiled and compiled by the Chewathai27.com/to team, along with other related topics such as: 컴퓨터 구조 및 설계 5 판 한글 pdf 컴퓨터 구조 및 설계 5판 pdf, Computer Organization and Design 한글판 PDF, 컴퓨터 구조 및 설계 pdf, 컴퓨터 구조 및 설계 6판 pdf, 컴퓨터 구조와 원리 PDF


[#4] 대학교 전공책 솔루션 PDF 무료로 다운받기
[#4] 대학교 전공책 솔루션 PDF 무료로 다운받기


컴퓨터 구조 및 설계(5판)(원서/번역서: [해외]Computer Organization and Design MIPS Edition (Paperback)) | David A. Patterson | 한티미디어 – 교보문고

  • Article author: www.kyobobook.co.kr
  • Reviews from users: 13513 ⭐ Ratings
  • Top rated: 3.9 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 컴퓨터 구조 및 설계(5판)(원서/번역서: [해외]Computer Organization and Design MIPS Edition (Paperback)) | David A. Patterson | 한티미디어 – 교보문고 컴퓨터 구조 및 설계 하드웨어/소프트웨어 인터페이스 | 5판. klover9.4 (12건). Dav A. Patterson L. Hennessy 박명순 김병기 하순회 장훈. 한티미디어. 2015.01.30. …
  • Most searched keywords: Whether you are looking for 컴퓨터 구조 및 설계(5판)(원서/번역서: [해외]Computer Organization and Design MIPS Edition (Paperback)) | David A. Patterson | 한티미디어 – 교보문고 컴퓨터 구조 및 설계 하드웨어/소프트웨어 인터페이스 | 5판. klover9.4 (12건). Dav A. Patterson L. Hennessy 박명순 김병기 하순회 장훈. 한티미디어. 2015.01.30. 하드웨어/소프트웨어 인터페이스 | 1. 소개글컴퓨터과학과 컴퓨터공학을 학습하게 되면 컴퓨팅을 발전시키는 원리뿐만 아니라 그 분야의 최신 기술도 습득해야 된다고 믿는다. 또한 컴퓨팅의 각 전문 분야의 독자들은 컴퓨터 시스템의 기능, 성능뿐만 아니라 궁극적으로는 성공 여부를 결정짓는 구조적 패러다임을 … | 이 책은 어셈블리 언어와 논리 설계에 지식이 있으면서 컴퓨터를 어떻게 설계하는지, 시스템이 어떻게 동작하는지, 왜 그 정도의 성능을 내는지를 알고 싶어 하는 사람은 물론이고, 기본적인 컴퓨터 구조에 대해 이해할 필요가 있지만 어셈블리 언어나 논리 설계에서 경험이 거…컴퓨터 구조 및 설계, David A. Patterson,, 한티미디어, 9788964212134
  • Table of Contents:

키워드 Pick

이 책의 다른 상품 정보

가격정보

이 상품의 이벤트 3건

배송정보

이 책을 구매하신 분들이 함께 구매하신 상품입니다 KOR (개인)

이 책의 이벤트

책소개

목차

출판사 서평

Klover 리뷰 (0)

북로그 리뷰 (0)

쓰러가기

문장수집 (0) 문장수집 쓰기 나의 독서기록 보기

※구매 후 문장수집 작성 시 리워드를 제공합니다

안내

문장수집 안내

문장수집은 고객님들이 직접 선정한 책의 좋은 문장을 보여주는 교보문고의 새로운 서비스입니다
마음을 두드린 문장들을 기록하고 좋은 글귀들은 좋아요하여 모아보세요
도서 문장과 무관한 내용 등록 시 별도 통보 없이 삭제될 수 있습니다

1 리워드 안내
구매 후 90일 이내에 문장수집 작성 시 e교환권 100원을 적립해 드립니다

e교환권은 적립일로부터 180일 동안 사용 가능합니다
리워드는 작성 후 다음 날 제공되며 발송 전 작성 시 발송 완료 후 익일 제공됩니다
리워드는 한 상품에 최초 1회만 제공됩니다
주문취소반품절판품절 시 리워드 대상에서 제외됩니다

교환반품품절안내

기프트 BEST

이 책의 원서번역서

이 분야의 베스트

이 분야의 신간

컴퓨터 구조 및 설계(5판)(원서/번역서: [해외]Computer Organization and Design MIPS Edition (Paperback)) | David A. Patterson | 한티미디어 - 교보문고
컴퓨터 구조 및 설계(5판)(원서/번역서: [해외]Computer Organization and Design MIPS Edition (Paperback)) | David A. Patterson | 한티미디어 – 교보문고

Read More

알라딘: 컴퓨터 구조 및 설계

  • Article author: www.aladin.co.kr
  • Reviews from users: 6033 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 알라딘: 컴퓨터 구조 및 설계 … 및 설계 하드웨어 / 소프트웨어 인터페이스, 5th Edition. 데이비드 패터슨, 존 헤네시 (지은이), 김병기, 박명순, 장훈, 하순회 (옮긴이) 한티미디어 2015-01-19. …
  • Most searched keywords: Whether you are looking for 알라딘: 컴퓨터 구조 및 설계 … 및 설계 하드웨어 / 소프트웨어 인터페이스, 5th Edition. 데이비드 패터슨, 존 헤네시 (지은이), 김병기, 박명순, 장훈, 하순회 (옮긴이) 한티미디어 2015-01-19. 하드웨어와 소프트웨어 사이의 관련성을 보여 주고 현대 컴퓨터의 기본이 되는 개념들에 대해 관심을 집중시킨다. 컴퓨터 추상화 및 관련 기술, 명령어: 컴퓨터 언어, 컴퓨터 연산, 프로세서, 메모리 계층구조 등으…컴퓨터구조및설계 구조및설계 컴퓨터설계 소프트웨어 5판
  • Table of Contents:
알라딘: 컴퓨터 구조 및 설계
알라딘: 컴퓨터 구조 및 설계

Read More

한티미디어 / (주)한티에듀

  • Article author: www.hanteemedia.co.kr
  • Reviews from users: 3283 ⭐ Ratings
  • Top rated: 3.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 한티미디어 / (주)한티에듀 appendix+f_final.pdf (10.0M) [410] DATE : 2018-08-24 16:47:53. 컴퓨터 구조 및 설계 5판(Patterson 외) 부록 A, B, F 내용입니다. …
  • Most searched keywords: Whether you are looking for 한티미디어 / (주)한티에듀 appendix+f_final.pdf (10.0M) [410] DATE : 2018-08-24 16:47:53. 컴퓨터 구조 및 설계 5판(Patterson 외) 부록 A, B, F 내용입니다. 기초과학 · 공학, 경영 · 경제, 사회과학 등 다양한 분야의 도서를 수입, 출판, 공급하여 젊은 학생들이 사회에 필요한 역량과 경쟁력을 갖춘 글로벌 인재가 될 수 있도록 기여하고 동행하는 출판사입니다
  • Table of Contents:
한티미디어 / (주)한티에듀
한티미디어 / (주)한티에듀

Read More

컴퓨터 구조 및 설계 문제 해설

  • Article author: tistorysolution.tistory.com
  • Reviews from users: 16873 ⭐ Ratings
  • Top rated: 3.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 컴퓨터 구조 및 설계 문제 해설 컴퓨터 구조 및 설계 문제 해설 컴퓨터 구조 및 설계 문제 해설 스포츠카를 못타는 인생은 진짜 불쌍한 … solutions_for_chapter_1_exercises.pdf. …
  • Most searched keywords: Whether you are looking for 컴퓨터 구조 및 설계 문제 해설 컴퓨터 구조 및 설계 문제 해설 컴퓨터 구조 및 설계 문제 해설 스포츠카를 못타는 인생은 진짜 불쌍한 … solutions_for_chapter_1_exercises.pdf. 컴퓨터 구조 및 설계 문제 해설 컴퓨터 구조 및 설계 문제 해설 스포츠카를 못타는 인생은 진짜 불쌍한 인생이다 스포츠카를 못타는 인생은 진짜 불쌍한 인생이다 인터넷에서 유명한 글인 스포츠카를 못타는 인생..
  • Table of Contents:

컴퓨터 구조 및 설계 문제 해설

태그

관련글

댓글0

티스토리툴바

컴퓨터 구조 및 설계 문제 해설
컴퓨터 구조 및 설계 문제 해설

Read More

개발자로 살아남기 : 한글과컴퓨터, 블리자드, 넥슨, 삼성전자, 몰로코 출신 개발 … – 박종천 – Google Sách

  • Article author: books.google.com.vn
  • Reviews from users: 4808 ⭐ Ratings
  • Top rated: 4.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 개발자로 살아남기 : 한글과컴퓨터, 블리자드, 넥슨, 삼성전자, 몰로코 출신 개발 … – 박종천 – Google Sách Updating …
  • Most searched keywords: Whether you are looking for 개발자로 살아남기 : 한글과컴퓨터, 블리자드, 넥슨, 삼성전자, 몰로코 출신 개발 … – 박종천 – Google Sách Updating 평생 개발자를 꿈꾼다면30년 커리어패스를 설계하세요실리콘밸리와 우리나라에서 30년간 TOP 개발자로 활약한 저자의 커리어패스 인사이트를 공개합니다. 저자가 제안하는 ‘성장하는 30년 커리어패스’에 도전하세요. 처음 10년은 성장하는 시기, 다음은 리딩하며 일하는 시기, 마지막은 서포트하는 시기입니다. 시기별로 엔지니어링 역량, 매니지먼트 역량, 비즈니스 역량을 갖추세요. 이 책은 주니어/시니어 개발자, 팀장, 리드에 이르기까지 다양한 역할에 필요한 역량을 9가지 기술 중심으로 소개합니다.앞날 걱정은 이제 그만!개발자 30년 커리어패스를 제안합니다평생 개발자로 살고 싶다면 성장하는 ‘30년 커리어패스’에 도전하세요. 처음 10년은 실력을 쌓으며 성장하는 시기, 다음 10년은 다른 개발자를 리딩하며 일하는 시기, 마지막 10년은 한 발 물러서서 사람들을 돕고 서포트하는 시기입니다. 마지막 10년에는 선택의 폭이 넓습니다. 기술 리더십을 사업 리더십으로 확장해서 디렉터, VP, CTO 같은 임원이 될 수도 있겠지요. 개발자 커리어패스 30년을 10년 단위로 설계한 이유는, 프로그래밍과 마찬가지로 설계를 해야 효과적으로 개선하며 자기계발을 할 수 있기 때문입니다.30년간 9가지 기술을 익혀자기주도적으로 경력을 쌓으세요30년 동안 개발자로서 성장하길 원하나요? ❶ 엔지니어링, ❷ 매니지먼트, ❸ 비즈니스 역량을 익히세요. △ 엔지니어링 역량에는 기본 개발 지식, 제품에 대한 이해, 개발 주기 지식이 필요합니다. △ 매니지먼트 역량에는 프로젝트, 팀, 프로세스 관리 기술이 필요합니다. 마지막 △ 비즈니스 역량에는 회사 인사 시스템, 사업 관리, 비전과 조직 문화에 대한 이해와 관리 기술이 필요합니다. 말씀드린 개발자가 갖추어야 할 9가지 기술은 30년 커리어패스 전 영역에 필요합니다. 물론 시기에 따라서 필요한 기술이나 정도가 다를 수 있지만, 궁극적으로 성공적인 개발자 커리어패스를 걷고자 한다면 9가지 기술을 모두 익혀야 합니다.
  • Table of Contents:
개발자로 살아남기 : 한글과컴퓨터, 블리자드, 넥슨, 삼성전자, 몰로코 출신 개발 ... - 박종천 - Google Sách
개발자로 살아남기 : 한글과컴퓨터, 블리자드, 넥슨, 삼성전자, 몰로코 출신 개발 … – 박종천 – Google Sách

Read More

Access to this page has been denied.

  • Article author: www.studocu.com
  • Reviews from users: 16047 ⭐ Ratings
  • Top rated: 4.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Access to this page has been denied. 컴퓨터구조 수업 때 과제 답지입니다. solutions chapter solutions personal computer (includes workstation and laptop): personal computers emphasize delivery … …
  • Most searched keywords: Whether you are looking for Access to this page has been denied. 컴퓨터구조 수업 때 과제 답지입니다. solutions chapter solutions personal computer (includes workstation and laptop): personal computers emphasize delivery …
  • Table of Contents:
Access to this page has been denied.
Access to this page has been denied.

Read More

컴퓨터 구조 및 설계 – Chapter 2. Instructions: Language of the Computer

  • Article author: ydeer.tistory.com
  • Reviews from users: 44586 ⭐ Ratings
  • Top rated: 4.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 컴퓨터 구조 및 설계 – Chapter 2. Instructions: Language of the Computer 32개의 레지스터 주소(0~31)를 위한 것이므로, 각각 5bit(2^5-1=31)만 담을 수 있어도 충분. ㆁ레지스터는,. *메인메모리보다 빠르다. ㆍ하지만 구성되는 … …
  • Most searched keywords: Whether you are looking for 컴퓨터 구조 및 설계 – Chapter 2. Instructions: Language of the Computer 32개의 레지스터 주소(0~31)를 위한 것이므로, 각각 5bit(2^5-1=31)만 담을 수 있어도 충분. ㆁ레지스터는,. *메인메모리보다 빠르다. ㆍ하지만 구성되는 … Chapter 2. Instructions: Language of the Computer ㆍInstructions를 이해할 수 있다. 2.1 – Introduction 2.2 – Operations of the Computer Hardware 2.3 – Operands of the Computer Hardware 2.4 – Si..
  • Table of Contents:

현록의 기록저장소

컴퓨터 구조 및 설계 – Chapter 2 Instructions Language of the Computer 본문

컴퓨터 구조 및 설계 - Chapter 2. Instructions: Language of the Computer
컴퓨터 구조 및 설계 – Chapter 2. Instructions: Language of the Computer

Read More


See more articles in the same category here: Top 423 tips update new.

컴퓨터 구조 및 설계 하드웨어/소프트웨어 인터페이스

1. 소개글컴퓨터과학과 컴퓨터공학을 학습하게 되면 컴퓨팅을 발전시키는 원리뿐만 아니라 그 분야의 최신 기술도 습득해야 된다고 믿는다. 또한 컴퓨팅의 각 전문 분야의 독자들은 컴퓨터 시스템의 기능, 성능뿐만 아니라 궁극적으로는 성공 여부를 결정짓는 구조적 패러다임을 잘 이해할 필요가 있다고 믿는다.현대의 컴퓨터 기술은 컴퓨팅 전 분야의 전문가로 하여금 하드웨어와 소프트웨어 둘 다 이해할 것을 요구한다. 여러 수준에서의 하드웨어와 소프트웨어 사이의 상호작용은 컴퓨팅의 기본 원리를 이해하는 근간을 제공한다. 여러분의 일차 관심 분야가 하드웨어이든 소프트웨어이든 간에, 컴퓨터과학이든 전기공학이든 간에 컴퓨터구성과 설계에서의 중심 아이디어는 같다. 따라서 이 책에서는 하드웨어와 소프트웨어 사이의 관련성을 보여 주고 현대 컴퓨터의 기본이 되는 개념들에 대해 관심을 집중시키려 한다.최근의 단일 프로세서에서 멀티코어 마이크로프로세서로의 변천은 초판 이래 갖고 있던 이러한 관점이 옳았다는 것을 확인시켜 주었다. 한때는 프로그래머들이 이러한 충고를 무시하고 그들의 프로그램을 수정 없이 좀 더 빠르게 실행시키기 위해 컴퓨터 설계자, 컴파일러 작성자, 실리콘 엔지니어들에게 의존하였지만 이제 그러한 시대는 끝났다. 프로그램이 좀 더 빠르게 실행되기 위해서는 병렬적이어야 한다. 많은 연구자들의 목표가 프로그래머들이 그들이 프로그래밍하고 있는 하드웨어의 기저에 있는 병렬 특성을 알지 못하도록 만드는 것이었지만, 이 같은 것을 실천하는 데는 긴 기간이 걸릴 것이다. 우리의 생각으로 최소 다음 10년 동안은 프로그램을 병렬 컴퓨터에서 좀 더 효율적으로 실행하기 위해서 프로그래머들은 하드웨어/소프트웨어 인터페이스를 이해해야 할 것이다.이 책의 독자로는 어셈블리 언어와 논리 설계에 지식이 있으면서 컴퓨터를 어떻게 설계하는지, 시스템이 어떻게 동작하는지, 왜 그 정도의 성능을 내는지를 알고 싶어 하는 사람은 물론이고, 기본적인 컴퓨터 구조에 대해 이해할 필요가 있지만 어셈블리 언어나 논리 설계에서 경험이 거의 없는 사람 모두가 포함될 수 있다. 닫기

Computerorganizaion & design 5th solution

Solutions

1

Chapter 1 Solutions S-

1 Personal computer (includes workstation and laptop): Personal computers emphasize delivery of good performance to single users at low cost and usually execute third-party soft ware. Personal mobile device (PMD, includes tablets): PMDs are battery operated with wireless connectivity to the Internet and typically cost hundreds of dollars, and, like PCs, users can download soft ware (“apps”) to run on them. Unlike PCs, they no longer have a keyboard and mouse, and are more likely to rely on a touch-sensitive screen or even speech input. Server: Computer used to run large problems and usually accessed via a network. Warehouse scale computer: Th ousands of processors forming a large cluster. Supercomputer: Computer composed of hundreds to thousands of processors and terabytes of memory. Embedded computer: Computer designed to run one application or one set of related applications and integrated into a single system.

a. Performance via Pipelining b. Dependability via Redundancy c. Performance via Prediction d. Make the Common Case Fast e. Hierarchy of Memories f. Performance via Parallelism g. Design for Moore’s Law h. Use Abstraction to Simplify Design

1 Th e program is compiled into an assembly language program, which is then assembled into a machine language program.

a. 1280 1024 pixels 1,310,720 pixels 1,310,720 3 3,932, bytes/frame. b. 3,932,160 bytes (8 bits/byte) /100E6 bits/second 0 seconds a. performance of P1 (instructions/sec) 3 109 /1 2 109 performance of P2 (instructions/sec) 2 109 /1 2 109 performance of P3 (instructions/sec) 4 109 /2 1 109

Chapter 1 Solutions S-

1.

1.8 C 2 DP/(V 2 *F)

Pentium 4: C 3–8F Core i5 Ivy Bridge: C 2–8F 1.8 Pentium 4: 10/100 10% Core i5 Ivy Bridge: 30/70 42% 1.8 (Snew Dnew)/(Sold Dold) 0. Dnew C Vnew 2 F Sold Vold I Snew Vnew I Th erefore: Vnew [Dnew/(C F)]1/ Dnew 0 (Sold Dold) Snew Snew Vnew (Sold/Vold) Pentium 4: Snew Vnew (10/1) Vnew 8 Dnew 0 100 Vnew 8 90 Vnew 8 Vnew [(90 Vnew 8)/(3 3)]1/ Vnew 0 V Core i5: Snew Vnew (30/0) Vnew 33. Dnew 0 70 Vnew 33 63 Vnew 33. Vnew [(63 Vnew 33)/(2 3)]1/ Vnew 0 V

p # arith inst. # L/S inst. # branch inst. cycles ex. time speedup 1 2 1 2 7 39 1 2 1 9 2 5 28 1. 4 9 4 2 2 14 2. 8 4 2 2 1 7 5.

S-6 Chapter 1 Solutions

1.

p ex. time 1 41. 2 29. 4 14. 8 7. 1.9 3 1. 1.10 die area15cm wafer area/dies per wafer pi7 2 / 84 2 cm 2 yield15cm 1/(1(02/2)) 2 0. die area20cm wafer area/dies per wafer pi10 2 /100 3 cm 2 yield20cm 1/(1(03/2)) 2 0. 1.10 cost/die15cm 12/(840) 0. cost/die20cm 15/(1000) 0. 1.10 die area15cm wafer area/dies per wafer pi7 2 /(841) 1 cm 2 yield15cm 1/(1 (011/2)) 2 0. die area20cm wafer area/dies per wafer pi10 2 /(1001) 2 cm 2 yield20cm 1/(1 (012/2)) 2 0. 1.10 defects per area0 (1–y^.5)/(y^.5die_area/2) (10^.5)/ (0^.52/2) 0 defects/cm 2 defects per area0 (1–y^.5)/(y^.5die_area/2) (10^.5)/ (0^.52/2) 0 defects/cm 2 1. 1.11 CPI clock rate CPU time/instr. count clock rate 1/cycle time 3 GHz CPI(bzip2) 3 109 750/(2389 109 ) 0. 1.11 SPEC ratio ref. time/execution time SPEC ratio(bzip2) 9650/750 12. 1.11. CPU time No. instr. CPI/clock rate If CPI and clock rate do not change, the CPU time increase is equal to the increase in the of number of instructions, that is 10%.

S-8 Chapter 1 Solutions

MIPS(P2) 3 109 10 6 /0 4 103

MIPS(P1) MIPS(P2), performance(P1) performance(P2) (from 11a) 1.12 MFLOPS No. FP operations 10 6 /T MFLOPS(P1) .4 5E9 1E-6/1 1 MFLOPS(P2) .4 1E9 1E-6/ 1 MFLOPS(P1) MFLOPS(P2), performance(P1) performance(P2) (from 11a) 1. 1.13 Tfp 70 0 56 s. Tnew 56 85 55 40 236 s. Reduction: 5% 1.13 Tnew 250 0 200 s, TfpTl/sTbranch 165 s, Tint 35 s. Reduction time INT: 58% 1.13 Tnew 250 0 200 s, TfpTintTl/s 210 s. NO 1. 1.14 Clock cycles CPIfp No. FP instr. CPIint No. INT instr. CPIl/s No. L/S instr. CPIbranch No. branch instr. TCPU clock cycles/clock rate clock cycles/2 109 clock cycles 512 106 ; TCPU 0 s To have the number of clock cycles by improving the CPI of FP instructions: CPIimproved fp No. FP instr. CPIint No. INT instr. CPIl/s No. L/S instr. CPIbranch No. branch instr. clock cycles/ CPIimproved fp (clock cycles/2 (CPIint No. INT instr. CPIl/s No. L/S instr. CPIbranch No. branch instr.)) / No. FP instr. CPIimproved fp (256462)/50 0 not possible 1.14 Using the clock cycle data from a. To have the number of clock cycles improving the CPI of L/S instructions: CPIfp No. FP instr. CPIint No. INT instr. CPIimproved l/s No. L/S instr. CPIbranch No. branch instr. clock cycles/ CPIimproved l/s (clock cycles/2 (CPIfp No. FP instr. CPIint No. INT instr. CPIbranch No. branch instr.)) / No. L/S instr. CPIimproved l/s (256198)/80 0. 1.14 Clock cycles CPIfp No. FP instr. CPIint No. INT instr. CPIl/s No. L/S instr. CPIbranch No. branch instr.

Chapter 1 Solutions S-

TCPU clock cycles/clock rate clock cycles/2 109 CPIint 0 1 0; CPIfp 0 1 0; CPIl/s 0 4 2; CPIbranch 0 2 1. TCPU (before improv.) 0 s; TCPU (aft er improv.) 0 s

processors

exec. time/ processor

time w/overhead speedup

actual speedup/ideal speedup 1 100 25054 100/54 1 1/2 . 42529 100/29 3 3/4 0. 8 12 16 100/16 6 6/8 0. 16 6 10 100/10 9 9/16 0.

Chapter 2 Solutions S-

2 addi f, h, -5 (note, no subi) add f, f, g

2 f = g + h + i

2 sub $t0, $s3, $s add $t0, $s6, $t lw $t1, 16($t0) sw $t1, 32($s7)

2 B[g] = A[f] + A[1+f];

2 add $t0, $s6, $s add $t1, $s7, $s lw $s0, 0($t0) lw $t0, 4($t0) add $t0, $t0, $s sw $t0, 0($t1)

2.6 temp = Array[0]; temp2 = Array[1]; Array[0] = Array[4]; Array[1] = temp; Array[4] = Array[3]; Array[3] = temp2;

2.6 lw $t0, 0($s6) lw $t1, 4($s6) lw $t2, 16($s6) sw $t2, 0($s6) sw $t0, 4($s6) lw $t0, 12($s6) sw $t0, 16($s6) sw $t1, 12($s6)

S-4 Chapter 2 Solutions

2.

Little-Endian Big-Endian Address Data Address Data 12 ab 12 12 8cd 8 ef 4ef 4 cd 01 2 0 ab 2 2882400018 2 sll $t0, $s1, 2 # $t0 <-- 4g add $t0, $t0, $s7 # $t0 <-- Addr(B[g]) lw $t0, 0($t0) # $t0 <-- B[g] addi $t0, $t0, 1 # $t0 <-- B[g]+ sll $t0, $t0, 2 # $t0 <-- 4(B[g]+1) = Addr(A[B[g]+1]) lw $s0, 0($t0) # f <-- A[B[g]+1] 2 f = 2*(&A); 2. type opcode rs rt rd immed addi $t0, $s6, 4 I-type 8 22 8 4 add $t1, $s6, $0 R-type 0 22 0 9 sw $t1, 0($t0) I-type 43 8 9 0 lw $t0, 0($t0) I-type 35 8 8 0 add $s0, $t1, $t0 R-type 0 9 8 16 2. 2.12 50000000 2.12 overflow 2.12 B 2.12 no overflow 2.12 D 2.12 overflow 2. 2.13 128 231 1, x 231 129 and 128 x 231 , x 231 128 (impossible) 2.13 128 x 231 1, x 231 129 and 128 x 231 , x 231 128 (impossible) 2.13 x 128 231 , x 231 128 and x 128 231 1, x 231 127 (impossible) S-6 Chapter 2 Solutions 2. 2.25 i-type 2.25 addi $t2, $t2, – 1 beq $t2, $0, loop 2. 2.26 20 2.26 i = 10; do { B += 2; i = i – 1; } while ( i > 0) 2.26 5*N 2 addi $t0, $0, 0 beq $0, $0, TEST LOOP1: addi $t1, $0, 0 beq $0, $0, TEST LOOP2: add $t3, $t0, $t sll $t2, $t1, 4 add $t2, $t2, $s sw $t3, ($t2) addi $t1, $t1, 1 TEST2: slt $t2, $t1, $s bne $t2, $0, LOOP addi $t0, $t0, 1 TEST1: slt $t2, $t0, $s bne $t2, $0, LOOP 2 14 instructions to implement and 158 instructions executed 2 for (i=0; i<100; i++) { result += MemArray[s0]; s0 = s0 + 4; } Chapter 2 Solutions S- 2 addi $t1, $s0, 400 LOOP: lw $s1, 0($t1) add $s2, $s2, $s addi $t1, $t1, - bne $t1, $s0, LOOP 2 fib: addi $sp, $sp, -12 # make room on stack sw $ra, 8($sp) # push $ra sw $s0, 4($sp) # push $s sw $a0, 0($sp) # push $a0 (N) bgt $a0, $0, test2 # if n>0, test if n= add $v0, $0, $0 # else fib(0) = 0 j rtn # test2: addi $t0, $0, 1 # bne $t0, $a0, gen # if n>1, gen add $v0, $0, $t0 # else fib(1) = 1 j rtn gen: subi $a0, $a0,1 # n- jal fib # call fib(n-1) add $s0, $v0, $0 # copy fib(n-1) sub $a0, $a0,1 # n- jal fib # call fib(n-2) add $v0, $v0, $s0 # fib(n-1)+fib(n-2) rtn: lw $a0, 0($sp) # pop $a lw $s0, 4($sp) # pop $s lw $ra, 8($sp) # pop $ra addi $sp, $sp, 12 # restore sp jr $ra

fib(0) = 12 instructions, fib(1) = 14 instructions,fib(N) = 26 + 18N instructions for N >=

2 Due to the recursive nature of the code, it is not possible for the compiler to in-line the function call.

2 after calling function fib: old $sp -> 0x7ffffffc ??? -4 contents of register $ra for fib(N) -8 contents of register $s0 for fib(N) $sp-> -12 contents of register $a0 for fib(N) there will be N-1 copies of $ra, $s0 and $a

Chapter 2 Solutions S-

DONE: add $v0, $s0, $ lw $ra, ($sp) addi $sp, $sp, 4 jr $ra

2 0x

2 Generally, all solutions are similar:

lui $t1, top_16_bits ori $t1, $t1, bottom_16_bits

2 No, jump can go up to 0x0FFFFFFC.

2 No, range is 0x604 + 0x1FFFC = 0x0002 0600 to 0x604 – 0x = 0xFFFE 0604.

2 Yes, range is 0x1FFFF004 + 0x1FFFC = 0x2001F000 to 0x1FFFF – 0x20000 = 1FFDF

2 trylk: li $t1, ll $t0,0($a0) bnez $t0,trylk sc $t1,0($a0) beqz $t1,trylk lw $t2,0($a1) slt $t3,$t2,$a bnez $t3,skip sw $a2,0($a1) skip: sw $0,0($a0) 2 try: ll $t0,0($a1) slt $t1,$t0,$a bnez $t1,skip mov $t0,$a sc $t0,0($a1) beqz $t0,try skip:

2 It is possible for one or both processors to complete this code without ever reaching the SC instruction. If only one executes SC, it completes successfully. If both reach SC, they do so in the same cycle, but one SC completes fi rst and then the other detects this and fails.

S-10 Chapter 2 Solutions

2.

2.46 Answer is no in all cases. Slows down the computer. CCT clock cycle time ICa instruction count (arithmetic) ICls instruction count (load/store) ICb instruction count (branch) new CPU time 0old ICaCPIa1oldCCT oldIClsCPIls1oldCCT oldICbCPIb1oldCCT Th e extra clock cycle time adds suffi ciently to the new CPU time such that it is not quicker than the old execution time in all cases. 2.46 107%, 113% 2. 2.47 2. 2.47 0. 2.47 0.

Solutions

3

Chapter 3 Solutions S-

3 5730

3 5730

3 0101111011010100

Th e attraction is that each hex digit contains one of 16 diff erent characters (0–9, A–E). Since with 4 binary bits you can represent 16 diff erent patterns, in hex each digit requires exactly 4 binary bits. And bytes are by defi nition 8 bits long, so two hex digits are all that are required to represent the contents of 1 byte. 3 753 3 7777 (3777) 3 Neither (63) 3 Neither (65) 3 Overfl ow (result 179, which does not fi t into an SM 8-bit format) 3 105 42 128 (147) 3 105 42 63 3 151 214 255 (365) 3 62 12 Step Action Multiplier Multiplicand Product 0 Initial Vals 001 010 000 000 110 010 000 000 000 000 lsb=0, no op 001 010 000 000 110 010 000 000 000 000 1 Lshift Mcand 001 010 000 001 100 100 000 000 000 000 Rshift Mplier 000 101 000 001 100 100 000 000 000 000 Prod=Prod+Mcand 000 101 000 001 100 100 000 001 100 100 2 Lshift Mcand 000 101 000 011 001 000 000 001 100 100 Rshift Mplier 000 010 000 011 001 000 000 001 100 100 lsb=0, no op 000 010 000 011 001 000 000 001 100 100 3 Lshift Mcand 000 010 000 110 010 000 000 001 100 100 Rshift Mplier 000 001 000 110 010 000 000 001 100 100 Prod=Prod+Mcand 000 001 000 110 010 000 000 111 110 100 4 Lshift Mcand 000 001 001 100 100 000 000 111 110 100 Rshift Mplier 000 000 001 100 100 000 000 111 110 100 lsb=0, no op 000 000 001 100 100 000 000 111 110 100 5 Lshift Mcand 000 000 011 001 000 000 000 111 110 100 Rshift Mplier 000 000 011 001 000 000 000 111 110 100 lsb=0, no op 000 000 110 010 000 000 000 111 110 100 6 Lshift Mcand 000 000 110 010 000 000 000 111 110 100 Rshift Mplier 000 000 110 010 000 000 000 111 110 100

Chapter 2. Instructions: Language of the Computer

Chapter 2. Instructions: Language of the Computer

ㆍInstructions를 이해할 수 있다.

2.1 – Introduction

2.2 – Operations of the Computer Hardware

2.3 – Operands of the Computer Hardware

2.4 – Signed and Unsigned Numbers

2.5 – Representing Instructions in the Computer

2.6 – Logical Operations

2.7 – Instructions for Making Decisions

2.8 – Supporting Procedures in Computer Hardware

2.9 – Communicating with People

2.10 – MIPS Addressing for 32-Bit Immediates and Addresses

2.11 – Parallelism and Instructions: Synchronization

2.12 – Translating and Starting a Program

2.13 – A C Sort Example to Put It All Together

2.14 – Arrays versus Pointers

2.15 – Advanced Material: Compiling C and Interpreting Java

2.16 – Real Stuff: ARMv7 (32-bit) Instructions

2.17 – Real Stuff: x86 Instructions

2.18 – Real Stuff: ARMv8 (64-bit) Instructions

2.19 – Fallacies and Pitfalls

2.20 – Concluding Remarks

(목차를 블록 선택 후, Ctrl+F로 탐색 가능 – 브라우저에 따라 다를 수 있음)

<2.1 - Introduction>

Instructions Set

명령어 집합

*컴퓨터에서 사용되는 instruction(명령, 작업)의 레퍼토리(순서를 가진 목록)

*다른 컴퓨터는 다른 instruction set을 가짐

ㆍ그래도 대부분 공통된 특성을 가지고 있음

*초기 컴퓨터는 아주 단순한 instruction set을 가졌었음

ㆍSimplefied implementation

*많은 현대의 컴퓨터들도 단순한 instructions set을 가지고 있음

ㆍ초창기에 단순했고, 복잡해지다가, 다시 단순해지는.

복잡했던(Complex IS) 시기가 있었음.

Instruction Set Architecture (ISA)

명령어 집합 구조

https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%EC%96%B4_%EC%A7%91%ED%95%A9

https://en.wikipedia.org/wiki/Instruction_set_architecture

*ISA(또는 간단히 architecture)란, hardware와 저레벨 software(system software, 운영체제)간의 추상적인 인터페이스로,

instruction, register, memory access, I/O 등을 포함한

기계어 프로그램을 작성하기 위해 필요한 모든 정보를 일컫는다.

이런 필요한 정보들을 모아 hardware에 주면, hardware가 이것을 실행.

ㆍ다양한 비용 및 성능을 가진 머신에서 동일한 software를 구동하는 것을 가능하게 함

*기본 ISA와 운영체제 인터페이스를 합쳐서 the application binary interface(ABI)라고도 부른다.

ㆍ유저 입장에서 중요한데,

어떤 프로그램이 특정 머신에서 실행이 가능할 때(e.g., ISA – Intel CPU, OS – Windows),

ABI가 같다면 이 머신에서도 실행이 가능하다는 것.

ㆍABI는 다양한 컴퓨터에 binary 이식성을 위한 기준으로 정의된다.

유저층의 IS와 운영체제 인터페이스는 application 프로그래머에게 사용된다.

The MIPS Instruction Set

※MIPS = Millions Instructions Per Second

*Stanford MIPS는 MIPS Technologies에 의해 상용화되었다. (www.mips.com)

ㆍMIPS는 CPU 이름이기도 함, 여기에서 상용화ㅇㅇ

이 CPU에서 사용되는 ISA를 볼 것임.

*embedded core 시장에서 높은 점유율

ㆍ가전기기, 네트워크/저장 장치, 카메라, 프린터 등에 사용됨

ㆍ최근에는 ARM이라는 CPU도 많이 쓰이지만.. 여튼 임베디드 시스템에서 높은 점유율ㅇㅇ

*전형적인 현대의 ISA들과 비슷한 특성들을 공유함

ㆍMIPS 참조 자료의 별책이나, Appendix B, E를 보자

<2.2 - Operations of the Computer Hardware>

Arithmetic Operations

산술

*덧셈과 뺄셈 – 삼항연산

ㆍ2개의 source와 하나의 destination

[Assembly] ADD a, b, c (a에 b+c의 값을 저장)

*모든 산술 operation들은 이와 같은 형태를 지님

*설계 원칙 1: Simplicity favors regularity.

간결성(simplicity)는 규칙성(regularity)을 선호한다. 규칙성을 이용하여 간결하게 만든다.

ㆍ규칙성(regularity)은 구현을 수월하게(간결하게) 해 줌.

ㆍ간결성(simplicity)은 저 cost에서도 성능을 높일 수 있도록 해 줌.

간단하게 만들어야 낮은 가격의 머신에서도 높은 성능을 이끌어낼 수 있음.

Arithmetic 예제

ㆍC Code:

f = (g + h) – (i + j);

ㆍCompiled MIPS code:

add t0, g, h # temp t0 = g + h;

add t1, i, j # temp t1 = i + j;

sub f, t0, t1 # f = t0 – t1;

(※ t0, t1은 레지스터)

(이해를 돕기 위해 변수를 그대로 사용한 것이지, 모든 연산은 레지스터에 들어간 값들로 이루어짐)

<2.3 - Operands of the Computer Hardware>

Register Operands

*산술 instruction들은 register operand를 사용한다.

(레지스터를 연산처리기로 사용한다는 뜻)

*MIPS는 32개의 32-bit register 파일을 갖는다.

ㆍ자주 접근하는 데이터를 위한 고속의 저장소

ㆍ0~31까지 번호로 매겨짐

ㆍ32-bit 데이터는 한 “word”로 불림. 32-bit 데이터의 단위이기도 함.

*Assembler 이름들

ㆍ임시값(temporary values)에 사용되는 것으로,

$t0, $t1, …, $t9 라는 이름을 사용하는 레지스터.

ㆍ저장된 변수들(saved variables)에 사용되는 것으로,

$s0, $s1, …, $s7 이라는 이름을 사용하는 레지스터.

*설계 원칙 2: Smaller is faster. 작을 수록 빠르다.

ㆍc.f. 메인 메모리: 수백만개의 구역을 가짐

하지만, 레지스터는 32-bit가 32개일 뿐인 굉장히 작은 저장소.

용량이 적은 초고속의 메모리.

Register Operand 예제

*C Code:

f = (g + h) – (i + j);

ㆍf, …, j는 $s0, …, $s4에 담겨질 것임(mapping 되어있음)

*Compiled MIPS code:

add $t0, $s1, $s2 # temp t0 = g + h;

add $t1, $s3, $s4 # temp t1 = i + j;

sub $s0, $t0, $t1 # f = t0 – t1;

Byte Addresses

*Byte(8-bit)는 매우 유용하므로, 많은 아키텍처들은 메모리에서 byte 단위를 사용한다. (주소의 단위는 byte이다.)

ㆍAilgnment(정렬) 제한 – 32-bit 프로세서에서 메모리 주소들은 word(32bit = 4byte) 단위로 묶여진다.(MIPS-32에서도 4개씩)

32-bit 프로세서는 기본 access 단위가 32bit=4byte=1word.

*Big Endian: 가장 왼쪽 byte가 word address이다.

ㆍIBM 360/370, Motorola 68k, MIPS, Sparc, HP PA

*Little Endian: 가장 오른쪽 byte가 word address이다.

ㆍIntel 80×86, DEC Vax, DEC Alpha (Windows NT)

주소증가방향→ little endian bytes lsb 0x0D 0x0C 0x0B 0x0A msb msb 0x0A 0x0B 0x0C 0x0D lsb big endian bytes

little endian은 그대로(작은 곳에 작은 자릿수),

big endian은 뒤집혀서(작은 곳에 큰 자릿수) 저장.

32bit의 데이터를 32bit 메모리 공간에 어떻게 저장할 것인가라는 것이 endian.

※MSB(Most Significant Bit): 가장 큰 자릿 수의 비트, 가장 왼쪽의 비트.

LSB(Least Significant Bit): 가장 작은 자릿 수의 비트, 가장 오른쪽의 비트.

Memory Operands

*메인 메모리는 복합 데이터를 다룸.

ㆍ배열, 구조체, 동적 데이터, …

*산술 연산을 하려면,

ㆍ메모리에서 레지스터로 값을 적재시켜야 함

ㆍ연산 결과는 레지스터에서 다시 메모리로 가져옴

*메모리는 byte단위로 접근함

ㆍ주소 한 칸은 byte(8-bit)로 이루어짐

*word 단위로 메모리에 정렬됨

ㆍ주소들은 4개 단위(word=4byte=32bit)로 묶여짐

*MIPS는 Big Endian

ㆍMost-significant Byte(가장 큰 자릿 수(왼쪽)의 바이트)가 word(4byte)의 least address(가장 작은 자리(오른쪽)의 주소)에 위치함. 즉, byte 단위로 뒤집혀서 들어감.

ㆍc.f., Little Endian: least-significant byte가 least address에. 그대로.

Memory Operand 예제 1

ㆁC code:

g = h + A[8];

*g는 $s1에, h는 $s2에, A의 base address는 $s3에.

ㆁCompiled MIPS code:

*index 8은 32(4*8 ← 0,4,8,12,16,20,24,28,32)의 offset을 필요로 함.

ㆍword는 4byte.

lw $t0, 32($s3) # load word (메모리($s3)에 담긴 주소(+32)를 이용하여 한 word만큼의 데이터를 $t0에 로드)

add $s1, $s2, $t0

│ └ base register

└ offset

Memory Operand 예제 2

ㆁC code:

A[12] = h + A[8];

*h는 $s2에, A의 base address는 $s3에.

ㆁCompiled MIPS code:

*index 8은 32(4*8 ← 0,4,8,12,16,20,24,28,32)의 offset을 필요로 함.

lw $t0, 32($s3) # load word

add $t0, $s2, $t0

sw $t0, 48($s3) # store word ($t0에 있는 한 word만큼의 데이터를 메모리($s3)에 담긴 주소(+48)에 저장)

Register vs. Memory

*메모리에 직접 접근하는 것보다 레지스터에 접근하는 것이 훨씬 빠름

*메모리의 데이터를 (레지스터에서) 이용하기 위해

레지스터에 데이터를 불러오고(load) 다시 메모리에 저장하는(store) 방법을 이용한다. Load-Store Architecture

※ MIPS는 Load-Store Architecture이다.

ㆍLoad와 Store를 반복하므로, 많은 instruction들이 수행된다.

*컴파일러는 가능한 변수들을 레지스터를 활용하여 처리해야 한다.

ㆍ변수 처리를 위해 메모리에 접근하는 일을 덜 빈번하도록.

ㆍ레지스터 최적화는 매우 중요하다!

가능한 메모리에 접근하는 횟수를 줄여서 Load와 Store instruction을 적게 할 수 있도록.

MIPS Register File

ㆁ32개의 32-bit 레지스터들을 갖는다. 이 레지스터 집합에는,

*2개의 read 포트 (src1 addr, src2 addr)

*1개의 write 포트 (dst addr)

32개의 레지스터 주소(0~31)를 위한 것이므로, 각각 5bit(2^5-1=31)만 담을 수 있어도 충분.

ㆁ레지스터는,

*메인메모리보다 빠르다

ㆍ하지만 구성되는 레지스터 수가 많을 수록 속도는 느리다.

ㆍ(e.g., 64개의 레지스터 집합이 32개의 레지스터 집합보다 50% 이상 느릴 수 있다)

ㆍread/write 포트의 증가는 속도에 2차 함수적인 영향을 준다. (정비례가 아니라, ^2)

*컴파일러가 쓰기에 더 용이하다

ㆍe.g., (A*B) ~ (C*D) ~ (E*F) 어느 순서로든 연산할 수 있다. (스택에 비해)

*변수를 저장할 수 있다

ㆍ코드의 밀도를 향상시킨다. (레지스터는 메모리보다 적은 비트 수로 불리기 때문에(5bits<32bits)) MIPS Register Convention 번호 이름 용도 호출 중에 값이 변하지 않는지 0 $zero 항상 0 ( hardware ) n.a. (해당없음) 1 $at 어셈블러만 사용하도록 예약된. (프로그래머는 X) n.a. 2~3 $v0~$v1 반환값 (서브루틴. 함수호출) no 4~7 $a0~$a3 argument(매개값) (서브루틴. 함수호출) yes 8~15 $t0~$t7 임시 값들 (rvalue) no 16~23 $s0~$s7 저장되는 용도의 값 (변수, lvalue) yes 24~25 $t8~$t9 임시 값들 (rvalue) no 26~27 $k0~$k1 OS 커널만 사용하도록 예약된. no 28 $gp global 포인터 yes 29 $sp stack 포인터 yes 30 $fp frame 포인터 yes 31 $ra 반환 주소 ( hardware ) yes Immediate Operands 즉각 연산(변수가 아닌 상수로 바로) *instruction에 상수(constant data)를 사용함 addi $s3, $s3, 4 ※ 앞서 본 산술 연산에서는 피연산자든 결과 저장이든 모두 변수였으나, 계산에 상수가 포함되는 연산. *immediate instruction에 감산(subtract, 뺄셈)은 지원하지 않음 ㆍ그러므로 덧셈(add)에 음수(-)값을 사용 addi $s2, $s1, -1 *설계 원칙 3: 일반적인 경우(자주 사용되는 경로)를 빠르게 해라 ㆍ작은 수의 상수(e.g., 0, 1, -1 등)는 프로그래밍에서 자주 사용됨 큰 수는 덜 자주 사용됨. immediate operand가 지원되면 작은 값은 상수로 바로 사용 가능. ㆍ즉, immediate operand는 load instruction을 줄여줌. (더 빠르게 동작하도록 해줌) The Constant Zero *MIPS 레지스터의 0번 레지스터($zero)는 항상 0이다. ㆍ값을 변경할 수 없는 고정된 상수. 읽기만 가능한 레지스터. *많은 작업들에 유용함 ㆍe.g., 레지스터간의 이동 add $t2, $s1, $zero $s1의 값을 그대로(0을 더해봤자) $t2에 임시로 저장. 값 복사. 잠깐 복습, Application Binary Interface(ABI)의 정의는? ㆍThe user portion of the instruction set(IS) plus the operating system interfaces used by application programmers. ㆍISA와 운영체제 인터페이스를 합쳐서 the application binary interface(ABI)라고도 부른다. ㆍABI가 같다면 같은 프로그램을 실행할 수 있는 머신. <2.4 - Signed and Unsigned Numbers>

Unsigned Binary Integers

부호 없는 이진 정수

*n-bit 수들의 합으로 이루어짐(2의 n승의 수들의 합)

*범위: 0 ~ 2^n – 1

(8비트면 8칸인데, 0부터 시작하므로, MSB는 2^7의 여부(0or1)를 표현함.

2^7부터 2^0까지 모두 1이라면, 11111111인데, 2^8에서 1을 뺀 수와 같음

(1만 더해도 자릿수가 오르면서 2^8이 될테니. 칸만 된다면.)

그러므로 최대 표현 가능한 수는 2^n – 1.)

*예시

= 0 + … + 1*2^3 + 0*2^2 + 1*2^1 + 1*2^0

= 0 + … + 8 + 0 + 2 + 1 = 11_10

*32비트라면,

ㆍ0 ~ 4,294,967,295

2-s Component Signed Integers

2의 보수 방식 의 부호 있는 정수 표현

*역시 n-bit 수들의 합으로 이루어짐 (이번엔 가장 큰 단위는 음수로. MSB가 부호의 역할)

*범위: -2^(n-1) ~ 2^(n-1) – 1

MSB가 가장 큰 자리의 음수를 표현할 수 있고,

나머지 비트들이 1로 모두 가득 차봐야 MSB를 상쇄하지 못하고 -1이 됨.

(MSB가 1이면 무조건 음수라고 보면 됨)

그러므로 가장 작은 수는 1000…000 비트인 -2^(n-1)이 되고,

가장 큰 수는 0111…111 비트인 2^(n-1) – 1이 될 것.

(unsigned 표현에서는 MSB도 양수이므로 최댓값이 2^n – 1이었던 것에 비해 이진 자릿수가 한 칸 내려감)

*예시

= -1*2^31 + 1*2^30 + … + 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0

= -2,147,483,648 + 2,147,483,644 = -4_10

*32비트라면,

ㆍ-2,147,483,648 ~ 2,147,483,647

*31비트(MSB)는 부호 비트

(위의 범위에서 설명)

ㆍ1이면 음수

ㆍ0이면 음수가 아님(0이거나 양수)

*-(-2^(n-1)), 즉, 양의 2^(n-1)은 표현 불가능

*음수가 아닌(MSB가 0인) 수는 unsigned 표현과 비트 표현이 동일하다

*몇몇 수들의 비트 표현

ㆍ 0: 0000 0000 … 0000

ㆍ-1: 1111 1111 … 1111

ㆍMost-negative: 1000 0000 … 0000

ㆍMost-positive: 0111 1111 … 1111

Signed Negation

부호 반전(양을 음으로, 음을 양으로. *-1)

*보수(complement)를 취하고, 1을 더한다

ㆍ2의 보수란, 1은 0으로, 0은 1로.

x = 1001001 이라면, 보수는 0110110.

기존 수와 보수의 합은 항상 111…111_2.

*예제: 2를 음수로(-2로)

ㆍ 2= 0000 0000 … 0010_2

ㆍ-2= 1111 1111 … 1101_2 + 1

= 1111 1111 … 1110_2

Sign Extension

수의 비트 범위 확장(8-bit에서 더 큰 16-bit 등..)

*같은 수를 더 많은 비트를 이용하여 표현

ㆍ값(수학적 의미)은 보존시키면서. (지금은 정수표현에 대해서 보고 있음)

※ MIPS에서의 Instruction set

ㆍaddi: immediate value를 늘림

ㆍlb, lh: loaded byte/halfword를 늘림

ㆍbeq, bne: displacement를 늘림

*부호 비트와 같은 값을 왼쪽으로 늘려주면 됨

ㆍc.f., unsigned 값: 0을 늘리면 됨

*예시: 8-bit에서 16-bit로

ㆍ 2: 0000 0010 → 0000 0000 0000 0010

ㆍ-2: 1111 1110 → 1111 1111 1111 1110

<2.5 - Representing Instructions in the Computer>

Representing Instruction

*Instruction들은 binary로 인코딩된다.

ㆍ이 binary 코드들은 기계어(machine code)라고 불린다.

*MIPS instructions

ㆍ32-bit의 word로 인코딩된다

ㆍ적은 종류의 포맷(규칙)으로 되어 있다 – operation code(opcode), register number, …

ㆍ정격성(규칙성)을 갖는다

*레지스터 번호

ㆍ$t0 ~ $t7은 레지스터 번호가 8~15이다.

ㆍ$t8 ~ $t9는 레지스터 번호가 24~25이다.

ㆍ$s0 ~ $s7은 레지스터 번호가 16~23이다.

MIPS R-format Instructions

R-format. 산술 연산

op rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits

*Instruction 필드(영역)

ㆍop: operation code(opcode) (어떤 종류의 연산을 할지)

ㆍrs: first source(source) register number (피연산자1이 들어있는 레지스터 번호)

ㆍrt: second source(target) register number (피연산자2가 들어있는 레지스터 번호)

ㆍrd: destination register number (연산결과가 담길 레지스터 번호)

ㆍshamt: shift amount (00000 for now)

ㆍfunct: function code (extends opcode) (opcode와 함께 어떤 종류의 연산을 할지)

add $t0, $s1, $s2

special $s1 $s2 $t0 0 add 0 17 18 8 0 32 000000 10001 10010 01000 00000 100000

00000010001100100100000000100000_2 = 02324020_16

Hexadecimal

16진수

*16진법

ㆍbit를 좀 더 압축적으로

ㆍ앞에 0x를 붙이면(0xFF) 16진수 표현, 0b를 붙이면(0b11) 2진수 표현.

수 binary hexadecimal 수 binary hexadecimal 0 0000 0 8 1000 8 1 0001 1 9 1001 9 2 0010 2 10 1010 A 3 0011 3 11 1011 B 4 0100 4 12 1100 C 5 0101 5 13 1101 D 6 0110 6 14 1110 E 7 0111 7 15 1111 F

*예시: eca8 6420

ㆍ1110 1100 1010 1000 0110 0100 0010 0000

MIPS I-format Instructions

I-format.

op rs rt constant or address 6 bits 5 bits 5 bits 16 bits

*Immediate arithmetic과 load/store instructions에 이용되는 포맷

ㆍrt: destination(목적지) 혹은 source2(피연산자2) 레지스터 번호

ㆍconstant: -2^15 ~ 2^15 – 1 의 수를 표현 가능

ㆍaddress: rs에 담긴 base address로부터 얼마나 멀리있는지(offset)

*설계 원칙 4: 좋은 설계는 좋은 타협을 필요로 한다.

ㆍImmediate arithmetic과 load/store instruction은 다른 종류의 작업이지만,

I-format으로 모두 표현할 수 있다.

ㆍ다른 종류의 작업들을 한 포맷으로 표현하면 decode(복호화, 비트코드를 명령으로 인식)하는 것을 어렵게 만들지만,

32-bit instruction들을 균일하도록 해준다.

ㆍ가능한 포맷이 적도록 같은 크기로 표현 가능한 작업들을 묶어야 한다. 고성능을 위해.

Stored Program Computers

*instruction들은 binary로 표현된다. 마치 data처럼.

*instruction들과 data들은 메모리에 적재(store)된다.

*프로그램들은 다른 프로그램 위에서 동작하기도 한다.

ㆍe.g., 컴파일러, 링커, …

*Binary compatibility(binary 일치성)은 컴파일된 프로그램들이 다른 컴퓨터에서도 작동하도록 해준다.

ㆍStandardized ISAs (정규화된 ISA)

<2.6 - Logical Operations>

Logical Operations

논리 연산

*bit단위 조작을 위한 instruction

Operation C Java MIPS 왼쪽으로 Shift << << sll 오른쪽으로 Shift >> >>> srl Bit단위 AND & & and, andi Bit단위 OR | | or, ori Bit단위 NOT ~ ~ nor

*word(32bit의 비트집합)에서 비트그룹을 추출하거나 새로 집어넣는데 유용

Shift Operations

(MIPS R-format Instruction)

op rs rt rd shamt funct 6 bits 5 bits 5 bits 5 bits 5 bits 6 bits

*shamt: 몇 칸이나 shift할 것인가

*왼쪽으로 Shift

ㆍ전체 비트가 왼쪽으로 이동하며, 오른쪽의 빈 공간들은 0으로 채워짐.

ㆍMIPS instruction에서 sll로 표현

ㆍi비트만큼 왼쪽으로 shift한 것은, 2^i만큼 곱한 것과 같음.(정수 표현에서)

*오른쪽으로 Shift

ㆍ전체 비트가 오른쪽으로 이동하며, 왼쪽의 빈 공간들은 0으로 채워짐.

ㆍMIPS instruction에서 srl로 표현

ㆍi비트만큼 오른쪽으로 shift한 것은, 2^i만큼 나눈 것과 같음.(부호없는 정수 표현에서)

(부호있는 정수표현에서 MSB가 무조건 0이되므로 음의 여부도 달라질 수 있음)

AND Operations

*word에서 특정 부분의 비트들에 주목할 때 유용

ㆍ특정 비트들을 선택하고, 나머지는 0으로 볼 때

and $t0, $t1, $t2

$t2 0000 0010 0101 1100 0000 1101 1100 0110 $t1 0000 0000 0000 0000 00 11 11 00 0000 0000 $t0 0000 0000 0000 0000 00 00 11 00 0000 0000

OR Operations

*word에서 특정 부분을 포함시키고 싶을 때 유용

ㆍ특정 비트 부분을 무조건 1로 바꾸고, 나머지는 그대로 계승하고 싶을 때

or $t0, $t1, $t2

$t2 0000 0000 0000 0000 0000 1101 1100 0000 $t1 0000 0000 0000 0000 00 11 11 00 0000 0000 $t0 0000 0000 0000 0000 00 11 1101 1100 0000

NOT Operations

*word의 비트들을 모두 반전시키고 싶을 때 유용

ㆍ0은 1로, 1은 0으로

*MIPS는 NOR 3항 연산(3-operand instruction)으로 구현한다

ㆍa NOR b 는 NOT (a OR b) 를 의미한다.

(b가 0비트들이면, a OR b는 a 그 자체이므로, NOT a)

(※ 레지스터 0: 항상 0으로 읽히는)

$t1 0000 0000 0000 0000 0011 1100 0000 0000 $t0 1111 1111 1111 1111 1100 0011 1111 1111

<2.7 - Instructions for Making Decisions>

branch(분기)와 관련된. C언어의 if-else문 같은.

Conditional Operations

조건

*만약 조건(condition)이 true라면, 표시(label)된 instruction으로 향하게 하는 분기(branch)

ㆍ그렇지 않으면(false), 그대로 진행(continue sequentially)

*beq rs, rt, L1

ㆍ만약 rs==rt 라면, L1이라고 표시된 instruction으로 이동

*bne rs, rt, L1

ㆍ만약 rs!=rt 라면, L1이라고 표시된 instruction으로 이동

*j L1

ㆍ무조건 L1이라고 표시된 instruction으로 이동

Compiling If Statements

If 구문 컴파일

*C code:

if (i == j) f = g + h;

else f = g – h;

ㆍf는 $s0에, g는 $s1에, h는 $s2에, i는 $s3에, j는 $s4에.

*컴파일된 MIPS code:

bne $s3, $s4, Else

add $s0, $s1, $s2

j Exit

Else: sub $s0, $s1, $s2

Exit: … ← 어셈블러가 계산한 주소

Compiling Loop Statements

반복 구문 컴파일

*C code:

while (save[i] == k) i += 1;

ㆍi는 $s3에, k는 $s5에, 배열 save의 시작 주소는 $s6에.

*컴파일된 MIPS code:

Loop: sll $t1, $s3, 2 (처음 주어질 i index만큼의 주소(4byte)를 위해 2^2=4를 곱해둠)

add $t1, $t1, $s6 (offset(위에서 구해둔 i*4)에 시작 주소 더하면 save[i]의 주소)

lw $t0, 0($t1)

bne $t0, $s5, Exit

addi $s3, $s3, 1

j Loop

Exit: …

Basic Blocks

*Basic block이란 instruction들의 순서대로 모인 집합이다.

ㆍembedded branch(일체형 분기)는 없다.(끝 부분을 제외하고. 끝에는 있을 수 있음.)

ㆍbranch target(분기 대상, labeled)은 없다.(처음 시작 부분을 제외하고. 처음에는 있을 수 있음.)

ㆍ즉, 중간에는 branch(분기)도 없고, labeled된(점프할 곳으로 지정된) 곳도 없다. 분기가 없는 일련의 연속 작업 덩어리.

*컴파일러는 최적화를 위해 이런 basic block들을 찾아낸다.

*진보된(고성능) 프로세서는 basic block들의 수행을 가속시킬 수 있다.

More Conditional Operations

더 조건적인. 한 조건으로 1or0. 이전에는 점프로 직접 조절.

*만약 조건이 true라면 결과를 1로 설정

ㆍ그렇지 않다면, 0으로 설정

*slt rd, rs, rt

ㆍif (rs < rt) rd = 1; else rd = 0; *slti rt, rs, constant ㆍif (rs < constant) rt = 1; else rt = 0; *beq와 bne의 혼합으로 사용한다 slt $t0, #s1, $s2 # if ($s1 < $s2) bne $t0, $zero, L # 0이 아니면(1) L로 이동. branch not equal Branch Instruction Design 분기 명령 설계 *왜 blt(branch less than), bge(branch greater or equal), ...은 없는가? *하드웨어 입장에서 <, ≥의 연산은 =, ≠ 보다 느리다.(복잡하다) ㆍ모든 분기를 지원하면, 한 instruction마다 기존보다 더 많은 일을 수행하고 되고, 클럭 속도가 느려진다. ㆍ모든 instruction 전체가 불이익을 받는다.(느려진 클럭 속도로) *beq와 bne가 더 일반적인 경우로 잦게 쓰인다. *좋은 설계를 위한 타협이다. Signed vs. Unsigned 부호있는 vs. 부호없는 ㆁ부호있는 비교: slt, slti ㆁ부호없는 비교: sltu, sltui ㆁ예제 *$s0 = 1111 1111 1111 1111 1111 1111 1111 1111 *$s1 = 0000 0000 0000 0000 0000 0000 0000 0001 *slt $t0, $s0, $s1 ㆍ-1 < 1 ??→YES→ $t0 = 1. *sltu $t0, $s0, $s1 ㆍ4,294,967,295 < 1 ??→NO→ $t0 = 0. 잠깐 복습, ISA(Instruction set architecture)란? 하드웨어와 저수준(the lowest level) 소프트웨어간의 추상적인 인터페이스 <2.8 - Supporting Procedures in Computer Hardware>

6 Steps in Execution of a Procedure

프로시저(함수(function). 어떤 작업.) 실행의 6가지 단계

1. 메인 routine[Caller]이 파라미터(매개값)를 프로시저[Callee]가 접근가능한 곳에 위치시킨다.

※ $a0~$a3: 매개값을 위한 4개의 레지스터

2. Caller가 제어권(control)을 Callee에게 넘겨준다.

3. Callee는 필요한 storage(메모리)를 얻는다.

4. Callee는 요구되는 일(하기로 된 서브루틴 작업)을 수행한다.

5. Callee는 결과값을 Caller가 접근가능한 곳에 위치시킨다.

※ $v0~$v1: 결과값을 위한 2개의 레지스터

6. Callee는 제어권(control)을 Caller에게 반납한다.

※ $ra: 하드웨어가 사용하는, 반환 주소를 위한 레지스터. Caller에게 제어권을 주기 위한 주소.

Register Usage

MIPS에서. 2.3에서 봤던.

번호 이름 용도 호출 중에 값이 변하지 않는지 0 $zero 항상 0 ( hardware ) n.a. (해당없음) 1 $at 어셈블러만 사용하도록 예약된. (프로그래머는 X) n.a. 2~3 $v0~$v1 반환값 (서브루틴. 함수호출) no 4~7 $a0~$a3 argument(매개값) (서브루틴. 함수호출) yes 8~15 $t0~$t7 임시 값들 (rvalue) no 16~23 $s0~$s7 저장되는 용도의 값 (변수, lvalue) yes 24~25 $t8~$t9 임시 값들 (rvalue) no 26~27 $k0~$k1 OS 커널만 사용하도록 예약된. no 28 $gp global 포인터 yes 29 $sp stack 포인터 yes 30 $fp frame 포인터 yes 31 $ra 반환 주소 ( hardware ) yes

Procedure Call Instructions

ㆁ프로시저 호출(call): jal(jump and link) (※ 그냥 점프는 j였음)

jal “Procedure Label”

*바로 다음에 올 instruction의 주소를 $ra에 담는다.(프로시저(서브루틴)가 종료되면 다음으로 진행되기 위해)

*대상 주소(프로시저가 수행되기 위해 label 된)로 점프

ㆁ프로시저 리턴(return): jr(jump register)

jr $ra

*프로그램 카운터(program counter, PC)에 $ra를 복사한다.

(PC는 현재 실행하고 있는 명령의 메모리 주소가 담기는 레지스터.

즉, 프로시저 다음의 명령 주소로 돌아와 계속 진행하려는 것.)

*jr은 computed jump에 사용되기도 있다.

ㆍe.g., case/switch 구문에

Leaf Procedure 예제

Leaf Procedure: 함수 내에서 다른 함수를 호출하지 않음

*C code:

int leaf_example(int g, h, i, j)

{

int f;

f = (g + h) – (i + j);

return f;

}

ㆍ매개변수들 g는 $a0에, h는 $a1에, i는 $a2에, j는 $a3에.

ㆍf는 $s0에. (여기서부터는 이 루틴 안이므로, 스택으로써 $s0에)

ㆍ반환값은 $v0에.

*MIPS code:

Non-Leaf Procedures

*프로시저 내에서 다른 프로시저를 호출하는 형태

*내포된(nested) 호출(call)이 있으므로, Caller는 스택에 다음 값들을 저장해야 한다.

ㆍ반환될 주소. Leaf와 다르게 $ra 하나에 의존할 수 없으니..

ㆍ필요한 매개값이나 임시값들

*call 이후에(한 루틴이 끝나면) 스택에 저장해둔 값을 복귀시켜야 한다.

*C code: recursive function(재귀함수)로 팩토리얼 구하기

int fact(int n)

{

if (n < 1) return 1; else return n * fact(n - 1); } ㆍ매개변수 n은 $a0에. ㆍ반환값은 $v0에. *MIPS code: Local Data on the Stack 프로그램에서 프로시저(function)가 호출 될 때 메모리가 어떻게 할당되는지. 스택 할당(allocation). 프로시저 호출에서, (a) 전, (b) 도중, (c) 후. *$sp는 스택의 top을 가리키고(activation record의 끝 주소), $fp(frame pointer)는 이번 프로시저에 할당되기 직전 가리키고 있던 스택포인터를 가리킴(activation record의 시작 주소) *procedure frame (activation record) ㆍ$fp에서 $sp까지. 하나의 function을 실행할 때 할당되는 메모리 공간. ㆍ몇몇 컴파일러들은 스택 공간을 관리하기 위해 사용한다. *local data는 Callee에 의해 할당된다. Memory Layout 프로그램과 데이터를 위한 MIPS 메모리 할당 *Text: 프로그램 코드 (instruction들) ㆍpc(program counter)가 이 영역에서 움직이면서 현재 실행될 instruction을 가리킨다. *Static data: 전역 변수들 ㆍe.g., C에서 static 변수, constant array나 string, ... ㆍ$gp(global pointer)는 Static data를 가리키기 쉽도록, Text의 끝과 Dynamic data의 시작의 중간에 위치하여, ±offset으로 데이터를 가리켜 준다. (MIPS에서는 중간. 다른 프로세서는 다르게 동작할 수도 있음.) *Dynamic data: heap 메모리에 할당 ㆍe.g., C에서 malloc, Java나 C++에서 new, ... *Stack: 현재 영역에서 사용할 자료 및 복귀 주소 등 ㆍactivation record들이 쌓였다 복구됨. <2.9 - Communicating with People>

Character Data

문자 데이터

ㆁbyte-encoded(1byte=8bit) character sets

*ASCII: 128(2^7)개의 문자 표현

ㆍ95개의 그래픽, 33개의 제어용

*Latin-1: 256(2^8)개의 문자 표현

ㆍASCII 보다 96개의 그래픽이 더 많음(191)

ㆁUnicode: 32-bit character set

*Java, C++ 등에서 쓰임

*대부분의 국가 언어 문자와 기호를 표현 가능

*UTF-8, UTF-16: 여러 길이의 인코딩이 존재함

Byte/Halfword Operations

(1Byte(8bits)/2Bytes(16bits))

*bitwise operation으로 1비트씩 옮길 수도 있지만,

byte/halfword 단위로도 데이터 이동이 가능하다.

*MIPS byte/halfword load/store

(String 처리가 일반적인 경우이다.)

lb rt, “offset”(rs) lh rt, “offset”(rs)

ㆍ메모리 주소로부터 부호있는 값의 하위 8/16비트들을 불러와,

32비트로 늘려서(LSB의 값과 같은 비트가 복제되어 왼편에 나열)

레지스터(rt)에 불러옴.

lbu rt, “offset”(rs) lhu rt, “offset”(rs)

ㆍ메모리 주소로부터 부호없는 값의 하위 8/16비트들을 불러와,

32비트로 늘려서(LSB 왼편은 모두 0으로 나열)

레지스터(rt)에 불러옴.

sb rt, “offset”(rs) sh rt, “offset”(rs)

ㆍrt의 값 중 하위 8/16비트의 값을 메모리 주소가 가리키는 곳에 저장.

String 복사 예제

*C code:

ㆍnull문자(\0)로 끝나는 string

void strcpy (char x[], char y[])

{

int i = 0;

while ((x[i]=y[i]) != ‘\0’)

{

++i;

}

}

ㆍx, y의 주소는 각각 레지스터 $a0, $a1에.

ㆍi의 값은 $s0에.

*MIPS code:

잠깐 복습,

jal “프로시저라벨” 명령어의 의미는?

ㆍ바로 다음의 instruction의 주소를 $ra에 저장

ㆍ그리고 대상 주소(프로시저라벨)로 점프

<2.10 - MIPS Addressing for 32-Bit Immediates and Addresses>

32-bit Constants(상수)

*대부분의 상수는 작은 크기임

ㆍ16-bit의 immediate로도 충분함.

*가끔 32-bit 상수가 쓰임

lhi rt, “constant”

ㆍ16-bit의 상수를 rt에 왼편 16비트 자리에 복사함.

ㆍrt의 나머지 오른편 16비트 자리는 모두 0이 됨.

Branch Addressing

*분기(branch) instructions에 사용되는

ㆍopcode, 2registers, target address

*대부분의 분기 대상(branch target, 분기 조건에 따라 이동하게 되는 곳)은 branch(지금 루틴) 근처에 존재한다.

ㆍ앞으로 혹은 뒤로

op rs rt constant or address 6 bits 5 bits 5 bits 16 bits

(이전에 본 I-format)

*PC-relative addressing (PC가 가리키는 주소를 활용)

ㆍtarget address = PC(Program counter) + offset(위에서 address)*4

ㆍMIPS에서, PC는 어떤 루틴에 들어가면, 다음에 실행할 명령의 주소값을 가리키게 되어있음.

즉, 이미 이번 분기에 진입할 때 4만큼 증가했었음.

그러므로 타겟 주소를 계산할 때 고려해야 함.

Jump Addressing

*점프(j와 jal) 대상은 어디든 가능함. (branch 타겟과 달리 멀리로도 가는 편)

op address 6 bits 26 bits

*(Psuido)Direct jump addressing

ㆍtarget address = PC_31…28 & (address*4)

현재 PC의 상위 4비트와 address에 4를 곱한(left shift 2번) 28비트를 합쳐서 32비트로.

Target Addressing 예제

*2.7의 반복 구문 컴파일(Compiling Loop Statements)을 다시 가져옴

ㆍLoop의 메모리 주소는 80000 이라고 가정.

*C code:

while (save[i] == k) i += 1;

ㆍi는 $s3에, k는 $s5에, 배열 save의 시작 주소는 $s6에.

*컴파일된 MIPS code:

Loop: sll $t1, $s3, 2 (처음 주어질 i index만큼의 주소(4byte)를 위해 2^2=4를 곱해둠)

add $t1, $t1, $s6 (offset(위에서 구해둔 i*4)에 시작 주소 더하면 save[i]의 주소)

lw $t0, 0($t1)

bne $t0, $s5, Exit

addi $s3, $s3, 1

j Loop

Exit: …

Branching Far Away

만약 분기 대상 주소가 멀다면

*만약 분기 대상(branch target)이 너무 멀어서 16-bit의 offset으로도 표현할 수 없다면,

(branch addressing은 현재 PC + 16bits의 offset으로 위아래를 표현하므로)

어셈블러는 코드를 다시 작성하게 된다.

*예시:

beq $s0, $s1, L1 가 아닌,

bne $s0, $s1, L2

j L1

L2: …

으로 바꿈.

같다면(eq)로 이동할 대상(L1)이 너무 멀기 때문에,

같다면 그냥 아래로 내려오고, 여기서 먼 L1으로 점프(jump addressing이라 PC 상위에 + 28비트 표현),

같지 않으면 점프 아래인 L2(PC에서 한 칸만 뛰면 되는)로 이동함.

(원래는 같다면 멀리 점프(불가능), 같지 않으면 그냥 아래로지만,

바뀐 코드는 같다면 그냥 아래로+여기서 점프, 같지 않으면 2칸 아래로)

Addressing Memory 요약

<2.11 - Parallelism and Instructions: Synchronization>

기존과는 약간 생소함. OS나 임베디드 시스템, 마이크로칩에서도 다룰 내용.

Synchronization

동기화

ㆁ두 개 이상의 프로세서(멀티코어환경)가 메모리의 같은 영역을 공유

*P1이 쓴 후, P2가 읽거나.

*만약 P1과 P2가 제대로 동기화하지 않으면(동시에 접근해버리면),

데이터는 경쟁 조건(race-condition)에 놓인다.

ㆍ접근(access) 순서를 잘 조절해야 함.

ㆁ하드웨어가 지원해야 사용가능하다.

*Atomic read/write memory operation(하드웨어가 이러한 기능을 사용 가능해야.)

ㆍ한 번 실행하면 쉬지 않고 종료까지 달리는. 실행되었거나/않았거나 둘 중 하나.

ㆍspin lock이라는 메커니즘을 구현할 때에도 사용됨.

*읽고 쓰는 중에는 이 메모리에 다른 접근이 허용될 수 없다

ㆁAtomic read/write memory operation을 지원하는 single instruction(단일 명령문)이 있음.

*e.g., 레지스터↔메모리의 atomic swap

*또는 instruction들의 atomic 쌍(pair)

MIPS에서의 Synchronization

ㆁLoad linked: ll rt, “offset”(rs)

*가리키는 주소 있는 값을 rt에 적재.

ㆁStore conditional(조건적인 저장): sc rt, “offset”(rs)

*ll 이후로 해당 주소 위치의 값이 변하지 않았다면(여전히 $t1에 둔 값과 같다면),

해당 주소 위치의 값을 rt로(storeO), 그리고 rt의 값을 1로, 그렇지 않다면 건드리지 않고(storeX), rt는 0으로.

*성공하면(ll 이후로 가리키는 주소 위치의 값이 변하지 않았다면)

ㆍrt에 1을 반환한다(넣는다).

*실패하면(ll 이후로 가리키는 주소 위치의 값이 변해있다면, 즉, 그 사이에 다른 누군가 건드렸겠지.)

ㆍrt에 0을 반환한다(넣는다).

ㆁ예제: atomic swap (lock용 변수를 테스트/세팅)

sc에서 store가 성공했다면, $s1이 가리키는 주소 위치의 값은 $t1이 보존한 채, 거기에 $s4의 값을 넣어준 것.

이후에 $s4에는 $t1에 보존된 값을 넣어줌으로써 정상적으로 swap.

sc에서 store가 실패했다면, 어차피 $s1이 가리키는 주소 위치의 값은 건드리지 않으며,

다시 처음으로 가서 $s4의 값을 $t0에 새로 받아오려 할 것이므로, 이 상태에서는 값의 부분적인 변화가 없음.

<2.12 - Translating and Starting a Program>

실제 작성된 코드가 어셈블리어로 어떻게 바뀌고 프로그램으로서 실행되는지.

Translation and Stratup

ㆍC언어(HLL)로 작성된 프로그램을, 컴파일러가 어셈블리어 프로그램으로.

ㆍ어셈블리어 프로그램을, 어셈블러가 오브젝트(기계어 모듈)로.

(대부분의 컴파일러는 위 두 과정을 한 번에 일괄적으로 진행함)

ㆍ내 코드로 만들어진 오브젝트들과, 사용한 라이브러리에 의해 만들어진 오브젝트들을

링커가 합쳐서 실행가능한 기계어 프로그램(실행파일)으로 작성.

이 과정을 static linking이라고 함.

(static linking은 프로그램에 라이브러리에 의한 내용이 모두 포함.

프로그램을 여러개 실행하면 메모리에 중복되는 부분이 존재함.

반대되는 개념으로 dynamic linking이 있음. 메모리의 한 영역에 라이브러리 내용이 로드되고, 공통적으로 사용.)

ㆍ실행파일이 실행(OS의 메모리에 올라와야 함)되기 위해,

로더가 실행파일을 메모리에 로드(메모리에 프로그램을 올림).

Assembler Pseudoinstructions

어셈블러 유사instructions

*대부분의 어셈블러 instruction들은 기계 instruction들을 1:1대응으로 표현한다.

실제 MIPS instruction에는 없지만, 어셈블러에서 사용할 수 있는 가짜 명령어.

어셈블러가 이 명령어들을 실제 MIPS instruction들로 바꿔줌.

*pseudoinstructions: 어셈블러의 상상으로 꾸며낸 것들.

move $t0, $t1 → add $t0, $zero, $t1

blt $t0, $t1, L → slt $at, $t0, $t1

bne $at, $zero, L

ㆍ$at(1번 레지스터): 어셈블러 전용의. 임시값용. 여기서 어셈블러만 사용하는 레지스터를 이용해서 명령어 구현.

*어셈블러(혹은 컴파일러)는 프로그램을 기계 instruction(비트로 된)으로 번역한다.

*Object Module은, 조각들로부터 하나의 완전한 프로그램을 만들기 위한 정보들을 갖고 있다.

ㆍHeader: object module의 내용.

ㆍText segment: 번역된 instruction들.

ㆍStatic data segment: 프로그램의 수명과 함께 할당된 데이터. 즉, global, static 데이터.

ㆍRelocation info: 로드된 프로그램에서 절대경로에 의존하는 내용들을 위해.

ㆍSymbol table: global definition과 external ref들.

ㆍDebug info: 디버깅을 위한 source 코드 정보.

Linking Object Modules

*하나의 실행가능한 이미지를 생성한다.

1. 조각들(segments)을 병합(merge)한다.

2. label을 결정한다.(label의 주소를 정한다)

서로 다른 label을 사용했던 레퍼런스들을 해결함.

3. 경로 의존적인 것들을 해결하고, 외부 참조들(external refs)을 처리한다. (patch 과정)

*relocating loader에 의해 조절되는 경로 의존성(location dependencies)은 그냥 둔다.

ㆍ하지만 가상 메모리 환경(현재 컴퓨터들이 주로 사용하는 형태)에서는, 그럴 필요가 없다(버려도 된다).

가상 메모리 환경은, 모든 프로그램들이 같은 메모리 영역을 사용한다.

그러므로 경로 의존 정보는 필요 없어진다.

ㆍ즉, 프로그램은 가상 메모리 공간의 절대 경로로 로드될 수 있다. 절대 주소를 사용한다.

Loading a Program

ㆁ디스크로부터 이미지 파일을 메모리에 Load(적재)

1. segment size들을 결정하기 위해 header를 읽어들인다.

2. 가상 메모리 공간을 만든다.

3. 텍스트와 초기 데이터를 메모리에 복사한다.

ㆍ혹은 이것만으로 문제가 발생할 수 있다면, page table 전체를 세팅하기도 한다.

4. 스택에 매개값들(arguments)을 세팅한다.

5. 레지스터들을 초기화한다. ($sp, $fp, $gp 포함..)

6. startup(시동) 루틴으로 점프한다.

ㆍ매가값들(arguments)을 $a0~에 복사하고, main을 호출한다.

ㆍmain이 return되면, exit syscall을 수행한다.

Dynamic Linking

static linking과 반대되는 개념

*해당 프로시저(함수)를 호출할 때만 라이브러리 프로시저에 link/load

ㆍ재배치 가능한(relocatable) 프로시저 code가 필요하다.

ㆍinclude되어 연결되며 참조되는 등 모든 라이브러리를 static linking으로 이미지에 포함시키면,

이미지가 아주 커질 수 있고, 메모리에도 공통되는 라이브러리 코드(다른 프로그램이지만 같은 라이브러리, 혹은 같은 프로그램 여러개라도)가 여러 번 존재할 수 있는데,

이를 방지할 수 있다.

ㆍDLL(Dynamically Linked Libraries)이 별도로 존재하므로, 프로그램 코드를 수정하지 않아도

라이브러리 프로시저를 이용할 때 자동적으로 새로운 버전의 라이브러리를 적용시킬 수 있다.

ㆍ아래에서 설명할 Lazy Linkage라는 방식으로도 나뉨.

Lazy Linkage

항상 Dynamic Linking에 필요한 정보들을 통해 프로시저들을 메모리에 미리 전부 준비시키는 방식이 있는가 하면,

처음 프로시저가 호출 됐을 때에 준비시키는 것이 Lazy Linkage.

(프로그램에서 모든 메서드가 항상 다 호출되는 것이 아니고, 데이터의 종류에 따라 다를 수 있으니.)

이런 방식으로 인해 dynamic linking은 static linking에 비해 속도가 느릴 수 밖에 없다.

용량효율(실행파일 용량, 메모리 중복) + DDL버전 용이 및 재컴파일 필요X와 성능의 갈림.

Starting Java Applications

Java의 번역 계층: Java 프로그램은 먼저 Java bytecodes라는 이진 코드로 컴파일되고, 모든 주소가 컴파일러에 의해 정의된다. 그러면 JVM이라는 인터프리터에서 실행될 준비가 된 것이다. 실행되는 동안 JVM은 Java 라이브러리의 원하는 메서드를 link해준다. 성능 향상을 위해 JVM은 JIT 컴파일러를 부를 수 있으며, JIT 컴파일러는 선택적으로 메서드를 실행 중인 머신의 고유한 기계어로 번역한다.

이전 파트는 전통적인 프로그램 실행모델로,

특정 ISA 혹은 해당 아키텍처의 특정한 구현을 목표로 한 프로그램의

빠른 실행 속도를 중점한 것이다.

사실, Java 프로그램도 C처럼 실행할 수 있다.

하지만, Java는 다른 목표를 갖고 개발되었으며,

그 중 하나가 실행시간이 좀 느려지더라도 다른 컴퓨터(아키텍처)에서도 안전하게 구동되는 것이었다.

위의 그림은 Java의 일반적인 번역과 실행과정을 보여준다.

대상 컴퓨터의 어셈블리어로 컴파일 되기 보다는(X)..

Java는 Java bytecode instruction set이라는 해석(interpret)되기 쉬운 명령으로 번역된다.

(Java bytecode: Instruction from an instruction set designed to interpret Java programs)

이 명령어 집합(Instruction set)은 Java 언어에 가깝되록 설계되었으므로 컴파일 과정이 간단하다.

최적화는 거의 수행되지 않을 정도이다.

Java 프로그램은 이러한 bytecode의 이진 형태로 펼쳐진다.

이제 C 컴파일러처럼, Java 컴파일러도 데이터의 종류와 각 종류에 맞는 동작을 할 프로시저들을 확인한다.

Java 가상 머신(JVM)이라 불리는 소프트웨어 인터프리터는, Java bytecode를 실행할 수 있다.

(Java Virtual Machine(JVM): The program that interprets Java bytecodes.)

인터프리터란, ISA를 시뮬레이션하는 프로그램이다.

수업에서 나온 MIPS simulator도 인터프리터의 예라고 할 수 있다.

Java bytecode는 번역이 너무 간단하여, 각각의 조립(assembly) 단계가 필요하지 않으며,

돌아가는 중에(at runtime) 컴파일러가 주소를 채우거나, JVM이 찾아낼 수 있다.

interpretation의 장점은 이식성(portability)이다.

JVM의 가용성은 Java가 발표된 후 곧바로 많은 사람들이 Java를 쓰고 실행할 수 있게 해주었다.

오늘날, JVM은 모바일 기기에서부터 웹 브라우저까지, 수많은 장치에서 볼 수 있다.

interpretation의 단점은 저성능이다.

1980~90년대의 성능 향상으로 많은 어플리케이션에서 사용될 수 있게 되었지만,

전통적인 C 프로그램에 비해 성능이 10배나 느릴 수 있다는 점은, 딱히 Java의 매력을 느끼지 못하게 한다.

이식성(portability)를 유지하면서도 실행 속도를 향상시키기 위해,

Java의 다음 개발 단계는 프로그램이 실행되는 동안 번역하는 컴파일러였다.

이러한 Just In Time(JIT) 컴파일러는 실행 중인 프로그램을 분석하여 사용하는 메서드의 위치를 찾아내어 실행 중인 머신의 고유한(native) instruction set으로 컴파일한다.

(Just In Time(JIT) compiler: The name commonly given to a compiler that operates at runtime, translating the interpreted code segments into the native code of the computer)

컴파일된 부분은 저장되므로, 다음에 프로그램이 실행될 때에는 바로 활용할 수 있으므로 더 빨리 실행될 수 있다.

이러한 interpretation와 compilation의 균형잡힌 발전이 지속되면서, Java 프로그램은 interpretation의 오버헤드가 거의 없이 수월하게 실행될 수 있다.

컴파일러가 더 많은 작업을 할 수 있도록 컴퓨터가 빨라지고, 개발자들은 Java를 즉시 컴파일하는 방법을 연구할 수록, Java와 C나 C++의 성능 격차는 줄어들 것이다.

2.15에서, Java의 구현, Java bytecodes, JVM, JIT 컴파일러에 대해 좀 더 깊게 볼 수 있다.

<2.13 - A C Sort Example to Put It All Together>

C Sort 예제

C 정렬 예제

*C 버블 정렬 함수를 어셈블리 instruction로 설명

*swap 프로시저 (leaf 구조)

void swap(int v[], int k) { int temp; temp = v[k]; v[k] = v[k + 1]; v[k + 1] = temp; }

ㆍv는 $a0에, k는 $a1에, temp는 $t0에.

Swap 프로시저

어셈블리 코드로는

C에서의 정렬 함수(bubble sort)

*non-leaf 구조 (내부에서 swap 함수 호출)

void sort(int v[], int n) { int i, j; for (i = 0; i < n; ++i) { for (j = i - 1; j >= 0 && v[j] > v[j + 1]; –j) { swap(v, j); } } }

ㆍv는 $a0에, k는 $a1에, i는 $s0에, j는 $s1에.

The Procedure Body

The Full Procedure

위의 body가 중간에 위치함.

Effect of Compiler Optimization

컴파일러 최적화의 효과

OS: Linux, Processor: Pentium 4, Compiler: gcc

Compiler Benefits

*버블 정렬을 통해 본 성능 비교

ㆍ100,000개의 데이터(word, 무작위 값들로 초기화된 배열)를 정렬하는 작업을

Pentium 4(3.06 GHz clock rate, 533MHz system bus), 2GB DDR SDRAM, Linux 2.4.20 환경에서

테스트.

gcc Optimazation 상대적 성능 Clock cycles (M) Instruction count (M) CPI none 1.00 158,615 114,938 1.38 O1 (medium) 2.37 66,990 37,470 1.79 O2 (full) 2.38 66,521 39,993 1.66 O3 (procedure interfration) 2.41 65,747 44,993 1.46

Effect of Language and Algorithm

언어종류나 알고리듬의 효과

기본적으로 Java가 C보다 느림.

특히, 인터프리터 방식의 Java는 성능차가 많이 났으나, JIT 컴파일러의 발전으로 성능차이를 많이 따라잡음.

(인터프리터는 line by line으로 명령어 단위로, JIT 컴파일러는 chunk(덩어리) 단위로)

Lessons Learnt

배운 교훈

*Instruction count(수)와 CPI는 그 자체로(독립적으로) 성능 측정자로 여겨지기엔 부족하다.

*컴파일러 최적화는 알고리듬(코드 구현 방식)에 민감하다.

*Java에서 JIT 컴파일 된 코드는 JVM의 인터프리터 방식보다 아주 빠르다.

ㆍ어떤 경우에는 최적화된 C와 비빌 수 있을 정도이다.(그래도 앞서진 못함ㅎ)

*쓰레기 알고리듬을 구제할 방법은 없다. 알고리듬을 잘 짜야한다.

<2.14 - Arrays versus Pointers>

Arrays vs. Pointers

배열 vs 포인터

*배열은 index(색인, 순서, 번호)를 포함한다.

ㆍ요소의 크기만큼을 index에 곱한다.

ㆍ배열의 기본 주소(base address)에 위의 곱한 결과를 offset으로 더한다.

*포인터는 메모리 주소를 직접 가리킨다

ㆍoffset을 계산하는(indexing) 과정은 피할 수 있다.(다만, 해당 위치를 직접 가리켜야한다.)

ㆍ위의 과정이 없어도 되니, 성능 향상에 도움이 될 수 있다.

예제: Clearing and Array

Comparison of Array vs. Ptr

배열과 포인터의 비교

*인덱스 계산(shift 명령)을 줄이는 효과가 쌓이면서 점차 성능 향상

*배열 방식은 루트문 내부에서 shift 명령이 필요하다.

ㆍ인덱스를 나타내는 변수(i)가 변하면서, 여기에 맞춰서 주소를 다시 계산하므로.

ㆍc.f. 포인터 방식에서는 그냥 주소에 바로 증감

*컴파일러는 프로그래머가 포인터를 명시적으로 사용한 것과 같은 효과를 최적화로 이끌어낼 수 있음

ㆍ유도 변수(induction variable)를 제거.(i를 사용하는 방식)

ㆍ성능은 좋으면서도 코드는 깔끔하고 안전할 수 있도록 해 줌.(그러므로 배열 사용 권장.)

<2.16 - Real Stuff: ARMv7 (32-bit) Instructions>

실제로 자주 사용되는 ARM 프로세서의 명령어를 봄.

ARM: Advanced Risk Machine. 영국의 프로세서 설계 회사.

스마트폰의 대부분에 사용되는 프로세서.

ARM과 MIPS의 유사점

ㆍARM: 임베디드 코어 시장에서 가장 많이 쓰이는 프로세서 방식

ㆍ기본적인 instruction set이 MIPS와 유사함

ARM MIPS 발표시기 1985년 1985년 Instruction 크기 32 bits (v7) 32 bits Adress 공간 32-bit flat 32-bit flat Data alignment(정렬) 정렬됨 정렬됨 Data addressing 방식 9가지 3가지 레지스터 수 16개(0~15) 의 32-bit 32개(0~31)의 32-bit Input/Output 메모리에 맵핑해서 메모리에 맵핑해서

※ ARMv8은 64-bit instruction

Compare and Branch in ARM

ARM에서의 비교와 분기

*산술/논리 instruction의 결과를 써서 조건 코드(condition code)를 만들 수 있음.

ㆍnegative, zero, carry, overflow

ㆍ결과를 보존한다기보다는, condition code에 넣어 compare instruction에 사용함.

*각 instruction들이 조건적(conditional)이 될 수 있음.

ㆍinstruction의 최상위 4비트를 condition 값으로 둠.

ㆍ단일 instruction만으로도 branch구문 없이 조건적인 동작이 가능함.

Instruction Encoding

잠깐 복습,

lhi rt, constant의 의미는?

ㆍ16비트로 된 상수를 rt의 최상위 16비트에 복사

ㆍrt의 나머지 오른쪽 16비트는 모두 0으로 세팅

<2.17 - Real Stuff: x86 Instructions>

일반 PC에 가장 많이 사용되는 프로세서는 Intel 프로세서.

Intel 프로세서의 아키텍처(ISA)를 x86이라고 함(386, 486, … 으로 네이밍하던).

The Intel x86 ISA

ㆁ하위 호환성(backward compatibility, 예전 것을 새 환경에서도 지원)를 유지한 채 발전

*8080 (1974년): 8-bit 마이크로프로세서

ㆍ누산기(Accumulator)에 3쌍의 레지스터를 더 함.

ㆍ아직도 임베디드 시스템에서 8-bit 마이크로프로세서가 쓰이는 분야에서 쓰이기도 함.

*8086 (1978년): 8080으로부터 16-bit로 확장

ㆍComplex Instruction Set(CISC)

*8087 (1980년): floating-point coprocessor

ㆍ실수 명령을 지원하며, 레지스터 묶음(register stack)을 사용.

*80286 (1982년): 24-bit addresses, MMU(Memory Management Unit) 포함

ㆍsegmented memory mapping 및 protection 지원.

*80386 (1985년): 32-bit extension (IA-32라고 함. Intel Architecture)

ㆍaddressing 방식과 작업들의 종류가 늘어남.

ㆍsegment 할당방식에서 paged memory mapping 또한 지원하게 됨.

*i486 (1989년): pipeline형. on-chip 캐시와 FPU

ㆍ호환되는 경쟁사: AMD, Cyrix, …

*Pentium (1993년): superscalar(4장 마지막내용) 지원, 64-bit datapath

ㆍ후기 버전에 MMX(Multi-Media eXtension) instruction 추가

ㆍ악명높은 FDIV 버그가 있음

*Pentium Pro (1995년), Pentium 2 (1997년)

ㆍ새로운 microarchitecture (The Pentium Chronicles – Robert P. Cowell 참고)

*Pentium 3 (1999년)

ㆍSSE(Streaming SIMD Extensions) 추가, associated registers

*Pentium 4 (2001년)

ㆍ새로운 microarchitecture

ㆍSSE2 instruction 추가

※ AMD64 (2003년): 64-bit로 확장된 아키텍처

*EM64T (2004년): Extended Memory 64 Technology

ㆍIntel이 AMD64 방식을 채택함(어느정도 가다듬어서)

ㆍSSE3 instruction 추가

*Intel Core (2006년) (멀티코어)

ㆍSSE4 instruction 추가, 가상 머신(virtual machine) 지원

※ AMD64 (2007년형)

ㆍSSE5 instruction 추가

ㆍIntel은 더이상 따르기를 거부함.

*Advanced Vector Extension (2008년)

ㆍLonger SSE registers, more instructions

*만약 Intel이 호환성을 갖추지 않았다면, 시장에서 인기를 유지하기 힘들었을 것.

ㆍ기술적인 정교함이 시장에서의 성공과 직관된다고 할 수 없음.

다른 프로세서가 성능이 조금 더 좋아도, 기존 유저는 호환성으로 외면할 수 있음.

Basic x86 Registers

MIPS와 달리 레지스터 길이가 동일하지 않음.

Basic x86 Addressing Modes

x86의 주소표현 방식

*instruction마다 2개의 operand가 존재함.

source/destination operand 2nd source operand Register 주소 Register 주소 Register 주소 Immediate Register 주소 Memory 주소 바로 Memory 주소 바로 Register 주소 Memory 주소 바로 Immediate

*Memory addressing modes

ㆍbase레지스터(rs가 가리키는 레지스터)의 값에 가감

ㆍbase레지스터값 + n (n은 displacement로서. 0도가능.)

ㆍbase레지스터값 + (2^scale * index레지스터값) + n (scale: 0~3의 정수)

x86 Instruction Encoding

ㆁ다양한 길이의 encoding (※ MIPS는 모두 32-bit의 Instruction)

*Postfix(접미사) byte가 특정한 addressing mode를 나타냄

*Prefix(접두사) byte는 operation을 뜻함

ㆍOperand length, repetition(반복), locking, …

*첫번째 설계 원칙(Simplicity favors regularity)에 위배되는 아키텍처.

ㆍ레지스터 길이도 다르고, Addressing mode도 많고, Instruction 길이도 다름.

ㆍ간단하지 않으므로 고성능을 기대하기 힘듦, 하지만 실제로 꽤 고성능을 보여주고 있음. (아래에 계속)

Implementing IA-32

※ CISC: Complex Instruction Set Computer / RISC: Reduced Instruction Set Computer

ㆁ복잡한 instruction set은 implementation(구현)을 어렵게 한다.

(그러므로 이대로는 높은 성능을 기대하기 어렵다.)

*하드웨어가 instruction을 간단한 microoperation들로 나누어 준다.

ㆍsimple instruction: 1→1

ㆍcomplex instruction: 1→다수

*RISC와 비슷한 Microengine을 갖고있다.(Microengine이 RISC처럼 행동한다.)

이 Microengine이 microoperation들을 실행한다.

*비용이 들테지만, 시장 점유율 덕분에 경제적으로 실현가능.

ㆁRISC과 견줄만 한 성능을 낸다.

ㆍ컴파일러가 복잡한 instruction을 해결시켜 준다.

IA는 구조적으로 MIPS에 비해서는 안 좋은(비효율적인) 구조를 가지고 있지만,

내부적으로는 MIPS 같은 RISC 아키텍처를 따르므로,

CISC instruction을 RISC 방식의 microoperation으로 나눠주는 오버헤드를 제외하면,

내부적인 성능은 RISC과 거의 유사하다.

이런 방식으로 Intel은 높은 성능을 구현함.

<2.18 - Real Stuff: ARMv8 (64-bit) Instructions>

ARM v8 Instructions

ㆁ64-bit이 되면서, ARM은 거의 완전 해체조립 수준으로 재구축함(기존의 것들을 많이 포기한 것들이 있음).

*높은 성능을 위해 기존의 것들을 버리고, MIPS와 유사한 형태로 간 것들이 있음.

ㆁARM v8은 MIPS와 닮아있다.

*v7(32-bit)과는 달라진 점:

ㆍconditional execution field(상위 4비트의)를 없앰.

ㆍImmediate field는 12-bit로 고정됨.

ㆍ여러 개의 word(데이터)를 동시에 load/store 하는 방식을 버리고, 한 번에 한 개의 word(데이터)만.

ㆍPC(Program Counter)는 더이상 GPR이 아님.

ㆍGPR은 32-bit로 확장됨.

ㆍAddressing mode는 모든 word 크기에 동작함. (Adressing modes work for all word sizes)

ㆍDivide instruction.

ㆍequal이라면 분기(beq)와 equal이 아니라면 분기(bne) instruction을 지원.

<2.19 - Fallacies and Pitfalls>

Fallacies

잘못된 생각(오류)

ㆁPowerful instruction(하나의 명령어가 여러 동작을 한꺼번에)은 곧 고성능으로 이어진다??(X)

*instruction의 수가 줄어드니까??

*하지만 complex instruction은 구현(implement)를 더 어렵게 만든다.

ㆍ여러 일을 동시에 해야하는 명령어를 실행하기 위해서 더 느린 clock을 사용해야 함.

모든 명령어들이 여기에 맞춰서 느려짐.

ㆍ전체적으로는 더 느려질 수 있다. 단순한 명령조차 느린 clock에 맞춰서 느려짐.

*컴파일러는 simple instruction으로 만들어진 코드에서 빠르게 동작한다.

ㆁ고성능을 위해 어셈블리 코드를 사용해야 한다??

*하지만 현대의 컴파일러들은 최적화를 잘 시켜주기 때문에, HLL로도 어셈블리 코드와 유사한 성능으로 이끌어 줌.

*오히려 어셈블리 코드로 인한 코드의 line 수 증가는,

프로그래머에게 실수를 유발하거나, 어렵고, 보기도 불편하고, 보수도 불편하고, 생산성도 떨어질 수 있음.

*얻는 득보다 잃는 실이 더 많음. 컴파일러와 최적화를 믿고 HLL로 작성하자.(권장)

*하지만, 임베디드 시스템처럼 특수한 상황에서는 어셈블리 코드를 사용할 상황이 있음.

(HLL로는 제한된 환경이나 리소스에서 구현이 안 될 때 등..)

ㆁ하위 호환성(backward compatibility, 예전 것을 새 환경에서도 지원)을 유지하려면 instruction set은 바꿀 수 없다??

*하지만 instuction 수를 점점 늘려왔음.

*하위 호환성을 유지한다는 것이, Instruction set을 바꾸지 않는다는 말은 아님.

*명령어 수는 늘어나지만, 예전에 지원했던 명령어는 계속해서 사용 가능하도록.

Pitfalls

함정

*sequencial(순차적) words는 반드시 sequencial address에 놓여있는 것은 아니다.

ㆍ(개인적으로)원문이 좀 이상하다고 생각하는데, 1단위로 연속되는 게 아니라고 말하고 싶은 듯..

ㆍ4씩 증가하지, 1씩 증가하는 것이 아니다.

ㆍword는 4byte니까 당연한 것 아닌가..??

*프로시저가 끝난 뒤에도 해당(끝난) 프로시저 내부의 지역변수를 가리키는 포인터를 사용하려고 하는 행위

ㆍ해당 변수가 스택에서 빠져나오면(popped), 포인터는 같은 곳을 가리켜도 값이 망가졌으니 invalid.

Addressing Modes Illustrated

MIPS Organization So Far

<2.20 - Concluding Remarks>

Concluding Remarks

끝 맺으며

*Design Principles(설계 원칙)

1. Simplicity favors regularity. 규칙성을 이용하여 간결하게 만든다.

2. Smaller is faster. 작을 수록 빠르다.

3. Make the common case fast. 일반적인 경우(자주 사용되는 경로)를 빠르게 해라.

4. Good design demands good compromises. 좋은 설계는 좋은 타협을 필요로 한다.

*소프트웨어와 하드웨어의 계층 사이엔..

ㆍ컴파일러, 어셈블러, 하드웨어

*MIPS: 전형적인 RISC(Reduced Instruction Set Computer) ISAs

ㆍc.f., x86은 CISC(Complex Instruction Set Computer)

*벤치마크 프로그램을 통해 특정한 MIPS instruction executions

ㆍcommon case를 빠르게 만드는 것을 염두에 둘 것.

ㆍ타협안을 염두에 둘 것.

Instruction 종류 MIPS 예시 SPEC2006 Int SPEC2006 FP 산술(arithmetic) add, sub, addi 16% 48% 데이터 교환(data transfer) lw, sw, lb, lbu, lh, lhu, sb, lui 35% 36% 논리(logical) and, or, nor, andi, ori, sll, srl 12% 4% 조건(cond), 분기(branch) beq, bne, slt, slti, sltiu 34% 8% 점프(jump) j, jr, jal 2% 0%

So you have finished reading the 컴퓨터 구조 및 설계 5 판 한글 pdf topic article, if you find this article useful, please share it. Thank you very much. See more: 컴퓨터 구조 및 설계 5판 pdf, Computer Organization and Design 한글판 PDF, 컴퓨터 구조 및 설계 pdf, 컴퓨터 구조 및 설계 6판 pdf, 컴퓨터 구조와 원리 PDF

Leave a Comment