LAB


1. LD/ST
프리셋 "머신 V01" 에서
1) 20번지와 21번지 값을 더해서 20번지에 저장하기
2) 1에서 10까지 더하는 프로그램,  Sum(1..10) 작성하기
3) Sum(1..100)이 가능한지 생각해보기

2. Loop & Relocation
프리셋 "머신 V02" 에서
1) 절대값 차이를 구하는 프로그램 실행하면서 관찰해보기 (싱글 스텝)

501

211

501

212

411

513

609

111

412

502

500

000

000    
2) 이 프로그램을 20번지에 넣어놓고 실행하면서 관찰해보기
3) 20번지로 옮긴(relocation) 프로그램이 동작하도록 수정하기
4) 03번지로 옮기는 경우에도 동작하도록 수정하기
5) Loop을 이용하여 Sum(1..10) 작성하기
6) N값을 입력받아 Sum(1..N)을 계산하기 (1은 입력 받지 않는다.)

3. MyLMC
1) 프리셋 "머신 V02"와 동일한 머신을 만들어보기 
- 머신 V02의 설정을 그대로 활용
- Register Register Transfer Form으로 flow part를 정의
2) MyLMC에서 절대값 차이를 구하는 프로그램을 실행하고 <기록저장>을 이용하여 화일로 저장하였다가 <기록보기> 기능으로 재시연 해보기
3) Sum(1..N) 프로그램을 완성하여 MyLMC에서 실행한 <기록저장> 화일을 작성하여 제출[숙제]

4. TableSum
프리셋 "머신 V03"을 기반으로
1) 다음 문장을 기계어로 번역해서 실행해보시오
    int x;   // 변수 x는 20번지에 배치
    x = 10;   // 10으로 초기화 하는 것은 실행 시작 전에 이루어짐
    x = x - 1;  // 상수 1은 21번지에 배치

1') 메모리 60번지에 다음 20개의 값을 넣으시오.
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 

2) TableSum: Direct absolute addressing mode를 기계어로 수동번역하여 실행하시오.

ORG 0

ORG 90

상수

0

LDA 90

90

ADDA 60

1

STA 07

code = 'ADDA 60'

91

BOX 0

2

LDA 91

92

BOX 19

3

STA 99

sum=0

93

BOX 1

4

LDA 92

5

STA 98

count=19

ORG 98

변수

6

LDA 99

98

RESBOX 1

int i

7

NOP

99

RESBOX 1

int sum

8

STA 99

sum=sum+v

9

LDA 07

10

ADDA 93

11

STA 07

code = ADDA v+1

12

LDA 98

13

SUBA 93

14

STA 98

count = count - 1

15

SKN

16

JMP 06

loop

17

LDA 99

printf("%d",sum)

18

OUT

COB

// 0 번지
190
207
191
299
192
298
199
000
299
107
393
207
198
493
298
513
606
199
502
500

// 90번지 
360
000
019 
001 

3) TableSum: Indirect addressing mode를 기계어로 수동번역하여 실행하시오.

ORG 0

ORG 90

상수

0

LDA 90

p = &table

90

BOX 60

1

STA 97

91

BOX 0

2

LDA 91

sum = 0

92

BOX 19

3

STA 99

93

BOX 1

4

LDA 92

count = 19

5

STA 98

ORG 97

변수

6

LDA 99

sum = sum + *p

97

RESBOX 1

7

ADDA *97

98

RESBOX 1

8

STA 99

99

RESBOX 1

9

LDA 97

p = p + 1

10

ADDA 93

11

STA 97

12

LDA 98

count = count -1

13

SUBA 93

14

STA 98

15

SKN

16

JMP 06

loop

17

LDA 99

printf("%d",sum)

18

OUT

COB

// 0번지
190
297
191
299
192
298
199
797
299
197
393
297
198
493
298
513
606
199
502
500

//90 번지
060
000
019
001


4) TableSum: Indexed addressing mode를 기계어로 수동번역하여 실행하시오.

ORG 0

register int sum;

0

LDA 91

i = 19

1

