Taocp 1.4.1 subroutine
-
Upload
youngkwon-lee -
Category
Documents
-
view
730 -
download
1
description
Transcript of Taocp 1.4.1 subroutine
1. [10] (4) 는 서브루틴 1.3.2M 의 특성들을 서술한 것이다 .그것을 참고해서 서브루틴 (5) 의 특성들을 서술하라 .
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 일 경우의 진입점만 추가되었다 .
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) 에서와 같음 .
2. [10] JSJ 명령을 사용하지 않고 (6) 과 같은 일을 하는 코드를 제시하라 .
2. [10] JSJ 명령을 사용하지 않고 (6) 과 같은 일을 하는 코드를 제시하라 .
1.4.1.(6)
MAX50 ENT3 50JSJ MAXN
MAX100 ENT3100
MAXN STJ EXITJMP 2F....
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 한다 .
3. [M15] 서브루틴 수행의 결과로 레지스터 J 와 비교 지시자에 어떤 일이 생기는지를 명시적으로 밝힘으로써 (4) 의 정보를 완성하라 .또한 레지스터 I1 이 양의 값이 아닐 때 어떤 일이 생기는지도 말하라 .
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 = 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) 처럼 서술하라 .
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) 처럼 서술하라 .
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) 처럼 서술하라 .
5. [21] MIX 에 J 레지스터가 없다고 가정하고 , 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라 .그리고 그러한 고안의 실용 사례로 , (1) 과 사실상 동등한 MAX100 서브루틴을 작성하라 . 그 서브루틴의 특성을 (4)처럼 서술하라 . (MIX 의 자기 수정 코드 방식은 유지할 것 .)
5. [21] MIX 에 J 레지스터가 없다고 가정하고 , 레지스터 J를 사용하지 않는 서브루틴 연계를 위한 수단을 고안하라 .그리고 그러한 고안의 실용 사례로 , (1) 과 사실상 동등한 MAX100 서브루틴을 작성하라 . 그 서브루틴의 특성을 (4)처럼 서술하라 . (MIX 의 자기 수정 코드 방식은 유지할 것 .)
다른 레지스터를 사용해서 수동으로 JUMP 주소를 기록한다 .
MAX100 STA EXIT(0:2) ..
MAX100 STJ EXIT
JMP 2F ..
서브루틴 코드
ENTA *+2JMP MAX100
호출 코드
6. [26] MIX 에 MOVE 연산자가 없다고 가정하고 ,호출 명령열 "JMP MOVE; NOP A,I(F)" 가 "MOVE A,I(F)"(MOVE 명령이 허용된다고 할 때 ) 와 같은 효과가 되는 서브루틴 MOVE 를 작성하라 .레지스터 J 에 대한 영향과 서브루틴이 하드웨어 명령보다 당연히 더 많은 시간과 공간을 차지한다는 사실에서만 차이가 나야한다 .
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)
호출 프로그램 / 메모리 영역 정의
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
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
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
레지스터 저장
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) 읽기
명령열 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) 읽기
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) 읽기
+/- 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) 읽기
복사크기가 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
인수 검사
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
인덱스 지정
소스를 읽고값을 쓴다 .인덱스 감소인덱스가 음수면 다시
+/- 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
값 복사 / 반복
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
레지스터 복구
7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?
(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .
(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .
(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .
(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .
(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .
7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?
(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .
(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .
(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .
(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .
(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .
MIX 가 멀티태스킹 환경이면자기 수정 코드는
다른 프로세스 동작에 영향을 준다 .
7. [20] 오늘날의 관점에서 자기 수정 코드가 문제가 되는 이유는 무엇인가 ?
(1) 프로그램 블록들이 " 읽기 전용 " 임을 알고 있다면 운영체제는 고속 메모리를 좀 더 효율적으로 할당할 수 있다 .
(2) 명령들이 변하지 않는다면 하드웨어의 명령 캐시 (cache) 가 더 빠르고 저렴해진다 .
(3)(2) 에서 " 캐시 " 대신 " 파이프라인 " 이라고 해도 마찬가지 . 어떤 명령이 파이프라인에 진입한 후에 변경되었다면 파이프라인은 비워져야 한다 . CPU 회로가 이러한 조건을 점검하려면 더 복잡해져야 하며 , 시간도 더 소비한다 .
(4) 자기 수정 코드는 한 번에 한 프로세스에서만 사용할 수 있다 .
(5) 자기 수정 코드는 점프 추적 루틴을 실패하게 만들 수 있다 ( 연습문제 1.4.3.2-7). 점프 수정 루틴은 " 프로파일링 "( 각 명령의 수행 횟수를 계산하는 것 ) 을 위한 중요한 진단 도구이다 .
1.4.3 발표하시는 분이 ..
감사합니다 . :D