System Software

System Programming and Practice(2):jump!!

limwngur 2023. 9. 14. 23:25
728x90

위 문제 풀이 포스팅이다.

다시 어셈블리 명령어를 에디터로 만들어 save하고 목적코드로 변환해줄 것이기에

기존의 SRCFILE,DEV2 를 삭제하자.

 

SRCFILE 생성해서 SIC Assembler를 동작하여 이전에 설명했던 3가지 FILE을 얻었다.

Program Name : SICASM.EXE
Input: SRCFILE (소스 프로그램)
Output: OBJFILE (목적 코드), LISFILE (어셈블리 리스트), INTFILE (중간 파일)
 
1> SIC assembly language 프로그램을 작성한다.
[주의] 파일 이름은 ‘SRCFILE' 이다 (확장자 없음)
[주의] 소문자로만 작성한다 (혹은 대문자로 작성한 뒤 ‘U2L SRCFILE'을 수행한다)
[주의] Tab을 쓰지 않는다. 소스 프로그램의 각 line은 다음의 format에 맞추어야 한다.
Bytes 1-8 Label
9 Blank
10-15 Operation code (or Assembler directive)
16-17 Blank
18-35 Operand
36-66 Comment
2> SICASM.EXE를 실행시킨다. INTFILE, LISFILE, OBJFILE이 생긴다.
3> 문제가 있으면 LISFILE을 본다.

 

 

SIC 시뮬레이터를 실행하였고, SRCFILE에 작성되었던 어셈블리 코드에서 start를 1000addr로 지정해주었기에 1000에 브레이킹 포인트를 건다. 그리고 r(run instruction)을 한다.

1000번지까지 잘 왔다. 이제 본격적으로 내가 작성했던 명령어집합이 한 줄씩 실행된다.

 

 

한번에 실행될 명령어를 1개로 바꾸어준다.

 

pc값이 1000인 상태에서 run을 해주어 1000번지에 저장된 명령어를 실행했을 때, first lda one이 실행되므로, a 레지스터에 1이 담긴 것을 확인할 수 있다.

 

1003번지에서 명령어를 실행(run)을 했더니, pc값에 1006이 아닌 100C값이 들어가있다. 이는 1003addr에 담긴 명령어가 100C로 jump하는 jsub double(double은 100c에 위치한 명령어 이름)명령어이기 때문이다.

 

pc=00100C일 때, 명령어를 실행하여 100c에 위치한 명령어를 실행(mul two:2) > a레지스터에 있는 값과 two에 있는 2가 곱해져 a 레지스터에 할당되어 2가 되었다.

 

pc=00100f 일때, run 하여 100f에 위치한 명령어(comp sixteen)을 실행하였고, a레지스터의 값 2<16. 즉 less than이 cc레지스터에 할당되었다. 한번 더 run하여 return subrutine이 실행되어 jump할때, 미리 리턴 주소를 담아 두었던 1006주소로 return이 되었다.

 

cc레지스터 값이 less than(lt)이므로, 조건부 다시 double(100c)로 jump하게 된다.

 

계속 명령어를 실행하여 jlt 명령어에서 a레지스터 값이 16보다 작으므로, 계속 double로 jump되다가

값이 16이 되는 시점에 jeq 조건에 걸려 result로 이동하게 되어 마지막에는 결국 프로그램이 종료되게 된다.

끝.

 

728x90

'System Software' 카테고리의 다른 글

System Programming and Practice(1):실습환경  (2) 2023.09.14