code 17장

50
17 장 . 장장장 장장장장 장장장 CODE The Hidden Language of Computer Hardware and Software 장장장 장장장 2013. 02. 23.

Upload: ji-hun-kim

Post on 20-May-2015

238 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Code 17장

17 장 . 혼자서 움직이는 컴퓨터 CODE

The Hidden Language of Computer Hardware and Software

김지훈아꿈사

2013. 02. 23.

Page 2: Code 17장

2/50

우리가 이제까지 만든 것누적 덧셈기 64Kx8 메모리

Page 3: Code 17장

3/50

우리가 이제까지 만든 것카운터

Page 4: Code 17장

합쳐봅시다CODE

4/50

Page 5: Code 17장

5/50

Page 6: Code 17장

6/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 00h0001h : 00h0002h : 00h0003h : 00h0004h : 00h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V S

초기 상태

Page 7: Code 17장

7/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 00h0001h : 00h0002h : 00h0003h : 00h0004h : 00h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0000h

00h

S

00h

지우기 스위치 입력

Page 8: Code 17장

8/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 01h0001h : 15h0002h : 11h0003h : 23h0004h : 50h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0000h

00h

S

00h

제어판으로 RAM 에 데이터 초기화

Page 9: Code 17장

9/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 01h0001h : 15h0002h : 11h0003h : 23h0004h : 50h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0000h

00h

0000h 01h 00h

S

01h

지우기 스위치 개방

Page 10: Code 17장

10/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 01h0001h : 15h0002h : 11h0003h : 23h0004h : 50h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0000h

01h

0000h 01h 01h

S

01h

첫번째 클럭 발생시 1 단계

0 -> 1

Page 11: Code 17장

11/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 01h0001h : 15h0002h : 11h0003h : 23h0004h : 50h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0001h

01h

0001h 15h 01h

S

16h

첫번째 클럭 발생시 2 단계

0 -> 1

Page 12: Code 17장

12/50

16 비트 카운터오실레이터 64K x 8 RAM

주소 값0000h : 01h0001h : 15h0002h : 11h0003h : 23h0004h : 50h…FFFFh : 00h

제어판

8 비트 덧셈기

8 비트 래치

Clk

Clr

Clk

Clr

전구

A B

DI

DO

지우기V

0002h

16h

0002h 11h 16h

S

27h

두번째 클럭 발생시

0 -> 1

Page 13: Code 17장

13/50

문제점

동작을 중지시킬 방법이 없음무한루프 , FFFFh 번지 까지 진행후 처음부터 다시 계산

8 비트 덧셈만 가능여러개를 붙이지 않고 확장할 수 없을까 ?

모든 수를 더해서 하나의 결과값만 구함50 개의 쌍을 더해서 50 의 결과값을 구하고 싶다면 ?

Page 14: Code 17장

개선해 봅시다CODE

14/50

Page 15: Code 17장

15/50

출력 결과를 다시 RAM 에 저장하기

50 쌍의 수를 더했다면 각 50 쌍의 연산결과를 메모리에 다시 저장 할 수 있음 .

Page 16: Code 17장

16/50

출력 결과를 다시 RAM 에 저장하기 0000h 주소에 있는 값을 로드해서 누산기에 저장 0001h 주소에 있는 값과 누산기의 값을 더함 0002h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 0003h 주소에 저장 0004h 주소에 있는 값을 로드해서 누산기에 저장 0005h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 0006h 주소에 저장 0007h 주소에 있는 값을 로드해서 누산기에 저장 0008h 주소에 있는 값과 누산기의 값을 더함 0009h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 000Ah 주소에 저장 자동화된 덧셈기의 동작을 중지시킴

0000h: 27h

A2h

18h

첫 번째 합은 여기0004h: 1Fh

89h

두 번째 합은 여기0007h: 33h

2Ah

55h

세 번째 합은 여기

Page 17: Code 17장

17/50

출력 결과를 다시 RAM 에 저장하기 0000h 주소에 있는 값을 로드해서 누산기에 저장 0001h 주소에 있는 값과 누산기의 값을 더함 0002h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 0003h 주소에 저장 0004h 주소에 있는 값을 로드해서 누산기에 저장 0005h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 0006h 주소에 저장 0007h 주소에 있는 값을 로드해서 누산기에 저장 0008h 주소에 있는 값과 누산기의 값을 더함 0009h 주소에 있는 값과 누산기의 값을 더함 누산기에 있는 값을 000Ah 주소에 저장 자동화된 덧셈기의 동작을 중지시킴

로드 , 더함 , 저장 , 중지

네가지 작업이 필요

명령어

0000h: 27h

A2h

18h

첫 번째 합은 여기0004h: 1Fh

89h

두 번째 합은 여기0007h: 33h

2Ah

55h

세 번째 합은 여기

Page 18: Code 17장

18/50

명령어 추가

동작 부호

