code 17장
TRANSCRIPT
17 장 . 혼자서 움직이는 컴퓨터 CODE
The Hidden Language of Computer Hardware and Software
김지훈아꿈사
2013. 02. 23.
2/50
우리가 이제까지 만든 것누적 덧셈기 64Kx8 메모리
3/50
우리가 이제까지 만든 것카운터
합쳐봅시다CODE
4/50
5/50
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
초기 상태
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
지우기 스위치 입력
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 에 데이터 초기화
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
지우기 스위치 개방
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
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
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
13/50
문제점
동작을 중지시킬 방법이 없음무한루프 , FFFFh 번지 까지 진행후 처음부터 다시 계산
8 비트 덧셈만 가능여러개를 붙이지 않고 확장할 수 없을까 ?
모든 수를 더해서 하나의 결과값만 구함50 개의 쌍을 더해서 50 의 결과값을 구하고 싶다면 ?
개선해 봅시다CODE
14/50
15/50
출력 결과를 다시 RAM 에 저장하기
50 쌍의 수를 더했다면 각 50 쌍의 연산결과를 메모리에 다시 저장 할 수 있음 .
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
세 번째 합은 여기
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
세 번째 합은 여기
18/50
명령어 추가
동작 부호
로드 10h
저장 11h
더하기 20h
중단 FFh
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:
20/50
로드 명령어 처리
RAM 의 출력을 8 비트 래치의 입력과 연결2:1 선택기 추가
제어 신호는 생략로드명령에서는 2:1 선택기의 Select 입력은 0
저장 명령인경우는 RAM 에 대한 쓰기 신호값이 1
제어 신호는 논리게이트를 다양하게 조합해서 만들 수 있음 .
21/50
빼기 명령어 추가
동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
중단 FFh
명령어 메모리 데이터 메모리0000h: 10h 로드 0000h: 56h
20h 더하기 2Ah
21h 빼기 38h
11h 저장 <- 결과는 여기에 적힘FFh 중단
22/50
빼기 명령어 처리
1. 뺄셈시에 C0 은 1 이 입력됨
2. 덧셈기의 입력은 인버터를 통해 1 의 보수가 됨
3. 덧셈기의 CI 에 1 을 입력함으로서 2 의 보수로 만듬
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 중단
24/50
자리 올림과 빌림
1h ABh 76h+ 6Ch + 23h
117h 9Ah
76ABh + 236Ch
1 비트 자리 올림 래치 사용
하위 8 비트 덧셈일반적인 덧샘 수행 후 자리올림 값을 자리올림 래치에 저장
상위 8 비트 덧셈덧셈기의 자리올림 입력에 자리올림 래치 값을 입력
25/50
자리 올림과 빌림
동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
자리올림을 이용하여 더하기 22h
빌림을 이용하여 빼기 23h
중단 FFh
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
27/50
아직 남은 문제들번거로운 입력
가장 아래 바이트 부터 연속되지 않은 메모리에 나누어 넣어야함
연산의 결과를 뒤에서 재사용 불가능A 와 B 의 합에 C 를 더하고 싶다면 ?
메모리를 0000h 번지부터 순차적으로만 접근 가능 하기 때문
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 중단
29/50
연속된 공간에 데이터 저장
76ABh + 236Ch
30/50
명령어 패치명령어를 가져오는 과정을 지칭
명령어 처리를 위한 3 개의 1 바이트 래치 추가
3 번의 클럭이 필요1 클럭 : 명령어 로드2 클럭 : 상위 1 바이트 주소 로드3 클럭 : 하위 1 바이트 주소 로드
기존 구조의 ¼ 속도
31/50
메모리 통합
32/50
메모리 통합
연산의 결과에추가로 값을 더하고 싶다면 ?
두 연산을 어떻게 연결할 것인가 ?
33/50
분기
동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
자리올림을 이용하여 더하기 22h
빌림을 이용하여 빼기 23h
분기 30h
중단 FFh
000Ch:
30h 0020h 번지로 점프합니다 .
00h
20h
34/50
분기 구현
35/50
16 비트 카운터 수정16 비트 카운터는 플립플롭 16 개를 연결한 것임을 상기
A : 새로 지정할 비트 값
Set It 이 1 이면 A 의 값이 플립플롭에 입력됨
36/50
곱셈 구현
1000h:
00h 16 비트 승수
A7h
1002h:
00h 16 비트 피승수
1Ch1004h:
00h <- 16 비트 곱은 여기와
00h <- 여기에
00A7hX 001Ch
1 단계 : 00A7h X 1
00A7h 를 001Ch 번 더하자 .
37/50
곱셈 구현2 단계 : 처음으로 되돌아가기
언제까지 ??조건 분기 필요
0012h:
30h 0000h 번지로 분기
00h
00h
38/50
조건 분기Zero 래치
덧셈기의 출력이 0 인지 판별덧셈기의 출력 값이 0 일때 1 을 가짐
39/50
조건 분기동작 부호
로드 10h
저장 11h
더하기 20h
빼기 21h
자리올림을 이용하여 더하기 22h
빌림을 이용하여 빼기 23h
분기 30h
Zero 면 분기 31h
자리올림이면 분기 32h
Zero 가 아니면 분기 33h
자리올림이 아니면 분기 34h
중단 FFh
40/50
곱셈 구현3 단계 : 조건 분기
001Ch 가 0 이 아닌 동안 0000h 으로 돌아간다 .
1000h: 00h 16 비트 승수A7h
1002h: 00h 16 비트 피승수1Ch
1004h: 00h <- 16 비트 곱은 여기와00h <- 여기에
데이터
1Eh 의 FFh 를 더하는 이유는 -1 을 더하기위한 트릭
더 배워 봅시다CODE
41/50
42/50
컴퓨터의 구성계산기와 컴퓨터를 구분하는 가장 중요한 요소는
조건에 따라 반복가능한 루프가 있는지 여부조건 분기
기본 구성 요소프로세서 , 메모리 , 입력장치와 출력장치
43/50
우리가 만든 컴퓨터8 비트 프로세서
8 비트 데이터 폭의 누산기대부분의 데이터 패스가 8 비트주소 생성 부분만 16 비트
메모리 64K x 8 RAM
입출력 장치RAM 제어판의 스위치 , 전구
44/50
기계어 (Machine Language)
프로세서의 동작에 대응하는 16 진수로된 코드10 10 05 20 10 01 11 10 05
니모닉 : 16 진수 기계어 코드에 이름을 붙임
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
46/50
니모닉구성 : 명령 코드 목적지 , 소스
“1003h 에 있는 바이트 값을 누산기로 로드”LOD A, [1003h]
A 는 누산기[] 는 주소에 있는 값을 참조
“ 누산기의 내용을 1003h 번지로 저장하라“STO [1003h], A
“ 만일 Zero 플래그 값이 1 이 아니라면 0000h 로 분기하라”JNZ 0000h
47/50
곱셈 프로그램
48/50
곱셈 프로그램
주소 변경에 대비해 레이블 사용
49/50
곱셈 프로그램
주석 추가
어셈블리어
50/50
어셈블리어기계어와 자연어의 중간방식
메모리 주소를 레이블로 표시
기계어와 1 대 1 로 대응 함