Report시스템 소프트웨어 #5과 목시스템 소프트웨어전 공정보 컴퓨터 공학부담당교수정 기 동성 명박장호학 번200324236제 출 일07. 12. 186.2절1. 6.2.1절에서 인터럽트의 발생은 그것과 동일한 우선 순위나 그 이하의 우선 순위를 갖는 다른 인터럽트의 발생을 막는다고 가정했다. 만약 단순하게 동일한 등급의 다른 인터럽트의 발생을 막는다면, 본문에서 서술한 방법대로 진행될까?⇒ 같은pc와 sw를 공유하는 인터럽트의 발생을 막고 우선순위가 자신보다 낮은 인터럽트에 대해서는 블록이 이루어지지 않으므로 우선순위가 낮은 인터럽트의 동작이 실행되게 되므로 본문의 내용과는 다르게 진행된다.3. 인터럽트 형식을 가리키는 플래그 비트를 가지는 하나의 단일한 등급 대신에, 여러 개의 서로 다른 인터럽트 등급을 가질 때의 장점은 무엇인가?⇒ 단일 플래그 비트의 경우 자신과 동일하거나 우선순위가 낮은 등급의 인터럽트는 모두 차단하지만 등급이 여러 개일 경우, 등급에 따라 인터럽트의 실행이나 블록이 사용자의 의도에 맞게 이루어질 수 있다.5. SIC/XE에서 SW의 IDLE비트를 1로 하여, CPU를 유휴상태로 만들자. 그러한 하드웨어 기능이 다중프로그래밍을 지원하는 컴퓨터에서 필요한가?⇒ 다중 프로그래밍을 지원하는 컴퓨터의 경우 여러 사용자가 동시에 자원을 공유하여 사용하므로 개개인의 사용자의 입장에서 I/O같은 유휴상태가 많이 생기는 작업을 많이 할수록 전체 시스템의 효율이 좋아지므로 유휴상태플래그는 쓰지 않는 것이 좋다.12. 두 개의 작업이 수행되고 있다. 작업 A는 입출력보다 CPU에 많은 시간을 사용하고, 작업 B는 CPU보다 입출력에 많은 시간을 사용하고 있다. 전체 시스템 성능을 향상시키기 위해 두 작업 중 어느 작업이 보다 높은 디스패치 우선 순위를 가져야 하는가?⇒ 위와 같은 상황에서는 A 프로세서가 cpu 사용량이 많기 때문에 타임 슬라이스를 많이 할당하여 B작업으로 인한 cpu 유휴시간을 줄여야 한다. 하지만 A작업에 높은 디스패치 우선순위를 주게 되면 cpu의 사용이 적은 B작업은 A작업에게 cpu점유를 많이 빼앗기므로 B작업의 지연시간이 길어진다. 하지만 B에게 높은 디스패치 우선순위를 주게되면 B cpu사용시간은 적지만 I/O작업으로 인해 장시간 블록된후 A작업이 cpu를 사용하게 된다.13. 입출력 감독자가 우선 순위 시스템에 기초한 ‘채널 큐’로부터 입출력 요구를 선택할 수 있다고 가정하자. 연습문제 12에서 이런 방식으로 할 때, 두작업 중 어느 작업이 우선 순위를 갖겠는가?⇒ 채널 큐의 경우 I/O 에 관한 부분이므로 12의 문제와 반대되는 경우이다. B의 우선순위가 높다면 A는 I/O를 줄이기 위해 많은 시간을 기다려야 하므로 A에게 높은 우선순위를 주어야 한다.21. 어떤 요구 페이지 시스템에서는 페이지가 수정되었는지 여부에 근거하여 메모리로부터 제거할 페이지를 선택한다. 즉, 이 시스템은 최근에 로드된 이후 수정된 페이지 보다는 수정되지 않은 페이지를 선호한다. 이러한 방법의 장점과 단점은 무엇이겠는가?⇒ (단점) 이 방법은 최소최근 사용(LRU)라고 불리는 방식이며 마지막에 참조된 기록을 보존하면 많은 부하가 생긴다. 하지만 사용빈도가 낮은 페이지를 페이지 프레임에서 제거하여 사용빈도가 높은 다른 페이지를 더욱 많이 가져옴으로서 페이지 손실을 줄일 수 있다.22. 프로그래머는 프로그램의 지역적 참조성(locality of freference)을 향상시키기 위해서 어떠한 방법을 사용하는가? 어떠한 프로그래밍 기법과 자료구조가 지역적 참조성 정도를 떨어뜨리는가?
Report시스템 소프트웨어 #4과 목시스템 소프트웨어전 공정보 컴퓨터 공학부담당교수정 기 동성 명박장호학 번200324236제 출 일07. 11. 275.1절2. 그림 5.2의 문법에 따라 다음 들에 대한 파스 트리를 그리시오.a) ALPHA + BETAid{ALPHA}+id{BETA}b) ALPHA - BETA * GAMMAid{ALPHA}-id{BETA}*id{GAMMA}c) ALPHA DIV (BETA + GAMMA ) -DELTAid{ALPHA}DIV(id{BETA}+id{GAMMA})-id{DELTA}3. 그림 5.2의 문법에서 규칙 10과 11이 다음과 같이 수정되었다고 가정하자 ::= | * | DIV ::= | + | -수정된 문법에 따라 문제 2의 들에 대한 파스트리를 그리시오.문법의 수정이 산술 연산자의 우선순위에 어떤 영향을 끼치는가?a.id{ALPHA}+id{BETA}b.id{ALPHA}-id{BETA}*id{GAMMA}c.id{ALPHA}DIV(id{BETA}+id{GAMMA})-id{DELTA}≫문법의 수정에 따라 *,DIV연산보다 +,-의 연산이 우선순위가 높아졌다.4. 그림 5.2의 문법에서 규칙 10과 11이 삭제되고 다음의 단일한 규칙으로 변경되었다고 가정하자. ::= | + | -| * | DIV수정된 문법에 따라 문제 2의 들에 대한 파스트리를 그리시오.문법의 수정이 산술 연산자의 우선순위에 어떤 영향을 끼치는가?a.id{ALPHA}+id{BETA}b.id{ALPHA}-id{BETA}*id{GAMMA}c.id{ALPHA}DIV(id{BETA}+id{GAMMA})-id{DELTA}≫우선순위는 모두 같아진다. 연산은 factor로부터 이루어진다.15. 연산자 우선순위 기법과 그림 5.11 의 우선순위 행렬을 사용하여 그림 5.1의 예제 프로그램에 있는 다음 문장들을 파스하시오.a) 11행의 배정문 SUMSQ := SUMSQ + VALUE * VALUEⅰ> id := id +ⅱ> id := + id *ⅲ> id := + * id ;ⅳ> id := + * ;ⅴ> id := + * ;ⅵ> id := + ;ⅶ> id := + ;ⅷ> id := ;ⅸ> b) 3행의 선언문 SUM, SUMSQ, I, VALUE, MEAN, VARIANCE : INTEGERⅰ> id ,ⅱ> , id ,ⅲ> , id ,ⅳ> , id ,ⅴ> , id ,ⅵ> , id :ⅶ> : INTEGERⅷ> : INTEGER ;ⅸ> : ;ⅹ> c) 7행에서 시작된 FOR문 FOR I := 1 TO 100 DOⅰ> FOR idⅱ> FOR id :=ⅲ> FOR id := int TOⅳ> FOR id := TO int DOⅴ> FOR id := TO DO BEGINⅵ> FOR id := TO DO ⅶ> FOR id := TO DO ⅷ> FOR DO ⅸ> 25. 어휘 분석 시 검출될 수 있는 원시 프로그램 오류에는 어떤 것들이 있는가?≫ 어휘분석은 프로그램을 스캔하고 구성하는 토큰들을 인식하는 것인데 이는 컴파일 될 프로그래밍 언어와 사용하는 문법에 의해 좌우된다. 이 때 원시 프로그램은 환경에 종속적인데 각 언어의 종속적인 항목에 어긋날 경우 오류가 발생할 수 있다. 그리고 허용되지 않는 문자의 입력, 어휘 오류의 경우에도 원시 프로그램에서 오류가 검출 된다.ex) SUM := ini?ial (알수 없는 문장)26. 구문 분석 시 검출될 수 있는 원시 프로그램 오류에는 어떤 것들이 있는가?≫ 구문 분석을 통해 문법을 파악하는데, 이때 문법에 맞지 않는 문장이 들어왔을 때 에러가 발생한다. 예를 들면 토큰들 사이에 우선순위 관계가 없는 경우, 두 개의 토큰들이 어떤 적법한 문장에서도 같이 나타날 수 없음을 의미하게 되는데 이 두 토큰의 조합이 발생하면 문법에 맞지 않아 구문 오류가 발생한다. 파싱을 하는데 비단말 기호로 번역되지 않는 토큰들이 남아있을 때 원시 프로그램에서 오류가 검출된다.27. 코드 생성 시 검출될 수 있는 원시 프로그램 오류에는 어떤 것들이 있는가?≫ 코드 생성 시에는 이미 어휘나 문법상 문제가 없으므로 그 이외의 문제가 발생한다. 코드 생성은 원시 프로그램을 컴퓨터가 이해할 수 있는 기계어로 바꾸는 부분인데 이 때 잘못된 메모리 접근 같은 경우에도 컴파일 타임에서 에러가 검출 될 것이며(이는 런타임 에러와 구분이 모호함), 좀 더 스트릭트한 경우라면 loop 내에서 야기되는 무한루프, 예를 들어 until I가 0까지 인데 I값은 계속 증가하는 경우에도 오류를 찾을 수 있을 것이다. 또한 의도한 데로 계산이 이루어 지지 않은 논리 오류나 의미의 분석에서 오류가 발생한다.5.1절4. 배열의 선언이 다음과 같을 때C : ARRAY[5 .. 20] OF INTEGER다음 문장에 대한 4쌍을 생성하시오.C[I] := 0-I#5i1*i1#3i2:=#0C[i2]5. 배열의 선언이 다음과 같고 행 우선 배열(row-major order)로 저장된다고 가정하자.D : ARRAY[-10 .. 10, 2 .. 12] OF INTEGER다음 문장에 대한 4쌍을 생성하시오.D[I, J] := 0D : ARRAY [ -10 .. 10, 2 ..12 ] OF INTEGERD [ I, J ] := 0-I-10i1*i111i2-J2i3+i2i3i4*i4#3i5:=#0,D[i5]8. 첨자 값에서 1을 뺄 필요가 없도록 하려면 그림 5.26(a)에서 정의된 배열 A에 대한 베이스 주소가 어떻게 변경되어야 하겠는가(1번 4쌍)?≫ 첨자값에서 1을 빼는 이유는 베이스 주소와 I의 차이를 구하기 위해 베이스주소의 시작점인 1을 빼주는 것인데 이때 베이스 주소가 0부터 시작하게 되면 1을 뺄 필요가 없어지게 된다. A : ARRAY [0 .... 9]10. 배열의 선언이 다음과 같을 때T : ARRAY[1..5, 1..100] OF INTEGER다음 문장들을 4쌍들로 번역하고 그 결과에서 공통 부분식을 제거하시오K := J - 1;FOR I := 1 TO 5 DOBEGINT[I, J] := K * K;J := J + K;T[I,J] := K * K - 1ENDT : ARRAY [ 1 .. 5, 1 .. 100 ] OF INTEGERK := J - 1;FOR I := 1 TO 5 DOBEGINT [ I, J ] := K * K;J := J + K;T [ I, J ] := K * K - 1;END(1)-J#1i1(2):=i1K(3):=#1I(4)JGTI#5(24)(5)-I#1I2(6)*I2#100I3(7)-J#1I4(8)+I3I4I5(9)*I5#3I7(10)*KKI8(11):=I8T[I7](12)+JKI9(13):=I9J(14)-I#1I10(15)*I10#100I11(16)-J#1I12(17)+I11I12I13(18)*I13#3I14(19)*KKI15(20)-I15#1I16(21):=I16T[I14](22)+#1II17(23):=I17I(24)J(4)
Report시스템 소프트웨어 #3과 목시스템 소프트웨어전 공정보 컴퓨터 공학부담당교수정 기 동성 명박장호학 번200324236제 출 일07. 11. 154.1절3. 매크로 호출문은 원시 프로그램의 일부분이다. 많은 경우에, 프로그래머는 매크로 확장에서 이 문장들을 고려하지 않는다. 매크로 호출문은 리스트에 단 한번 나타나고, 매크로의 확장은 나타나지 않게 하기 위해 매크로 프로세서와 어셈블러를 어떻게 처리해야 하는가?≫ 매크로 호출문이 리스트에 단 한번 나타나고 매크로의 확장이 나타나지 않게 하려면 매크로 프로세서에서 매크로 호출문이 나타날 경우, 매크로 정의 부분으로 주소를 지정하여 어셈블 시 매크로 호출문에서 지정된 주소로 jump하여 실행 되어야한다.6. 주어진 논리적 기능을 수행하기 위해, 프로그래머는 매크로 혹은 부루틴 중 어느 것을 사용할 것인지 어떻게 결정할 수 있는가?≫ 매크로 프로세서의 경우 부루틴 호출에 의한 프로그램 분기가 발생하지 않으므로 실행시간을 단축 시킬 수 있다는 장점이 있는 반면 반복 호출에 따른 소스 확장으로 프로그램 소스가 길어지며 메모리를 낭비한다는 단점이 있는데, 프로그램 구현시에 이러한 사항을 고려하여 결정하면 된다.MacroSub Program공통점반복되는 작업을 독립시켜 하나의 모듈로 작성하여 놓은 것다른점컴파일 전에 매크로 프로세서에 의해 확장이 일어남실행이 빠름메모리 사용량이 많음컴파일 후 실행시에 Call/Return에 의해실행이 이루어짐실행이 느림메모리 사용량이 적음7. 어떤 논리적 작업이 어셈블리 언어 프로그램의 다른 10군데에서 수행된다고 가정하자. 이 작업은 매크로 혹은 부루틴으로 구현될 수 있다. 매크로를 사용하는 것이 부루틴의 사용보다 중앙 메모리를 적게 차지하는 경우를 설명하시오.≫ 논리 작업 내부에서 사용 되는 변수가 작업 내부의 변수가 아니라 메인 내부의 변수일 경우 매크로의 경우는 코드 자체가 확장되는 형태이므로 새로운 메모리를 이용해서 변수를 정의할 필요가 없지만 부루틴의 경우에는 호출시마다 필요한 변수를 call by value로서 재정의 해야 하므로 메모리 낭비가 더욱 커진다. 또한 실행 코드가 간단하면 부루틴보다 매크로인 경우가 메모리 낭비가 적다.8. 어떤 매크로는 단순히 부루틴을 부르는 명령어로 확장된다. “순수한” 매크로, 또는 “순수한” 부루틴의 사용과 비교해 볼 때 이런 방법은 어떤 장점을 갖는가?≫ 논리 작업 중에 동시에 여러 부루틴의 호출이 필요한 경우가 있는데 이때 이 부루틴 호출 코드를 매크로화 하면 “순수한” 매크로 일 경우의 프로그램 소스가 길어지는 단점이나 “순수한”부루틴의 사용시에 부루틴을 호출하는 코드를 일일이 작성해야하는 단점을 해결할 수 있다.4.2절5. 다음 두 문장들의 순서 사이에 가장 중요한 차이점은 무엇인가?LDAALPHACOMP#0JEQSKIPLDA#3STABETASKIP...a)IF(&ALPHA NE 0)BETASET3ENDIFb)≫ a는 순서대로 ALPHA값을 로드하여 그 값이 0이면 BETA값을 설정하지 않고(SKIP), 0이 아닐 경우만 BETA값을 3으로 저장해준다. b도 동일한 작업을 위한 코드 이지만 ALPHA값을 먼저 확인한 후 SET내용이 실행되어 BETA값이 3으로 설정된다. 이로 인해 a보다 b가 적은 시간 내에 수행된다.11. 다음 두 제어 구조 사이의 가장 중요한 차이점은 무엇인가?LDT#8CLEARXLOOP...TIXRTJLTLOOPa)&CTRSET0WHILE(&CTR LT 8)..&CTRSET&CTR + 1ENDWb)≫ a는 T 레지스터에 8을 로드하여 X레지스터가 0부터 1씩 증가하며 8과 비교 했을 때 같은 값이 되면 LOOP를 빠져나오는 형태이고, b는 먼저 CTR과의 비교를 통한 True/False에 의 해 내부 코드가 실행되거나 skip 하는 형태로 이루어진다.18. 위치 매개변수에 디폴트 값을 어떻게 지정할 수 있는가? 그런 디폴트를 처리하기 위해 그림 4.5의 알고리즘에 어떤 변화가 필요한가?≫ 위치 매개변수는 if 문을 통해서 null값이 들어올 경우 값을 수정하는 형태로 설정 가능하다. 이에 초기 값이 없는 인자는 수정된 값을 ARGTAB에 넣고 if문을 찾지 못할 때는 오류를 출력하게 해주면 된다.19. 그림 4.8(a)에 나타난 RDBUFF의 정의를 참조하시오. 다음 각각의 매크로 호출문은 오류가 있다. 이 오류들 중 매크로 프로세서에 의해 검출 되는 것은 어떤 것이고, 어셈블러에 의해 검출 되는 것은 어떤 것인가?a) RDBUFFF3, BUF, RECL, ZZ{illiegal value specified for &EOR}≫ 위 경우에는 마지막 MAXLTH 변수가 NULL로 입력되는데 이는 매크로 프로세서에서 확장 지시자로써 인식하게 되며, 어셈블러에서는 정의된 변수를 찾지 못하므로 오류가 검출 된다.b) RDBUFFF3, BUF, RECL, 04, 2048, 01{too many arguments}≫ 위 경우에는 입력 변수가 오히려 많은 경우이므로 매크로 프로세서에서 오류가 검출 된다.c) RDBUFFF3, , RECL, 04{no value specified for &BUFADR}≫ 위 경우에는 2번째 변수가 지정 되지 않았는데, 이는 어셈블리 시에 변수를 찾지 못해 오류가 검출 된다.d) RDBUFFF3, RECL, BUF
Report시스템 소프트웨어 #2과 목시스템 소프트웨어전 공정보 컴퓨터 공학부담당교수정 기 동성 명박장호학 번200324236제 출 일07. 10. 23EXERCISES*Section 2.1*2. 다음 SIC 원시 프로그램에 대해 그림 2.4의 알고리즘을 이용하여 어셈블해 보아라.SUMSTART4000FIRSTLDXZEROLDAZEROLOOPADDTABLE, XTIXCOUNTJLTLOOPSTATOTALRSUBTABLERESW2000COUNTRESW1ZEROWORD0TOTALRESW1ENDFIRST#PASS 1 이후Intermediate file과 Symbol Table 생성LocSource Code4000SUMSTART40004000FIRSTLDXZERO4003LDAZERO4006LOOPADDTABLE, X4009TIXCOUNT400CJLTLOOP400FSTATOTAL4012RSUB4015TABLERESW20005785COUNTRESW15788ZEROWORD0578BTOTALRESW1ENDFIRST※ 1WORD는 3Byte 이므로 TABLE은 6000(16진수로 1770)이므로 COUNT 의 주소는 4015 +1770 = 5785 이다.Sybol을 저장하는 SYMTAB을 작성SymbolAddressFIRST4000LOOP4006TABLE4015COUNT5785ZERO5788TOTAL578B#pass 2Symbol을 통해 object code 생성.H^SUM^004000^00178CT^004000^15^045788^005788^18C015^2C5785^384006^0C578B^4C0000T^005788^03^000000E^0040005. 많은 어셈블러들은 자유-형식 입력을 사용한다. 원시 문장의 1열에서 레이블이 시작하지만 다른 필드 ( 명령 코드, 피연산자, 주석문 )들은 임의의 열에서 시작할 것이다. 필드들은 공백으로 구분된다. 이러한 방식을 허용하기 위해서는 우리의 어셈블러 구조를 어떻게 수정해야 하는가?※1 PASS⇒ 프로그램을 읽어올 때 첫 단어가 OPTAB에 없을 경우 label 이 되면서 다음 단어가 opcode가 된다. label은 SYMTAB에 저장된다.※2 PASS⇒ 원시코드에서 읽어올 때 SYMTAB에 있으면 label이고 다음 단어를 OPTAB에서 서칭하고, SYMTAB에 없으면 OPTAB에서 찾아본다. OPTAB에 다음 단어를 찾으면 그 단어가 opcode이고 operand가 필요한 경우 이를 체크한다. OPTAB에도 없는 경우는 error 가 된다. opcode 다음의 단어를 읽어와 SYMTAB에 있으면 operand이고, opcode가 operand가 필요한데도 SYMTAB에 없으면 error가 된다. opcode에 operand가 필요 없다면 이는 comment가 된다.*Section 2.2*1. 어셈블러 자체가 명령어를 확장된 형식으로 어셈블할 필요가 있는지 결정할 수 있을까? ( 이것은 프로그래머가 확장 형식의 명령어에 ‘+’표시 하는 것을 피하게 해준다. )1Displacement23⇒ ① 명령행에서 ③을 참조하고 있을 경우에 +표시가 없다면 ②명령행이 4형식으로 수정될 경우에 ③명령행의 위치가 1byte 밀리게 된다. 이때 ②명령행이 ①에서의 경계에 있을 경우 ①한 4형식으로 수정되어야 하는 어셈블링 체계의 혼란이 생긴다. 하지만 이 또한 패스를 늘려서 밀려난 명령행의 위치를 더해주면 해결 할 수 있다.2. BASE 문장은 간단히 정보를 어셈블러에게 전달한다. 또한 프로그래머는 베이스 레지스터에게 정확한 값을 로드하는 LDB같은 명령어를 작성해야만 한다. 어셈블러는 자동적으로 BASE문장에서 LDB 명령어를 생성할 수 있을까? 만일 그렇다면, 이것을 수행하는 것에 대한 장점과 단점은 무엇인가?⇒ 어셈블러가 원시 코드에서 BASE 문장을 찾으면 LDB 명령어를 생성하여 실행하게 할 수는 있다. 이때 장점이라고 한다면 사용자가 LBD명령어를 다시 입력해야한다는 수고를 덜 수 있으며, 이미 B 레지스터에 값이 저장되어 있으므로 주소 접근 속도가 훨씬 빠르다는 점이다.단점은 사용자가 프로이용할 때가 있는데 다른 목적으로 이용중에 B 레지스터를 통해 주소를 접근 하려 한다면 사용자 목적의 값으로 이용할 수 없다는 점이다.3. 다음 SIC/XE 프로그램에서 각 문장에 대한 목적 코드를 생성하시오SUMSTART0FIRSTLDX#0LDA#0+LDB#TABLE2BASETABLE2LOOPADDTABLE, XADDTABLE2, XTIXCOUNTJLTLOOP+STATOTALRSUBCOUNTRESW1TABLERESW2000TABLE2RESW2000TOTALRESW1ENDFIRSTLoc원시 코드Object code0000SUMSTART00000FIRSTLDX#00500000003LDA#00100000006+LDB#TABLE269101790BASETABLE2000ALOOPADDTABLE,X1BA013000DADDTABLE2,X1BC0000010TIXCOUNT2F200A0013JLTLOOP3B2FF40016+STATOTAL0F102F00001ARSUB4F0000001DCOUNTRESW10020TABLERESW20001790TABLE2RESW20002F00TOTALRESW1ENDFIRST11.단지 프로그램 계수기 상대 주소 지정만을 갖는 기계에 대한 어셈블러를 작성한다고 하자. ( 즉, 직접 주소 지정 형식과 베이스 상대 주소 지정이 없다.) 메모리에서 피연산자로 절대 주소를 갖는 명령어를 어셈블한다고 하자. 메모리 주소 100(16진수)에서 레지스터 A로 로드하는 다음 예를 보자LDA 100이러한 명령어는 재배치 프로그램에서 어떻게 어셈블될 것인가? 어떤 재배치 연산이 필요한가?⇒직접 주소 지정 형식과 베이스 상대 주소 지정이 없으므로 모든 주소는 PC에서 2k의 범위 내에 있을 경우에는 이를 바로 이용 할 수 있으나 이 범위 밖의 경우에는 단순 주소 지정 박식을 이용하여 100을 가리키는 주소을 4형식으로 바로 접근 하는 재배치가 필요하다.*Section 2.3*3. 문자 표기에 약간의 확장으로 리터럴 피연산자로서 값 4의 한 워드를 지시하기위해LDA =W'3'성할 수 있다. 이것은 좋은 생각인가?⇒ 전혀 효율적이지 않다. ( LDA #3 )의 경우에는 즉시 주소지정방식으로서 3을 바로 A 레지스터에 저장하지만 위의 경우에는 메모리에 3의 값을 저장하여 그 값을 로드하게 되므로 이는 메모리를 추가로 사용하게 되고 또한 그 메모리에서 로드해야한다는 오버헤드가 생기므로 효율적이지 않다.7. 기호 ALPHA와 BETA가 원시 프로그램에서 레이블이라고 가정하자. 다음 두 문장의 차이는 무엇인가?(a) LDA ALPHA-BETA⇒ ALPHA의 주소와 BETA의 주소값의 차이가 A레지스터에 저장된다.(b) LDA ALPHASUB BETA⇒ ALPHA와 BETA에 각각 저장된 값의 차이가 A레지스터에 저장된다.8. 다음 문장들의 차이는 무엇인가?(a) LDA #3⇒ A 레지스터에 3을 즉시 주소 지정으로 로드한다.(b)THREE EQU 3..LDA #THREE⇒ 먼저 THREE라는 symbol에 3값을 저장하고 이 값을 A레지스터로 로드한다.(c)THREE EQU 3...LDA THREE⇒ THREE라는 symbol에 3값을 저장하고 A레지스터 THREE의 주소를 가진다.17. 그림 2.10에서 기호의 정의를 참조하면서, 다음 각 수식들의 값과 타입 그리고 ( 만일 있다면) 직관적인 의미를 설명하시오.(a) BUFFER-FIRST⇒ 주소의 차이를 뜻한다.0036 - 0000 = 0036 (Absolute)(b) BUFFER+4095⇒ BUFFER에서의 4095번째(마지막) 주소0036 + 4095(10진수) = 0036 + 0FFF = 1035(type : Relative)(c) MAXLEN-1⇒ BUFEND-BUFFER-1이므로 BUFFER의 시작주소와 마지막 주소의 차이1000 - 1 = 0FFF(Absolute)(d) BUFFER+MAXLEN-1⇒ BUFFER의 마지막 주소0036 + 1000 - 1 = 1035 (relative)(e) BUFFER-MAXLEN⇒ abs(0036 - 1000) = 0FCA(f) 2*LENG 2*MAXLEN-1⇒ 2 * 1000 - 1 = 1FFF(h) MAXLEN-BUFFER⇒ 1000 - 0036 = 0FCA(i) FIRST+BUFFER⇒ 0000 + 0036 = 0036(j) FIRST-BUFFER+BUFEND⇒ 0000 - 0036 + 1036 = 106C19. 그림 2.15의 프로그램에서 190행을 다음 문장MAXLEN EQU BUFEND - BUFFER으로 바꾸고, 133행을 다음 문장+LDT #MAXLEN으로 그림 2.9에서 했던 것처럼 바꿀 수 있을까?⇒ 바꿀 수 있다. 이때 MAXLEN에 저장되는 BUFEND-BUFFER값은 Absolute 값이고 또한 T 레지스터에 저장할 때 확장 형태로 이루어지면서 MAXLEN값을 즉시 주소 지정 방식으로 저장하므로 오류 없이 바꿀 수 있다.20. 어셈블러는 제어 섹션 내에서 정의되지 않은 임의의 참조를 외부 참조로 간단히 가정할 수 있다. 이러한 변경은 EXTREF 문장에 대한 필요를 제거해 준다. 이것은 좋은 생각인가?⇒ EXTREF 문장을 제거할 경우 위의 말처럼 섹션 내에서 정의 되지 않은 임의의 참조를 무조건 외부에 존재 할 것으로 가정하고 로더와 링커로 보낸다. 하지만 이때 이 참조가 외부에 존재 하는 것이 아니거나 사용자의 오타로 생겨나 참조일 경우 어셈블러에서 에러를 내지 않고 링크를 할 때 에러가 발생하게 된다. 그러므로 이것은 좋은 생각이 아니다.*Section 2.4*1. 몇 개의 전방 참조를 해결하는 것이 어셈블러의 패스 2 전체를 실행하는 것 보다 오버헤드를 줄일 수 있을 것이다. 왜 모든 어셈블러는 효율성을 위하여 단일 패스 기술을 사용하지 않는가?⇒ 단일 패스 기술에서는 전방 참조를 취급하기 위해서 목적 프로그램이 보조 기억 장소에 쓰이지 않고 메모리에 생성된다. 그리고 이후에 메모리에 저장된 값을 찾아서 프로그램 실행을 위해 그 위치로 점프하여 다중 패스의 오버헤드를 줄일 수 있으므로 소형 컴퓨터 등 기억 장치의 속도가 느릴 때는 효과적이지만 별도로 어셈블된 다른 있다.
Report시스템 소프트웨어 #1과 목시스템 소프트웨어전 공정보 컴퓨터 공학부담당교수정 기 동성 명박장호학 번200324236제 출 일07. 09. 27EXERCISESSection 1.31. Write a sequence of instructions for SIC to set ALPHA equal to the product of BETA and GAMMA. Assume that ALPHA, BETA, and GAMMA for defined as in Fig. 1.3(a).alpha 값의 위치BETA와 GAMMA값의 위치*작성코드*BETAGAMMAALPHABETA와 GAMMA값 설정ALPHA값의 확인(1E = 1^* 1 + 14 = 30)3. Write a sequence of instructions for SIC to set ALPHA equal to the integer portion of BETA÷GAMMA. Assume that ALPHA, BETA, and GAMMA for defined as in Fig. 1.3(a).*입력코드ALPHA값BETA값과 GAMMA1번과 동일한 방법으로 나누기하여 정수부분만 ALPHA 값에 저장한다.BETA값(12)과 GAMMA값(4)을 설정하고 break point 설정LIST 파일에서 확인한 것처럼 ALPHA값에 12/4의 정수부분인 3이 들어간 것을 확인 할 수 있었다.5. Write a sequence of instructions for SIC/XE to divide BETA by GAMMA, setting ALPHA to the value of the quotient, rounded to the nearest integer. Use register-to-register instructions to make the calculation as efficient as possible.BETA와 GAMMA를 그대로 나눈 뒤 X레지스터에 저장하고 그 값에 10을 곱한 값을 S 레지스터에 저장한다. BETA에 10을 곱한 값을 GAMMA로 나누어 S 레지스터와 저장된 A레지스터의 값의 차이가 5보다 크거나 같으면 X레지스터의 값을 불러와 1을 더한 값을(반올림) ALPHA에 저장하고 그 외에는 X레지스터의 값을 그대로 ALPHA에 저장한다.BETA값에 8, GAMMA값으로 5를 입력할 경우 8/5 = 1.6이므로 반올림되어 ALPHA값이 1이 아닌 2로 저장된 것을 알 수 있다.하지만 BETA값에 8, GAMMA값에 6을 입력한 경우는 8/6 = 1.33333....이므로 ALPHA값이 내림되어 1이 저장되었다.7. Write a sequence of instructions for SIC/XE to clear a 20-byte string to all blanks. Use immediate addressing and register-to-register instructions to make the process as efficient as possible.*작성코드먼저 20바이트의 ALPHA 값 지정 후 X값을 0에서 증가시키면서 20번동안 LOOP를 돌아서 ALPHA에 공백값을 채운다.결과에서 알 수 있듯이 RSUB(4F0000)이후에 공백(00)으로 이루어진 20바이트의 ALPHA가 저장되었다.9. Suppose that ALPHA is an array of 100 words, as defined in Fig. 1.5(b). Write a sequence of instructions for SIC/XE to set all 100 elements of the array to 0. Use immediate addressing and register-to-register instructions to make the process as efficient as possible.*작성코드결과 값을 보면 메모리에 1byte(00)으로 이루어진 워드가 총 100개 즉 300byte가 저장된 것을 알 수 있다.7번 문제와 동일한 방법으로 100개의 Word(3byte)로 이루어진 ALPHA지정 후 3씩 증가하는 LOOP를 돌면서 0인 CH레지스터가 ALPHA값에 100번 저장된다.11. Suppose that RECORD contains a 100-byte record, as in Fig. 1.7(b). Write a subroutine for SIC/XE that will write this record onto device 05. Use immediate addressing and register-to-register instructions to make the subroutine as efficient as possible.*작성코드‘05’인 DEVICE를 설정하고 REC에 저장과 동시에 DEVICE에 WRITE 한다.저장값은 88로 저장될 때 'X'로 저장되며 X 값의 증가에 따라 100번 LOOP를 돌면서 실행하게 된다.결과값을 보면 메모리 REC부분에 58로 100개가 저장되고 파일로도 DEV05파일에 'X'가 저장된 것을 알 수 있다.13. Write a subroutine for SIC/XE that will read a record into a buffer, as if Fig. 1.7(b). The record may be any length from 1 to 100 bytes. The end of the record is marked with a "null" character (ASCII code 00). The subroutine should place the length of the record read into a variable named LENGTH. Use immediate addressing and register-to-register instructions to make the subroutine as efficient as possible.sol)13번 문제의 해결을 위해서 우선 11번에서와 동일한 방법으로 DEV05에 저장할 파일을 DEVF2에 복사하여 DEVF2로부터 입력값을 LOAD한다.차이를 두기 위해 DEV05에 90개의 ‘X'를 입력한다.그리고 마지막 90번째인 0186 번지를 00으로 채우고 DEV05를 DEVF2로 복사한다.