로드 10h

저장 11h

더하기 20h

중단 FFh

Page 19: Code 17장

19/50

명령어와 데이터 메모리 비교명령어 메모리

0000h: 10h 로드20h 더하기20h 더하기11h 저장

0004h: 10h 로드20h 더하기11h 저장

0007h: 10h 로드20h 더하기20h 더하기11h 저장

000Bh: FFh 중단

데이터 메모리

0000h: 27h

A2h

18h

첫 번째 합은 여기0004h: 1Fh

89h

두 번째 합은 여기0007h: 33h

2Ah

55h

세 번째 합은 여기000Bh:

Page 20: Code 17장

20/50

로드 명령어 처리

RAM 의 출력을 8 비트 래치의 입력과 연결2:1 선택기 추가

제어 신호는 생략로드명령에서는 2:1 선택기의 Select 입력은 0

저장 명령인경우는 RAM 에 대한 쓰기 신호값이 1

제어 신호는 논리게이트를 다양하게 조합해서 만들 수 있음 .

Page 21: Code 17장

21/50

빼기 명령어 추가

동작 부호

로드 10h

저장 11h

더하기 20h

빼기 21h

중단 FFh

명령어 메모리 데이터 메모리0000h: 10h 로드 0000h: 56h

20h 더하기 2Ah

21h 빼기 38h

11h 저장 <- 결과는 여기에 적힘FFh 중단

Page 22: Code 17장

22/50

빼기 명령어 처리

1. 뺄셈시에 C0 은 1 이 입력됨

2. 덧셈기의 입력은 인버터를 통해 1 의 보수가 됨

3. 덧셈기의 CI 에 1 을 입력함으로서 2 의 보수로 만듬

Page 23: Code 17장

23/50

76h ABh+ 23h + 2Ch

99h D7h

16 비트 계산하기

76ABh + 232Ch

99D7h

명령어 메모리 데이터 메모리0000h: 10h 로드 0000h: ABh

20h 더하기 2Ch

11h 저장 <- 결과의 하위 바이트10h 로드 76h

20h 더하기 23h

11h 저장 <- 결과의 상위 바이트FFh 중단

Page 24: Code 17장

24/50

자리 올림과 빌림

1h ABh 76h+ 6Ch + 23h

117h 9Ah

76ABh + 236Ch

1 비트 자리 올림 래치 사용

하위 8 비트 덧셈일반적인 덧샘 수행 후 자리올림 값을 자리올림 래치에 저장

상위 8 비트 덧셈덧셈기의 자리올림 입력에 자리올림 래치 값을 입력

Page 25: Code 17장

25/50

자리 올림과 빌림

동작 부호

로드 10h

저장 11h

더하기 20h

빼기 21h

자리올림을 이용하여 더하기 22h

빌림을 이용하여 빼기 23h

중단 FFh

Page 26: Code 17장

26/50

32 비트 덧셈명령어 메모리

0000h: 10h 로드20h 더하기11h 저장10h 로드22h 자리올림 더하기11h 저장10h 로드22h 자리올림 더하기11h 저장10h 로드22h 자리올림 더하기11h 저장FFh 중단

데이터 메모리0000h: CDh

FFh

<- 결과의 최하위 바이트2Bh

Carry 72h

<- 결과의 윗자리 바이트89h

Carry A8h

<- 결과의 윗자리 바이트7Ah

Carry 65h

<- 결과의 최상위 바이트

7A892BCDh+ 65A872FFh

Page 27: Code 17장

27/50

아직 남은 문제들번거로운 입력

가장 아래 바이트 부터 연속되지 않은 메모리에 나누어 넣어야함

연산의 결과를 뒤에서 재사용 불가능A 와 B 의 합에 C 를 더하고 싶다면 ?

메모리를 0000h 번지부터 순차적으로만 접근 가능 하기 때문

Page 28: Code 17장

28/50

주소 지정 추가명령어 길이를 3 바이트로 변경

1 바이트 명령어와 2 바이트 주소로 구성

명령어 메모리 데이터 메모리0000h: 10h 로드 0000h: 4Ah

20h 더하기 B5h

11h 저장 <- 결과FFh 중단

3 바이트 명령어 메모리0000h: 10h 0000h 번지의 한 바이트를 누산기로 로드함

00h

00h

0003h: 20h 0001h 번지의 한 바이트와 누산기의 값을 더함00h

01h

0006h: 11h 누산기의 값을 0002h 번지로 저장함00h

02h

FFh 중단

Page 29: Code 17장

29/50

연속된 공간에 데이터 저장

76ABh + 236Ch

Page 30: Code 17장

30/50

명령어 패치명령어를 가져오는 과정을 지칭

명령어 처리를 위한 3 개의 1 바이트 래치 추가

3 번의 클럭이 필요1 클럭 : 명령어 로드2 클럭 : 상위 1 바이트 주소 로드3 클럭 : 하위 1 바이트 주소 로드

