Code 17장

641 views
460 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
641
On SlideShare
0
From Embeds
0
Number of Embeds
53
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • 제어판의 취득 스위치를 열고 더하려는 데이터 값을 입력
  • 취득 스위치와 지우기 스위치 개방덧셈기의 출력은 아직 래치에 저장되지 않음(래치에 클럭이 없으므로)
  • 클럭이 발생하면 두가지 일이 동시에 일어나는데첫번째로 래치에 값이 저장
  • 두번째로 카운터가 변하면서 덧셈기가 새로운 덧셈결과 출력아직 새로운 결과는 래치에 저장되지 않음
  • 두번째로 카운터가 변하면서 덧셈기가 새로운 덧셈결과 출력아직 새로운 결과는 래치에 저장되지 않음
  • 뺼셈시에 누산기의 CI는 1이 입력되어야 함.C0은 뺄셈하라는 신호
  • 더이상 명령어와 데이터메모리가 클럭마다 같은 번지수를 읽지 않음데이터 메모리는 16비트 카운터가 아니라명령어로 부터 주소 지정 받음
  • -1 한 시점에 덧셈기 출력이 0이면 제로플래그는 1이 됨.
  • 니모닉 기계어를 나타내는 기호
  • 니모닉 기계어를 나타내는 기호
  • JNZ 0000h : 값 자체를 참조하므로 대괄호가 없음
  • 16진수로 된 기계어와 영어 문장으로 풀어 쓰는 자연어의 중간 방식
  • Code 17장

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

    ×