{"id":22443553,"url":"https://github.com/chokoty/system-programming-2022-sic-xe-assembler","last_synced_at":"2025-03-27T10:23:46.961Z","repository":{"id":74517362,"uuid":"481625321","full_name":"Chokoty/System-Programming-2022-SIC-XE-assembler","owner":"Chokoty","description":"Ajou Univ. SystemProgramming - SIC/XE assembly code practice","archived":false,"fork":false,"pushed_at":"2022-05-23T05:19:50.000Z","size":22,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T15:12:59.255Z","etag":null,"topics":["ajou","assember","linker","loader","sic-","sic-xe","sic-xe-machines"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Chokoty.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-04-14T13:58:32.000Z","updated_at":"2024-10-01T09:23:22.000Z","dependencies_parsed_at":"2023-03-20T22:05:04.473Z","dependency_job_id":null,"html_url":"https://github.com/Chokoty/System-Programming-2022-SIC-XE-assembler","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chokoty%2FSystem-Programming-2022-SIC-XE-assembler","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chokoty%2FSystem-Programming-2022-SIC-XE-assembler/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chokoty%2FSystem-Programming-2022-SIC-XE-assembler/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Chokoty%2FSystem-Programming-2022-SIC-XE-assembler/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Chokoty","download_url":"https://codeload.github.com/Chokoty/System-Programming-2022-SIC-XE-assembler/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245824234,"owners_count":20678339,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ajou","assember","linker","loader","sic-","sic-xe","sic-xe-machines"],"created_at":"2024-12-06T02:29:16.631Z","updated_at":"2025-03-27T10:23:46.940Z","avatar_url":"https://github.com/Chokoty.png","language":"Assembly","funding_links":[],"categories":[],"sub_categories":[],"readme":"# System-Programming-2022-SIC/XE-assembler\nAjou Univ. System Programming (SCE214) - SIC/XE Machine Practice\n\n# 시스템 프로그래밍 2022\n- Notion 정리글 \u003e\n# 기본적인 뼈대 코드들을 올림\n- 교재 코드\n- 기본 구조\n- 기본콘솔 입출력\n- 스택\n- 2차원 배열\n- ...\n\n# 과제 코드는 올리지 않음\n\n# 실습\n\n## 이용 툴: SicTools\n\n- 설치, 사용설명: [http://jurem.github.io/SicTools/](http://jurem.github.io/SicTools/)\n- 환경: vmware 우분투 20.04 / WSL2 (win11이라면 wlsg로 사용 가능!)\n- 리눅스 기준 세팅:\n    \n    - git 설치하기 `**sudo apt-get install git**`\n    - vim 설치하기 `**sudo apt-get install vim**`\n    - java 설치하기 `**sudo apt-get install openjdk-8-jdk**`\n    \n- sictool시뮬 실행: `**java -jar out/make/sictools.jar**`\n\n## assembler directive\n\n- START : 프로그램 이름, 시작주소\n- END : 원시프로그램(source program)의 끝, 선택적으로 최초 실행할 명령어\n- BYTE : 상수생성, 문자 or 16진수\n- WORD : 1워드 정수 상수 생성 **⇒ 값 할당 되어있다**\n- RESB : 지시된 바이트 수 만큼 예약 **⇒ 값이 비어있다 0**\n- RESW : 지시된 워드 수 만큼 예약\n\n## 기본적인 asm 작성법(작성중)\n- \n- \n## Data Movement\n\n- SIC는 `ALPHA RESW 1` -\u003e 1byte 할당해서 ALPHA 변수 생성하는 식으로 상수 저장\n    \n- SIC/XE는 #(immediate mode)를 붙이면 바로 값을 상수로 사용가능. 따라서 굳이 값을 변수에 저장할 필요 X (메모리를 거치지 않으므로 속도 증가)\n\n- ex1.asm\n    \n    ```\n              LDA \t  FIVE  \t.LOAD CONSTANT 5 INTO REGISTER A\n              STA \t  ALPHA \t.STORE IN ALPHA\n              LDCH  \tCHARZ \t.LOAD CHARACTER 'Z' INTO REGISTER A\n              STCH  \tC1  \t  .STORE IN CHARACTER VARIABLE C1\n      \n      ALPHA \tRESW  \t1 \t    .ONE-WORD VARIABLE\n      FIVE \t  WORD \t  5 \t    .ONE-WORD CONSTANT\n      CHARZ \tBYTE  \tC'Z'  \t.ONE-BYTE CONSTANT\n      C1  \t  RESB  \t1 \t    .ONE-BYTE VARIABLE\n    ```\n    \n    - **A : load 5 ⇒ store 5 ⇒ load ‘Z’ ⇒ store ‘Z’**\n        \n        ALPHA : 1  → 5 store\n        \n        FIVE : 5  → 5 load\n        \n        CHARZ : ‘Z’ → ‘Z’ load\n        \n        C1 : 1 → ‘Z’ store\n        \n- ex2.asm\n    ```\n              LDA \t  #5  \t  .LOAD IMMEDIATE VALUE 5 INTO REGISTER A\n              STA \t  ALPHA \t.STORE IN ALPHA\n              LDCH  \t#90 \t  .LOAD ASCII CODE FOR 'Z' INTO REGISTER A\n              STCH  \tC1      .STORE IN CHARACTER VARIABLE C1\n\n    ALPHA \t  RESW  \t1 \t    .ONE-WORD VARIABLE\n    C1  \t    RESB  \t1 \t    .ONE-BYTE VARIABLE\n    ```\n    - 5, ‘Z’를 변수에 넣지 않고 바로 이용 ⇒ # : 직접\n\n\n## Arithmetic\n- ex3.asm\n    ```\n            LDA     ALPHA\n            ADD     INCR\n            SUB     ONE\n            STA     BETA\n            LDA     GAMMA\n            ADD     INCR\n            SUB     ONE\n            STA     DELTA\n\n    ONE     WORD    1        \n    ALPHA   WORD    7        .WORD: 값을 할당해서 들어있다 7\n    BETA    RESW    1        .RESW: 초기화만, 값이 비어있다 0\n    GAMMA   WORD    3\n    DELTA   RESW    1\n    INCR    RESW    1\n    ```\n\n    ```c\n    int one = 1\n    int alpha = 7\n    int beta = 0\n    int gamma = 3\n    int delta = 0\n    int incr = 0\n\n    beta = 7+0-1 = 6\n    gamma = 3+0-1 = 2\n    ```\n- ex4.asm\n    ```\n    LDS     INCR    .S에 load하기, 계속 씀\n            LDA     ALPHA\n            ADDR    S, A    .A = S + A\n            SUB     #1      .# 직접 \n            STA     BETA\n            LDA     GAMMA\n            ADDR     S, A\n            SUB     #4      .4를 뺀다\n            STA     DELTA\n\n    ONE     WORD    1\n    ALPHA   WORD    7\n    BETA    RESW    1\n    GAMMA   WORD    3\n    DELTA   RESW    1\n    INCR    WORD    4       .INCR에 4로 초기화하기\n    ```\n\n## Addressing\n\n- #A : Immediate addressing, n=0, i=1\n- @A : Indirected addressing, n=1, i=0 \n⇒ **A에 저장된 값을 주소로 가지는 곳! A는 포인터, 가리키는 곳에 값을 저장 A에 저장이 아님**\n- C언어 어셈블러 비교\n    \n    ```c\n    int var = 10;\n    int *addr = \u0026var;\n    *addr = 20;\n    ```\n    \n    ```\n              LDA \t  #10\n              STA \t  VAR\n              LDA \t  #VAR\n              STA \t  ADDR\n              LDA \t  #20\n              STA \t  @ADDR\n      \n      VAR     RESW    1\n      ADDR    RESW    1\n    ```\n    \n\n## Flow Control - Jump, Comp\n- **반복문**\n    \n    SIC에선 TIX ELEVEN -\u003e X값을 1 증가시키고 ELEVEN 변수의 값과 비교해서 결과를 SW 레지스터에 저장\n    \n    SIC/XE에선 T레지스터를 이용해서 반복(레지스터 개수의 증가)\n    \n    SIC에선 string을 저장하고자 할 때 변수 2개 필요\n    \n- COMP, TIX\n- X 레지스터\n- J\n\n```\n  LDX     ZERO\n  MOVECH  LDCH    STR1, X\n          STCH    STR2, X\n          TIX     ELEVEN\n          JLT     MOVECH\n          JEQ     EQUAL\n\n  EQUAL   TIX     ELEVEN\n          JGT     FIN\n\n  FIN     TIX     ELEVEN\n\n  STR1    BYTE    C'TEST STRING'\n  STR2    RESB    11\n  ZERO    WORD    0\n  ELEVEN  WORD    11\n```\n\n## I/O\n\n- **stdin(0) , stdout(1) 장치 연결. ⇒ 입력, 출력 가능**\n    - input, output 한번에 1byte씩만 전송. ⇒ 여러 바이트는 반복으로 처리해야함.\n    - A 레지스터 마지막 1btye 사용.\n    - 2^8개 디바이스 지원\n- **TD INDEV \u003c : 준비, = :준비x**\n- **RD INDEV**\n- **WD INDEV**\n- 콘솔에 A입력\n\n```\n  INLOOP  TD      INDEV     .TEST 입력장치\n          JEQ     INLOOP    .LOOP 장치 준비될 때 까지\n          RD      INDEV     .READ 입력장치에서 A 레지스터로 1 바이트  \n          STCH    DATA      .STORE 읽은 거 바이트\n\n  OUTLP   TD      OUTDEV    .TEST 출력장치\n          JEQ     OUTLP     .LOOP 장치 준비될 때 까지\n          LDCH    DATA      .LOAD A 레지스터로 \n          WD      OUTDEV    .WRITE 출력장치로 1 바이트 \n\n  INDEV   BYTE    0         .INPUT DEVICE NUMBER\n  OUTDEV  BYTE    1         .OUTPUT DEVICE NUMBER\n  DATA    RESB    1         .ONE-BYTE VARIABLE\n```\n\n## SubRoutine\n\n- **JSUB ALPHA**\n    - L 레지스터에 현재 pc값을 저장\n- **RSUB**\n    - JEQ랑 비슷, 기능은 거의 같은데 하나의 루틴으로 의미있음. **무한루프 가능**\n\n```\n          JSUB    READ        .CALL READ SUBROUTINE\n\n                              .SUBROUTINE 100바이트 RECORD 읽기\n  READ    LDX     ZERO        .INITIALIZE INDEX REGISTER을 0으로\n  RLOOP   TD      INDEV       .TEST 입력장치\n          JEQ     RLOOP       .LOOP IF DEVICE IS BUSY\n          RD      INDEV       .READ A 레지스터로 1바이트\n          STCH    RECORD, X   .STORE RECORD로 \n          TIX     K100        .ADD 1 TO INDEX REGISTER AND COMPARE NEW VALUE TO 100\n          JLT     RLOOP       .LOOP INDEX VALUE가 100보다 작으면\n          RSUB\n\n  INDEV   BYTE    0           .INPUT DEVICE NUMBER\n  RECORD  RESB    100         .100BYTE BUFFER FOR INPUT RECORD\n\n  ZERO    WORD    0\n  K100    WORD    100\n```\n\n```\n          JSUB    READ        .CALL READ SUBROUTINE\n\n                              .SUBROUTINE 100바이트 RECORD 읽기\n  READ    LDX     #0          .INITIALIZE INDEX REGISTER을 0으로\n          LDT     #100        .INITIALIZE T 레지스터 100으로\n  RLOOP   TD      INDEV       .TEST 입력장치\n          JEQ     RLOOP       .LOOP IF DEVICE IS BUSY\n          RD      INDEV       .READ A 레지스터로 1바이트\n          STCH    RECORD, X   .STORE RECORD로 \n          TIXR    T           .ADD 1 TO INDEX REGISTER AND COMPARE NEW VALUE TO 100\n          JLT     RLOOP       .LOOP INDEX VALUE가 100보다 작으면\n          RSUB\n\n  INDEV   BYTE    0           .INPUT DEVICE NUMBER\n  RECORD  RESB    100         .100BYTE BUFFER FOR INPUT RECORD\n```\n\n## STACK\n- JSUB 현재 지점 저장해놓고 바로 이동!\n- @TOP 은 포인터!\n- PUSH, POP은 TOP을 +3 -3 주소값을 바꿔준다.\n```\n  MAIN      START   1000\n  FIRST     JSUB    STKINIT\n\n            LDA     #1        .PUSH START\n            STA     @TOP      .TOP이 가리키는 곳에 저장, TOP에 저장이 아님\n            JSUB    PUSH\n            LDA     #2\n            STA     @TOP\n            JSUB    PUSH\n            LDA     #3\n            STA     @TOP\n            JSUB    PUSH\n\n            JSUB    POP       .POP START\n            LDA     @TOP      .포인터 값으로 넣는다\n            STA     OUT1\n            JSUB    POP\n            LDA     @TOP\n            STA     OUT2\n            JSUB    POP\n            LDA     @TOP\n            STA     OUT3\n\n  A         J       A         .여기서 멈춤\n\n  STKINIT   LDA     #STACK    .STACK INIT #STACK이 주소를 가져오는거?\n            STA     TOP\n            RSUB\n\n  PUSH      LDA     TOP\n            ADD     #3\n            STA     TOP\n            RSUB\n\n  POP       LDA     TOP\n            SUB     #3\n            STA     TOP\n            RSUB\n\n  OUT1      RESW    1\n  OUT2      RESW    1\n  OUT3      RESW    1\n  TOP       RESW    1\n  STACK     RESW    10000\n```\n\n## 2-demensional Array (작성중)\n\n- 1차원으로 2차원 표현하기\n- arr[2][1]  = arr + 2 * (sizeof element * sizeof Cols) + 1 * (sizeof element)\n- 1개 크기 3word\n- ex)\n\n## Recursive Subroutine : Factorial (작성중)\n- 피보나치 구현하기\n\n# SicTools Linker (작성중)\n- +jsub 다른곳에서 가져온다. \n```bash\n# assembler 실행하기 -\u003e obj파일 만들기\njava -cp out/make/sictools.jar **sic.Asm** tests/linker/stack/main.asm \njava -cp out/make/sictools.jar **sic.Asm** tests/linker/stack/stack.asm\n\n# linker 실행하기\njava -cp out/make/sictools.jar **sic.Link** -o **out.obj** tests/linker/stack/main.obj tests/linker/stack/stack.obj\n```\n- main.asm\n```\n  main START 0\n    EXTREF stinit\n    EXTREF push\n    EXTREF pop\n    \n  .init the stack at #256\n    LDA #256\n    +JSUB stinit\n\n  .push 0x11 0x22 0x33 0x44 to stack\n    LDA #17\n    +JSUB push\n    LDA #34\n    +JSUB push\n    LDA #51\n    +JSUB push\n    LDA #68\n    +JSUB push\n    \n  .pop them back and store them to memory again\n    +JSUB pop\n    STA res1\n    +JSUB pop\n    STA res2\n    +JSUB pop\n    STA res3\n    +JSUB pop\n    STA res4\n  halt J halt\n    \n  res1 WORD 170\n  res2 WORD 170\n  res3 WORD 170\n  res4 WORD 170\n```\n- stack.asm\n```\n  stack START 0\n    EXTDEF stinit\n    EXTDEF push\n    EXTDEF pop\n    \n  . starts the stack at the address in A\n  stinit STA stackptr\n    RSUB\n    \n  . pushes the content from A to stack\n  push STA @stackptr\n    LDA stackptr\n    ADD #3\n    STA stackptr\n    RSUB\n    \n  .pops the top element to A\n  pop LDA stackptr\n    SUB #3\n    STA stackptr\n    LDA @stackptr\n    RSUB\n    \n  stackptr RESW 1\n    END stack\n```\n- main.obj\n  - 링크하기전에 문자열로 되어있다. +JSUB라서 주소를 몰?루\n  ```\n    Hmain  0000000000**4E**\n    Rpop   push  stinit\n    T0000001D0101004B1000000100114B1000000100224B1000000100334B10000001\n    T00001D020044\n    T00001F1D4B1000004B1000000F20184B1000000F20144B1000000F20104B100000\n    T00003C120F200C3F2FFD0000AA0000AA0000AA0000AA\n    **M00000405+stinit\n    M00000B05+push\n    M00001205+push\n    M00001905+push\n    M00002005+push\n    M00002405+pop\n    M00002B05+pop\n    M00003205+pop\n    M00003905+pop**\n    E000000\n  ```\n- stack.obj\n  ```\n    Hstack 000000000027\n    Dpop   000015push  000006stinit000000\n    T0000001D0F20214F00000E201B0320181900030F20124F000003200C1D00030F20\n    T00001D0106\n    T00001E060220034F0000\n    E000000\n  ```\n- out.obj\n  - 이제 없어졌다.\n   ```\n    Hout   000000000075\n    T0000001D0101004B1000'4E'0100114B1000'54'0100224B1000'54'0100334B1000'54'01\n    T00001D020044\n    T00001F1D4B1000544B1000'63'0F20184B1000'63'0F20144B1000'63'0F20104B1000'63'\n    T00003C120F200C3F2FFD0000AA0000AA0000AA0000AA\n    T0000'4E'1D0F20214F00000E201B0320181900030F20124F000003200C1D00030F20\n    T00006B0106\n    T0000'6C'060220034F0000\n    M00000405\n    M00000B05\n    M00001205\n    M00001905\n    M00002005\n    M00002405\n    M00002B05\n    M00003205\n    M00003905\n    E000000\n  ```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchokoty%2Fsystem-programming-2022-sic-xe-assembler","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchokoty%2Fsystem-programming-2022-sic-xe-assembler","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchokoty%2Fsystem-programming-2022-sic-xe-assembler/lists"}