기존 구조의 ¼ 속도

Page 31: Code 17장

31/50

메모리 통합

Page 32: Code 17장

32/50

메모리 통합

연산의 결과에추가로 값을 더하고 싶다면 ?

두 연산을 어떻게 연결할 것인가 ?

Page 33: Code 17장

33/50

분기

동작 부호

로드 10h

저장 11h

더하기 20h

빼기 21h

자리올림을 이용하여 더하기 22h

빌림을 이용하여 빼기 23h

분기 30h

중단 FFh

000Ch:

30h 0020h 번지로 점프합니다 .

00h

20h

Page 34: Code 17장

34/50

분기 구현

Page 35: Code 17장

35/50

16 비트 카운터 수정16 비트 카운터는 플립플롭 16 개를 연결한 것임을 상기

A : 새로 지정할 비트 값

Set It 이 1 이면 A 의 값이 플립플롭에 입력됨

Page 36: Code 17장

36/50

곱셈 구현

1000h:

00h 16 비트 승수

A7h

1002h:

00h 16 비트 피승수

1Ch1004h:

00h <- 16 비트 곱은 여기와

00h <- 여기에

00A7hX 001Ch

1 단계 : 00A7h X 1

00A7h 를 001Ch 번 더하자 .

Page 37: Code 17장

37/50

곱셈 구현2 단계 : 처음으로 되돌아가기

언제까지 ??조건 분기 필요

0012h:

30h 0000h 번지로 분기

00h

00h

Page 38: Code 17장

38/50

조건 분기Zero 래치

덧셈기의 출력이 0 인지 판별덧셈기의 출력 값이 0 일때 1 을 가짐

Page 39: Code 17장

39/50

조건 분기동작 부호

로드 10h

저장 11h

더하기 20h

빼기 21h

자리올림을 이용하여 더하기 22h

빌림을 이용하여 빼기 23h

분기 30h

Zero 면 분기 31h

자리올림이면 분기 32h

Zero 가 아니면 분기 33h

자리올림이 아니면 분기 34h

중단 FFh

Page 40: Code 17장

40/50

곱셈 구현3 단계 : 조건 분기

001Ch 가 0 이 아닌 동안 0000h 으로 돌아간다 .

1000h: 00h 16 비트 승수A7h

1002h: 00h 16 비트 피승수1Ch

1004h: 00h <- 16 비트 곱은 여기와00h <- 여기에

데이터

1Eh 의 FFh 를 더하는 이유는 -1 을 더하기위한 트릭

Page 41: Code 17장

더 배워 봅시다CODE

41/50

Page 42: Code 17장

42/50

컴퓨터의 구성계산기와 컴퓨터를 구분하는 가장 중요한 요소는

조건에 따라 반복가능한 루프가 있는지 여부조건 분기

기본 구성 요소프로세서 , 메모리 , 입력장치와 출력장치

Page 43: Code 17장

43/50

우리가 만든 컴퓨터8 비트 프로세서

8 비트 데이터 폭의 누산기대부분의 데이터 패스가 8 비트주소 생성 부분만 16 비트

메모리 64K x 8 RAM

입출력 장치RAM 제어판의 스위치 , 전구

Page 44: Code 17장

44/50

기계어 (Machine Language)

프로세서의 동작에 대응하는 16 진수로된 코드10 10 05 20 10 01 11 10 05

니모닉 : 16 진수 기계어 코드에 이름을 붙임

Page 45: Code 17장

45/50

니모닉동작 부호 니모닉

로드 10h LOD

저장 11h STO

더하기 20h ADD

빼기 21h SUB

자리올림을 이용하여 더하기 22h ADC

빌림을 이용하여 빼기 23h SBB

분기 30h JMP

Zero 면 분기 31h JZ

자리올림이면 분기 32h JC

Zero 가 아니면 분기 33h JNZ

자리올림이 아니면 분기 34h JNC

중단 FFh HLT

Page 46: Code 17장

46/50

니모닉구성 : 명령 코드 목적지 , 소스

“1003h 에 있는 바이트 값을 누산기로 로드”LOD A, [1003h]

A 는 누산기[] 는 주소에 있는 값을 참조

“ 누산기의 내용을 1003h 번지로 저장하라“STO [1003h], A

“ 만일 Zero 플래그 값이 1 이 아니라면 0000h 로 분기하라”JNZ 0000h

Page 47: Code 17장

47/50

곱셈 프로그램

Page 48: Code 17장

48/50

곱셈 프로그램

주소 변경에 대비해 레이블 사용

Page 49: Code 17장

49/50

곱셈 프로그램

주석 추가

어셈블리어

Page 50: Code 17장

50/50

어셈블리어기계어와 자연어의 중간방식

메모리 주소를 레이블로 표시

기계어와 1 대 1 로 대응 함