SWAPAX

2

ADDA @60

sum = sum + table[i]

3

SWAPAX

i = i - 1

4

DECA

5

SWAPAX

6

SKN

7

JMP 02

loop

8

OUT

printf("%d",sum)

COB

ORG 90

상수

90

BOX 0

91

BOX 19


5) TableSum: Indirect addressing mode에서 상수 0,1을 immediate addressing mode를 사용하여 코드로 삽입하시오.

5. Function Call

1) Call3의 실행 기록을 보고 에러가 발생하는 상황을 설명하시오.
2) Rec1의 실행 기록을 보고 에러가 발생하는 상황을 설명하시오.

6. Activation Record
1) 다음 프로그램을 LMC assembly language로 핸드컴파일 한 후 실행하시오.

main() {

   int n, v1, v2;

   v1=asm(IN);

   v2=asm(IN);

   n=sub_two(v1,v2);

   asm(OUT,n);

}


int sub_two(int a, int b) {

   int tmp;

   int result;

   tmp = -b;

   result = a + tmp;

   return result;

}


아래 프로그램 중 int sub_two() 부분을 완성하면 된다. 
// Sub_two, V07
ORG0
RUNTIMELDABOTTOM// SP <-- BOTTOM
SWAPASP
LDA#0// LD B #0
SWAPAB
SWAPASP// room for return value
DECA// of MAIN
SWAPASP
SETRTN// CALL MAIN
SWAPAR
ADDA#4
SWAPAR
PUSHR
JMPMAIN
COB
MAINSWAPAB// PUSH B
PUSHA
MOVBSP// MOV B SP
SWAPASP// room for local variable
SUBA#3// int n,v1,v2;
SWAPASP
// PUSHALL// save visible registers
SWAPASP// room for return value
DECA// of F_SUB_TWO
SWAPASP
IN
STA%-2// v1=
IN
STA%-1// v2=
LDA%-1
PUSHA// pass parameter, (v2)
LDA%-2
PUSHA// pass parameter, (v1)
SETRTN// CALL F_SUB_TWO
SWAPAR
ADDA#4
SWAPAR
PUSHR
JMPF_SUB_TWO
RTN1SWAPASP// remove used arguments
ADDA#2// 2개(a,b)
SWAPASP
POPA// get return value
STA%-3// n=
LDA%-3// asm(OUT,n)
OUT
// POPALL// restore visible registers
MOVSPB// MOV SP B
POPA// POP B
SWAPAB
POPR// RETURN
JMP*R
F_SUB_TWO
. . .
ORG99
BOTTOMBOXBOTTOM


7. 어셈블러 연습(V07 기준)
1) 라벨
- 다음 프로그램을 어셈블해서 결과를 보시오.
- 다음 두개 프로그램 중 프로그래밍하기 편한 것은? 이유는?
- 아래 프로그램에서 DATA와 LOOP 심볼의 의미는 무엇인가?
      
// Prog1: not use label
ORG 8
LDA 25
ORG 10
JMP 8
ORG 25
BOX 123
// Prog2: use label
ORG 8
LOOP LDA DATA
ORG 10
JMP LOOP
ORG 25
DATA BOX 123


2) Immediate addressing(#) vs Literal(=)
- 상수를 오퍼랜드에 직접 표현하는 방법
- 다음 경우의 차이를 관찰하고 설명하시오.
- "// 잘못된 사용"은 어셈블러가 에러처리는 안하지만 범위를 벗어나는 경우이므로 주의해야 함

LDA #1
LDA =100
LDA =1
LDA =-1
LDA #-1 // 잘못된 사용
LDA #100 // 잘못된 사용
LDA =1234 // 잘못된 사용


3) 스택의 정의: 아래 프로그램들은 목적이 같다. 차이점을 설명하시오.
- $는 현재의 위치(location, 주소)를 의미한다.
- EQU는 왼쪽 심볼의 값이 오른 쪽 값을 갖도록 한다. 십몰 값을 정의만 할 뿐 오브젝트 코드를 생성하지는 않는다.

