Taocp 1.4.1 subroutine

32
TAOCP 1 1.4.1 서서서서 서서서서 아아아 아아아 [email protected]

description

아꿈사 발표자료

Transcript of Taocp 1.4.1 subroutine

Page 1: Taocp 1.4.1 subroutine

TAOCP 1

1.4.1 서브루틴 연습문제

아꿈사이영권

[email protected]

Page 2: Taocp 1.4.1 subroutine

1. [10] (4) 는 서브루틴 1.3.2M 의 특성들을 서술한 것이다 .그것을 참고해서 서브루틴 (5) 의 특성들을 서술하라 .

Page 3: Taocp 1.4.1 subroutine

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 일 경우의 진입점만 추가되었다 .

Page 4: Taocp 1.4.1 subroutine

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) 에서와 같음 .

Page 5: Taocp 1.4.1 subroutine

2. [10] JSJ 명령을 사용하지 않고 (6) 과 같은 일을 하는 코드를 제시하라 .

Page 6: Taocp 1.4.1 subroutine

2. [10] JSJ 명령을 사용하지 않고 (6) 과 같은 일을 하는 코드를 제시하라 .

1.4.1.(6)

MAX50 ENT3 50JSJ MAXN

MAX100 ENT3100

MAXN STJ EXITJMP 2F....

Page 7: Taocp 1.4.1 subroutine

2. [10] JSJ 명령을 사용하지 않고 (6) 과 같은 일을 하는 코드를 제시하라 .

1.4.1.(6)

MAX50 ENT3 50JSJ MAXN

MAX100 ENT3100

MAXN STJ EXITJMP 2F....

1.4.1.(6)

MAX50 STJ EXITENT3 50JMP 2F

MAX100 ENT3100

MAXN STJ EXITJMP 2F....

rJ 를 미리 저장하고 JUMP 한다 .

Page 8: Taocp 1.4.1 subroutine

3. [M15] 서브루틴 수행의 결과로 레지스터 J 와 비교 지시자에 어떤 일이 생기는지를 명시적으로 밝힘으로써 (4) 의 정보를 완성하라 .또한 레지스터 I1 이 양의 값이 아닐 때 어떤 일이 생기는지도 말하라 .

Page 9: Taocp 1.4.1 subroutine

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) 처럼 서술하라 .

Page 10: Taocp 1.4.1 subroutine

n = 7r = 3a = 1

1 2 3 4 5 6 7

4 7 12 25 3 9 17

1 2 3 4 5 6 7 8

4 7 12 25 3 9 17 23

n = 8r = 3a = 2

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) 처럼 서술하라 .

Page 11: Taocp 1.4.1 subroutine

SMAX1 ENT1 1 r = 1SMAX STJ EXIT 그 외의 r.

JMP 2F 이전과 같은 방식으로 진행...DEC3 0,1 r 만큼 감소 .J3P 1B

EXIT JMP * 나간다 .

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) 처럼 서술하라 .

Page 12: Taocp 1.4.1 subroutine

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) 처럼 서술하라 .

Page 13: Taocp 1.4.1 subroutine

5. [21] MIX 에 J 레지스터가 없다고 가정하고 , 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라 .그리고 그러한 고안의 실용 사례로 , (1) 과 사실상 동등한 MAX100 서브루틴을 작성하라 . 그 서브루틴의 특성을 (4)처럼 서술하라 . (MIX 의 자기 수정 코드 방식은 유지할 것 .)

Page 14: Taocp 1.4.1 subroutine

5. [21] MIX 에 J 레지스터가 없다고 가정하고 , 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라 .그리고 그러한 고안의 실용 사례로 , (1) 과 사실상 동등한 MAX100 서브루틴을 작성하라 . 그 서브루틴의 특성을 (4)처럼 서술하라 . (MIX 의 자기 수정 코드 방식은 유지할 것 .)

다른 레지스터를 사용해서 수동으로 JUMP 주소를 기록한다 .

MAX100 STA EXIT(0:2) ..

MAX100 STJ EXIT

JMP 2F ..

서브루틴 코드

ENTA   *+2JMP          MAX100

호출 코드

Page 15: Taocp 1.4.1 subroutine

6. [26] MIX 에 MOVE 연산자가 없다고 가정하고 ,호출 명령열 "JMP MOVE; NOP A,I(F)" 가 "MOVE A,I(F)"(MOVE 명령이 허용된다고 할 때 ) 와 같은 효과가 되는 서브루틴 MOVE 를 작성하라 .레지스터 J 에 대한 영향과 서브루틴이 하드웨어 명령보다 당연히 더 많은 시간과 공간을 차지한다는 사실에서만 차이가 나야한다 .

Page 16: Taocp 1.4.1 subroutine
Page 17: Taocp 1.4.1 subroutine

