3. 1. [10] (4)는 서브루틴 1.3.2M의 특성들을 서술한 것이다.그것을 참고해서 서브루틴 (5)의 특성들을 서술하라. 1.4.1 (4) p233호출 명령열: JMP MAXIMUM들어올 때 조건: rI1 = n; n ≥ 1이라고 가정.나갈 때 조건: rA= max{1≤k≤n} CONTENTS(X + k) = CONTENTS(X + rI2); rI3 = 0 ; rJ와 CI도 영향을 받음. 차이점: n이 100일 경우의 진입점만 추가되었다.
4. 1. [10] (4)는 서브루틴 1.3.2M의 특성들을 서술한 것이다.그것을 참고해서 서브루틴 (5)의 특성들을 서술하라. 1.4.1 (4) p233호출 명령열: JMP MAXIMUM들어올 때 조건: rI1 = n; n ≥ 1이라고 가정.나갈 때 조건: rA= max{1≤k≤n} CONTENTS(X + k) = CONTENTS(X + rI2); rI3 = 0 ; rJ와 CI도 영향을 받음. 해답:호출 명령열: JMP MAXN; 또는 만일 n = 100이면 JMP MAX100들어올 때 조건: MAXN 진입점의 경우 rI3 = n (n ≥ 1 이라고 가정).나갈 때 조건: (4)에서와 같음.
5. 2. [10] JSJ 명령을 사용하지 않고 (6)과 같은 일을 하는 코드를 제시하라.
6. 2. [10] JSJ 명령을 사용하지 않고 (6)과 같은 일을 하는 코드를 제시하라. 1.4.1.(6) MAX50 ENT3 50 JSJ MAXN MAX100 ENT3 100 MAXN STJ EXIT JMP 2F .. ..
7. 2. [10] JSJ 명령을 사용하지 않고 (6)과 같은 일을 하는 코드를 제시하라. 1.4.1.(6) MAX50 ENT3 50 JSJ MAXN MAX100 ENT3 100 MAXN STJ EXIT JMP 2F .. .. 1.4.1.(6) MAX50 STJ EXIT ENT3 50 JMP 2F MAX100 ENT3 100 MAXN STJ EXIT JMP 2F .. .. rJ를 미리 저장하고 JUMP한다.
8. 3. [M15] 서브루틴 수행의 결과로 레지스터 J와 비교 지시자에 어떤 일이 생기는지를 명시적으로 밝힘으로써 (4)의 정보를 완성하라. 또한 레지스터 I1이 양의 값이 아닐 때 어떤 일이 생기는지도 말하라.
9. 4. [21] r과 n이 매개변수이고 a가 a ≡ n (modulo r)인, 다시 말해서 a = 1 + (n - 1) mod r인 양수라고 할 때,X[a], X[a+r], X[a+2r], ..., X[n]의 최대값을 구하는 서브루틴이 되도록 MAXN을 일반화하라.r = 1 인 경우에 대한 특별한 진입점도 제공할 것. 또한, 일반화한 서브루틴의 특성을 (4)처럼 서술하라.
10. 4. [21] r과 n이 매개변수이고 a가 a ≡ n (modulo r)인, 다시 말해서 a = 1 + (n - 1) mod r인 양수라고 할 때,X[a], X[a+r], X[a+2r], ..., X[n]의 최대값을 구하는 서브루틴이 되도록 MAXN을 일반화하라.r = 1 인 경우에 대한 특별한 진입점도 제공할 것. 또한, 일반화한 서브루틴의 특성을 (4)처럼 서술하라. n = 7 r = 3 a = 1 n = 8 r = 3 a = 2
11. 4. [21] r과 n이 매개변수이고 a가 a ≡ n (modulo r)인, 다시 말해서 a = 1 + (n - 1) mod r인 양수라고 할 때,X[a], X[a+r], X[a+2r], ..., X[n]의 최대값을 구하는 서브루틴이 되도록 MAXN을 일반화하라.r = 1 인 경우에 대한 특별한 진입점도 제공할 것. 또한, 일반화한 서브루틴의 특성을 (4)처럼 서술하라. SMAX1 ENT1 1 r = 1SMAX STJ EXIT 그 외의 r. JMP 2F 이전과 같은 방식으로 진행 ...DEC3 0,1 r만큼 감소. J3P 1BEXIT JMP * 나간다.
12. 4. [21] r과 n이 매개변수이고 a가 a ≡ n (modulo r)인, 다시 말해서 a = 1 + (n - 1) mod r인 양수라고 할 때,X[a], X[a+r], X[a+2r], ..., X[n]의 최대값을 구하는 서브루틴이 되도록 MAXN을 일반화하라.r = 1 인 경우에 대한 특별한 진입점도 제공할 것. 또한, 일반화한 서브루틴의 특성을 (4)처럼 서술하라.
13. 5. [21] MIX에 J레지스터가 없다고 가정하고, 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라. 그리고 그러한 고안의 실용 사례로, (1)과 사실상 동등한 MAX100 서브루틴을 작성하라. 그 서브루틴의 특성을 (4)처럼 서술하라. (MIX의 자기 수정 코드 방식은 유지할 것.)
14. 5. [21] MIX에 J레지스터가 없다고 가정하고, 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라. 그리고 그러한 고안의 실용 사례로, (1)과 사실상 동등한 MAX100 서브루틴을 작성하라. 그 서브루틴의 특성을 (4)처럼 서술하라. (MIX의 자기 수정 코드 방식은 유지할 것.) 다른 레지스터를 사용해서 수동으로 JUMP주소를 기록한다. 호출 코드 ENTA *+2JMP MAX100 서브루틴 코드 MAX100 STA EXIT(0:2) .. MAX100 STJ EXIT JMP 2F ..
15. 6. [26] MIX에 MOVE 연산자가 없다고 가정하고,호출 명령열"JMP MOVE; NOP A,I(F)"가 "MOVE A,I(F)"(MOVE 명령이 허용된다고 할 때)와 같은 효과가 되는 서브루틴 MOVE를 작성하라.레지스터 J에 대한 영향과 서브루틴이 하드웨어 명령보다 당연히 더 많은 시간과 공간을 차지한다는 사실에서만 차이가 나야한다.
16.
17. 6. [26] MIX에 MOVE 연산자가 없다고 가정하고,호출 명령열"JMP MOVE; NOP A,I(F)"가 "MOVE A,I(F)"(MOVE 명령이 허용된다고 할 때)와 같은 효과가 되는 서브루틴 MOVE를 작성하라.레지스터 J에 대한 영향과 서브루틴이 하드웨어 명령보다 당연히 더 많은 시간과 공간을 차지한다는 사실에서만 차이가 나야한다. MOVE A,I(F) JMP MOVE NOP A,I(F)
18. 호출 프로그램 / 메모리 영역 정의 ENTA 55 rA, rI2는 사용중이었다고 가정 ENT2 11 ENT1 3 복사목적지 주소 JMP MOVE NOP 1(2) 원본주소(복사크기)
19. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0
20. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 rA와 rI2를 저장 레지스터 저장
21. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 rI2에 NOP 1(2) 명령이 저장된 주소를 읽음 NOP A,I(F) 읽기
22. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 명령열NOP 1(2) A,I 에서 A,I를 읽고 *+2에 저장함. NOP A,I(F) 읽기
24. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 다시 NOP 0(2) <- 명령이 저장된 주소를 읽음 복사되는 크기를 음수로 읽음. NOP A,I(F) 읽기
25. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 복사크기가 0이면 종료 MOVE 0은 아무동작 안함. 인수 검사
26. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 rA가 소스영역끝주소+1을 가르키도록 한다. rI1은 복사영역끝주소+1을 가르키도록 한다. 소스주소 – (- 크기) 인덱스 지정
27. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 소스를 읽고 값을 쓴다. 인덱스 감소 인덱스가 음수면 다시 값 복사 / 반복
28. MOVE STJ 3F STA 4F ST2 5F(0:2) LD2 3F(0:2) LDA 0,2(0:3) STA *+2(0:3) LD2 5F(0:2) ENTA * LD2 3F(0:2) LD2N 0,2(4:4) J2Z 1F DECA 0,2 STA2F(0:2) DEC1 0,2 ST16F(0:2)2H LDA *,26H STA *,2 INC2 1 J2N 2B1H LDA 4F5H ENT2 *3H JMP * 4H CON 0 rA와 rI2를 복구하고 종료 레지스터 복구
29. 7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가? 프로그램 블록들이 "읽기 전용"임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다. 명령들이 변하지 않는다면 하드웨어의 명령 캐시(cache)가 더 빠르고 저렴해진다. (2)에서 "캐시" 대신 "파이프라인"이라고 해도 마찬가지. 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다. CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며, 시간도 더 소비한다. 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다. 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다(연습문제 1.4.3.2-7). 점프 수정 루틴은 "프로파일링"(각 명령의 수행 횟수를 계산하는 것)을 위한 중요한 진단 도구이다.
30. 7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가? 프로그램 블록들이 "읽기 전용"임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다. 명령들이 변하지 않는다면 하드웨어의 명령 캐시(cache)가 더 빠르고 저렴해진다. (2)에서 "캐시" 대신 "파이프라인"이라고 해도 마찬가지. 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다. CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며, 시간도 더 소비한다. 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다. 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다(연습문제 1.4.3.2-7). 점프 수정 루틴은 "프로파일링"(각 명령의 수행 횟수를 계산하는 것)을 위한 중요한 진단 도구이다. MIX가 멀티태스킹 환경이면 자기 수정 코드는 다른 프로세스 동작에 영향을 준다.
31. 7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가? 프로그램 블록들이 "읽기 전용"임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다. 명령들이 변하지 않는다면 하드웨어의 명령 캐시(cache)가 더 빠르고 저렴해진다. (2)에서 "캐시" 대신 "파이프라인"이라고 해도 마찬가지. 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다. CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며, 시간도 더 소비한다. 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다. 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다(연습문제 1.4.3.2-7).점프 수정 루틴은 "프로파일링"(각 명령의 수행 횟수를 계산하는 것)을 위한 중요한 진단 도구이다. 1.4.3 발표하시는 분이..