// Stack 1
ORG 0
LDA BOTTOM // SP <-- BOTTOM
SWAPASP
ORG 50
RESBOX 40
BOTTOM BOX BOTTOM
// Stack 2
ORG 0
LDA BOTTOM // SP <-- BOTTOM
SWAPASP
ORG 50
RESBOX 40
BOTTOM BOX $
// Stack 3
ORG 0
LDA BOTTOM // SP <-- BOTTOM
SWAPASP
ORG 50
RESBOX 40
BOTTOM EQU $

4) 다음 명령어를 싱글스텝으로 실행하면서 스택과 레지스터 A의 변화를 관찰하시오.
// 스택 관찰(V07)
ORG 50
RESBOX 40
BOTTOM BOX $
ORG 0
LDA BOTTOM // SP <-- BOTTOM
SWAPASP
LDA #1
PUSHA
LDA #2
PUSHA
LDA #3
PUSHA
PUSHALL
LDA #4
OUT
POPALL
OUT
POPA
OUT
POPA
OUT
POPA
OUT
COB

5) 다음 두그룹 명령어의 차이를 비교 설명해 보시오.
- 그룹 1: LDA, STA, ADDA, SUBA, IN, OUT, JMP, SKZ, ...
- 그룹 2: ORG, EQU, BOX, RESBOX

6) 아래 3개 명령어의 차이를 설명하시오.
- 각 명령어를 싱글스텝으로 실행해서 싸이클의 변화를 관찰
INCA
ADDA #1
ADDA =1

5) Sum(1..n) 프로그램을 어셈블리 언어로 작성하고 어셈블 도구를 활용하여 어셈블리 리스트를 만드시오.


하위 페이지 (1): 머신별 코드 배정
ċ
Call1,V05,R.lmp
(40k)
황선태,
2018. 9. 11. 오후 10:45
ċ
Call1,V05,R.lst.rtf
(2k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call1,V05,R.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call2,V05,R,two.lmp
(69k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call2,V05,R,two.lst.rtf
(3k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call2,V05,R,two.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call3,V05,R,Call in Sub,error.lmp
(69k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call3,V05,R,Call in Sub,error.lst.rtf
(3k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call3,V05,R,Call in Sub,error.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call4,V05,Record,A return.lmp
(84k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call4,V05,Record,A return.lst.rtf
(4k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call4,V05,Record,A return.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:46
ċ
Call5,V05,Record,RVAL.lmp
(84k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call5,V05,Record,RVAL.lst.rtf
(4k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call5,V05,Record,RVAL.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call6,V06,Base addressing.lmp
(99k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call6,V06,Base addressing.lst.rtf
(6k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call6,V06,Base addressing.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call7,V06,Base addressing,parameter pass.lmp
(99k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call7,V06,Base addressing,parameter pass.lst.rtf
(6k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Call7,V06,Base addressing,parameter pass.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 10:47
ċ
Rec1,V06,Recursion,Error.lmp
(215k)
황선태,
2018. 9. 11. 오후 11:46
ċ
Rec1,V06,Recursion,Error.lst.rtf
(3k)
황선태,
2018. 9. 11. 오후 11:47
ċ
Rec1,V06,Recursion,Error.obj.rtf
(1k)
황선태,
2018. 9. 11. 오후 11:47
ċ
Rec2,V07,Stack,AR.lmp
(111k)
황선태,
2018. 9. 16. 오후 10:35
ċ
Rec2,V07,Stack,AR.lst.rtf
(5k)
황선태,
2018. 9. 16. 오후 10:35
ċ
Rec2,V07,Stack,AR.obj.rtf
(1k)
황선태,
2018. 9. 16. 오후 10:35
ċ
ST1,V06,Stack emul.lmp
(77k)
황선태,
2018. 9. 16. 오후 10:36
ċ
ST1,V06,Stack emul.lst.rtf
(2k)
황선태,
2018. 9. 16. 오후 10:36
ċ
ST1,V06,Stack emul.obj.rtf
(1k)
황선태,
2018. 9. 16. 오후 10:36
Comments