6. [26] MIX 에 MOVE 연산자가 없다고 가정하고 ,호출 명령열 "JMP MOVE; NOP A,I(F)" 가 "MOVE A,I(F)"(MOVE 명령이 허용된다고 할 때 ) 와 같은 효과가 되는 서브루틴 MOVE 를 작성하라 .레지스터 J 에 대한 영향과 서브루틴이 하드웨어 명령보다 당연히 더 많은 시간과 공간을 차지한다는 사실에서만 차이가 나야한다 .

MOVE A,I(F)JMP MOVENOP A,I(F)

Page 18: Taocp 1.4.1 subroutine

호출 프로그램 / 메모리 영역 정의

Memory 사용0~4 사용자 영역 (move 에 사

용 )5~29 MOVE 루틴 코드 영역30 주 프로그램 코드 영역

ENTA 55 rA, rI2 는 사용중이었다고 가정ENT2 11ENT1 3 복사목적지 주소JMP MOVENOP 1(2) 원본주소 ( 복사크기 )

+/- A A I F C01 332 223456

Page 19: Taocp 1.4.1 subroutine

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

Page 20: Taocp 1.4.1 subroutine

rA 와 rI2 를 저장

+/- A A I F C +/- A A I F C0 rA 551 33 rI1 32 22 rI2 113 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

레지스터 저장

Page 21: Taocp 1.4.1 subroutine

rI2 에NOP 1(2)명령이 저장된 주소를 읽음

+/- A A I F C +/- A A I F C0 rA 551 33 rI1 32 22 rI2 353 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

NOP A,I(F) 읽기

Page 22: Taocp 1.4.1 subroutine

명령열 NOP 1(2) A,I 에서A,I 를 읽고*+2 에 저장함 .

+/- A A I F C +/- A A I F C0 rA 11 33 rI1 32 22 rI2 353 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

NOP A,I(F) 읽기

Page 23: Taocp 1.4.1 subroutine

rI2 를 복구NOP 1,2(2) 이럴경우 쓰기때문임 .

ENTA 로 원본주소를 읽음 .

+/- A A I F C +/- A A I F C0 rA 11 33 rI1 32 22 rI2 113 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

NOP A,I(F) 읽기

Page 24: Taocp 1.4.1 subroutine

+/- A A I F C +/- A A I F C0 rA 11 33 rI1 32 22 rI2 - 23 5H 114 3H 355 4H 556 NOP 1 2

다시 NOP 0(2) <- 명령이 저장된 주소를 읽음

복사되는 크기를 음수로 읽음 .

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

NOP A,I(F) 읽기

Page 25: Taocp 1.4.1 subroutine

복사크기가 0 이면 종료MOVE 0 은 아무동작 안함 .

+/- A A I F C +/- A A I F C0 rA 11 33 rI1 32 22 rI2 - 23 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

인수 검사

Page 26: Taocp 1.4.1 subroutine

rA 가 소스영역끝주소 +1 을 가르키도록 한다 .rI1 은 복사영역끝주소 +1 을가르키도록 한다 .소스주소 – (- 크기 )

+/- A A I F C +/- A A I F C0 rA 31 33 rI1 52 22 rI2 - 23 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

인덱스 지정

Page 27: Taocp 1.4.1 subroutine

소스를 읽고값을 쓴다 .인덱스 감소인덱스가 음수면 다시

+/- A A I F C +/- A A I F C0 rA 31 33 rI1 52 22 rI2 - 13 5H 114 3H 355 4H 556 NOP 1 2

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

값 복사 / 반복

Page 28: Taocp 1.4.1 subroutine

rA 와 rI2 를 복구하고 종료

MOVE STJ 3FSTA 4FST2 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 1FDECA 0,2STA 2F(0:2)DEC1 0,2ST1 6F(0:2)

2H LDA *,26H STA *,2

INC2 1J2N 2B

1H LDA 4F5H ENT2 *3H JMP *4H CON 0

+/- A A I F C +/- A A I F C0 rA 551 33 rI1 52 22 rI2 - 113 33 5H 114 22 3H 355 4H 556 NOP 1 2

레지스터 복구

Page 29: Taocp 1.4.1 subroutine

7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?

(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .

(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .

(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .

(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .

(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .

Page 30: Taocp 1.4.1 subroutine

7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?

(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .

(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .

(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .

(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .

(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .

MIX 가 멀티태스킹 환경이면자기 수정 코드는

다른 프로세스 동작에 영향을 준다 .

Page 31: Taocp 1.4.1 subroutine

7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?

(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .

(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .

(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .

(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .

(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .

1.4.3 발표하시는 분이 ..

Page 32: Taocp 1.4.1 subroutine

감사합니다 . :D