[ํผ์ ๊ณต๋ถํ๋ ์ปดํจํฐ ๊ตฌ์กฐ+์ด์์ฒด์ ]03. ์์ค์ฝ๋์ ๋ช ๋ น์ด ๋ณํ
๊ณ ๊ธ ์ธ์ด์ ์ ๊ธ ์ธ์ด
์ปดํจํฐ๋ ๊ฐ๋ฐ์๊ฐ ์์ฑํ ์์ค ์ฝ๋๋ฅผ ์ดํดํ์ง ๋ชปํ๋ค. ๊ฐ๋ฐ์๊ฐ ์ฌ์ฉํ๋ ์ธ์ด๋ '๊ณ ๊ธ ์ธ์ด'์ด๊ณ , ๊ณ ๊ธ ์ธ์ด๋ฅผ ์ปดํจํฐ๊ฐ ์คํํ ๋์๋ '์ ๊ธ ์ธ์ด'๋ก ๋ณํ๋์ด ์คํ๋๋ค.
- ๊ณ ๊ธ ์ธ์ด: ๊ฐ๋ฐ์๊ฐ ์ฝ๊ณ ์ฐ๊ธฐ ํธํ๊ฒ ๋ง๋ค์ด์ง ์ธ์ด
- C/C++, Java, Python ๋ฑ
- ์ ๊ธ ์ธ์ด(=๋ช
๋ น์ด): ์ปดํจํฐ๊ฐ ์ดํดํ๊ณ ์คํํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ์ธ์ด
- ๊ธฐ๊ณ์ด: 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ช ๋ น์ด๋ก ๊ตฌ์ฑ๋ ์ ๊ธ ์ธ์ด(2์ง์ ํน์ 16์ง์๋ก ํํ)
- ์ด์ ๋ธ๋ฆฌ์ด: 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๊ธฐ๊ณ์ด๋ฅผ ์ฝ๊ธฐ ํธํ ํํ๋ก ๋ฒ์ญํ ์ ๊ธ ์ธ์ด
| ๊ธฐ๊ณ์ด | ์ด์ ๋ธ๋ฆฌ์ด |
| 0101 0101 | push rbp |
| 0101 1101 | pop rbp |
| 1100 0011 | ret |
๊ณ ๊ธ์ธ์ด๊ฐ ์ ๊ธ์ธ์ด๋ก ๋ณํ๋๋ ๋ฐฉ์
1) ์ปดํ์ผ ๋ฐฉ์
- ์ปดํ์ผ ์ธ์ด(์ปดํ์ผ): ๊ณ ๊ธ ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋๋ก, ์ ์ฒด๋ฅผ ํ ๋ฒ์ ์คํํ๋ค.
- ์์ค ์ฝ๋ ์ปดํ์ผ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์์ค ์ฝ๋ ์ ์ฒด๊ฐ ์คํ๋์ง ์์

- ์ปดํ์ผ ๊ณผ์ : ์ปดํ์ผ ์ธ์ด๋ก ์์ฑ๋ ์์ค ์ฝ๋๊ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์ ๊ธ ์ธ์ด๋ก ๋ณํ๋๋ ๊ณผ์
- ๋ชฉ์ ์ฝ๋(object code): ์ปดํ์ผ ๊ฒฐ๊ณผ๋ก ์์ฑ๋ ์ ๊ธ ์ธ์ด
2) ์ธํฐํ๋ฆฌํธ ๋ฐฉ์
- ์ธํฐํ๋ฆฌํฐ ์ธ์ด: ์ธํฐํ๋ฆฌํฐ์ ์ํด ํ ์ค ์ฉ ์คํ๋๋ฉฐ, ์์ค ์ฝ๋ ์ ์ฒด๊ฐ ์ ๊ธ ์ธ์ด๋ก ๋ณํ๋๊ธฐ๊น์ง ๊ธฐ๋ค๋ฆด ํ์๊ฐ ์์
- ์์ค ์ฝ๋ ์ธํฐํ๋ฆฌํธ ์ค ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด ์ค๋ฅ ๋ฐ์ ์ ๊น์ง์ ์ฝ๋๋ ์คํ๋จ
๋ช ๋ น์ด์ ๊ตฌ์กฐ
๋ช ๋ น์ด = ๋ฌด์์ ๋์์ผ๋ก, ๋ฌด์์ ์ํํด๋ผ = ์ฐ์ฐ ์ฝ๋(์ํํ ์ฐ์ฐ) + ์คํผ๋๋(์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ or ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น)
| ์ํํ ์ฐ์ฐ | ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ ํน์ ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น | |
| ๋ํด๋ผ | 100๊ณผ | 120์ |
| ๋นผ๋ผ | ๋ฉ๋ชจ๋ฆฌ 32๋ฒ์ง ์์ ๊ฐ๊ณผ | ๋ฉ๋ชจ๋ฆฌ 33๋ฒ์ง ์์ ๊ฐ์ |
| ์ ์ฅํด๋ผ | 10์ | ๋ฉ๋ชจ๋ฆฌ 128๋ฒ์ง์ |
์คํผ๋๋
์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ or ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น
- ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ๋ ์์ฃผ ์ ์ฅํจ. ๋ฐ๋ผ์ ์คํผ๋๋ ํ๋๋ฅผ ์ฃผ์ ํ๋๋ผ๊ณ ๋ถ๋ฆ
- ์คํผ๋๋ ๊ฐ์๋ ์ฌ๋ฌ ๊ฐ๊ฐ ๋ ์๋ ์๊ณ , ํ ๊ฐ๋ ์์ ์๋ ์์

์ฐ์ฐ ์ฝ๋
์ํํ ์ฐ์ฐ
- ์ฐ์ฐ ์ฝ๋์ ์ข ๋ฅ์ ์๊น์๋ CPU ๋ง๋ค ๋ค๋ฆ
- ๊ณตํต์ ์ธ ์ฐ์ฐ ์ฝ๋ ์ข
๋ฅ์๋ ํฌ๊ฒ 4๊ฐ์ง ์กด์ฌ
- ๋ฐ์ดํฐ ์ ์ก: MOVE(๋ฐ์ดํฐ๋ฅผ ์ฎ๊ฒจ๋ผ), STORE(๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด๋ผ), LOAD/FETCH(๋ฉ๋ชจ๋ฆฌ์์ CPU๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ผ), PUSH(์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ผ), POP(์คํ์ ์ต์๋จ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ผ)
- ์ฐ์ /๋ ผ๋ฆฌ ์ฐ์ฐ: ADD/SUBTRACT/MULTIPLY/DIVIDE(๋ง์ /๋บ์ /๊ณฑ์ /๋๋์ ์ ์ํํ๋ผ), INCREMENT/DECREMENT(์คํผ๋๋์ 1์ ๋ํ๋ผ/์คํผ๋๋์ 1์ ๋นผ๋ผ), AND/OR/NOT(AND/OR/NOT ์ฐ์ฐ์ ์ํํ๋ผ), COMPARE(๋ ๊ฐ์ ์ซ์ ๋๋ TRUE/FALSE ๊ฐ์ ๋น๊ตํ๋ผ)
- ์ ์ด ํ๋ฆ ๋ณ๊ฒฝ: JUMP(ํน์ ์ฃผ์๋ก ์คํ ์์๋ฅผ ์ฎ๊ฒจ๋ผ), CONDITIONAL JUMP(์กฐ๊ฑด์ ๋ถํฉํ ๋ ํน์ ์ฃผ์๋ก ์คํ ์์๋ฅผ ์ฎ๊ฒจ๋ผ), HALT(ํ๋ก๊ทธ๋จ์ ์คํ์ ๋ฉ์ถฐ๋ผ), CALL(๋๋์์ฌ ์ฃผ์๋ฅผ ์ ์ฅํ ์ฑ ํน์ ์ฃผ์๋ก ์คํ ์์๋ก ์ฎ๊ฒจ๋ผ), RETURN(CALL์ ํธ์ถํ ๋ ์ ์ฅํ๋ ์ฃผ์๋ก ๋์๊ฐ๋ผ)
- ์ ์ถ๋ ฅ ์ ์ด: READ/INPUT(ํน์ ์ ์ถ๋ ฅ ์ฅ์น๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ผ), WRITE/OUTPUT(ํน์ ์ ์ถ๋ ฅ ์ฅ์น๋ก ๋ฐ์ดํฐ๋ฅผ ์จ๋ผ), START IO(์ ์ถ๋ ฅ ์ฅ์น๋ฅผ ์์ํ๋ผ), TEST IO(์ ์ถ๋ ฅ ์ฅ์น์ ์ํ๋ฅผ ํ์ธํ๋ผ)
๋ช ๋ น์ด ์ฃผ์ ์ง์ ๋ฐฉ์
๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ '๋ช ๋ น์ด ๋ด์์ ํํํ ์ ์๋ ํฌ๊ธฐ๊ฐ ์ ํ'๋๊ธฐ ๋๋ฌธ์ด๋ค.


์คํผ๋๋ ์ข ๋ฅ๊ฐ ๋ง์์ง์๋ก ์คํผ๋๋์ ํํํ ์ ์๋ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ค์ด๋ฆ

๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํํํ ์ ์๋ ๋ฒ์์ ๋ฐ์ดํฐ ํฌ๊ธฐ๊ฐ ์ ํ๋ฐ์ง ์๋๋ก ์คํผ๋๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅํ์ฌ ํํํจ
์ ํจ ์ฃผ์(effective address): ์ฐ์ฐ์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น
๋ช ๋ น์ด ์ฃผ์ ์ง์ ๋ฐฉ์(addressing modes): ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ์์น๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ, ์ฆ ์ ํจ ์ฃผ์๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
๋ค์ํ ๋ช ๋ น์ด ์ฃผ์ ์ง์ ๋ฐฉ์ ์กด์ฌํจ
- ์ฆ์ ์ฃผ์ ์ง์ ๋ฐฉ์(immediate addressing mode): ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์คํผ๋๋ ํ๋์ ์ง์ ๋ช
์
- ๊ฐ์ฅ ๊ฐ๋จํ ํํ์ ์ฃผ์ ์ง์ ๋ฐฉ์
- ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ์ ํฌ๊ธฐ๊ฐ ์์์ง ์ ์์ง๋ง, ๋น ๋ฆ(ํด๋น ์ฃผ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ณผ์ ์ํ X)

- ์ง์ ์ฃผ์ ์ง์ ๋ฐฉ์(direct addressing mode): ์คํผ๋๋ ํ๋์ ์ ํจ ์ฃผ์๋ฅผ ์ง์ ์ ์ผ๋ก ๋ช
์
- ์ ํจ ์ฃผ์๋ฅผ ํํํ ์ ์๋ ํฌ๊ธฐ๊ฐ ์ฐ์ฐ ์ฝ๋๋งํผ ์ค์ด๋ฆ

- ๊ฐ์ ์ฃผ์ ์ง์ ๋ฐฉ์(indirect addressing mode): ์คํผ๋๋ ํ๋์ ์ ํจ ์ฃผ์์ ์ฃผ์๋ฅผ ๋ช
์
- ์์ ์ฃผ์ ์ง์ ๋ฐฉ์๋ค์ ๋นํด ์๋๊ฐ ๋๋ฆผ

- ๋ ์ง์คํฐ ์ฃผ์ ์ง์ ๋ฐฉ์(register addressing mode): ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ ์ง์คํฐ ๋ช
์
- ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ์๋๋ณด๋ค ๋ ์ง์คํฐ์ ์ ๊ทผํ๋ ๊ฒ์ด ๋น ๋ฆ

- ๋ ์ง์คํฐ ๊ฐ์ ์ฃผ์ ์ง์ ๋ฐฉ์(register indirect addressing mode): ์ฐ์ฐ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ
- ๊ทธ ์ฃผ์๋ฅผ ์ ์ฅํ ๋ ์ง์คํฐ๋ฅผ ์คํผ๋๋ ํ๋์ ๋ช ์

C ์ธ์ด์ ์ปดํ์ผ ๊ณผ์
C์ธ์ด ์์ค ์ฝ๋(test.c) → ์ ์ฒ๋ฆฌ๊ธฐ(preprocessor) → ์ปดํ์ผ๋ฌ(compiler) → ์ด์ ๋ธ๋ฌ(assembler) → ๋ง์ปค(linker) → ์คํํ์ผ(test.exe)
1) ์ ์ฒ๋ฆฌ ๊ณผ์ (preprocessing)
- ๋ณธ๊ฒฉ์ ์ผ๋ก ์ปดํ์ผํ๊ธฐ ์ ์ ์ฒ๋ฆฌํ ์์
๋ค
- ์ธ๋ถ์ ์ ์ธ๋ ๋ค์ํ ์์ค ์ฝ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ(ex: #include)
- ํ๋ก๊ทธ๋๋ฐ์ ํธ์๋ฅผ ์ํด ์์ฑ๋ ๋งคํฌ๋ก ๋ณํ(ex: #define)
- ์ปดํ์ผํ ์์ญ ๋ช ์(ex: #if, #ifdef, ...)
2) ์ปดํ์ผ ๊ณผ์ (compiling)
- ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ ๋์ด๋ ์ฌ์ ํ ์์ค ์ฝ๋์ด๊ธฐ ๋๋ฌธ์, ์ ์ฒ๋ฆฌ๊ฐ ์๋ฃ๋ ์์ค ์ฝ๋๋ฅผ ์ ๊ธ ์ธ์ด(์ด์ ๋ธ๋ฆฌ ์ธ์ด)๋ก ๋ณํํ๋ ๊ณผ์
3) ์ด์ ๋ธ๋ฌ ๊ณผ์ (assembling)
- ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๊ธฐ๊ณ์ด๋ก ๋ณํํ๋ ๊ณผ์
- ๋ชฉ์ ์ฝ๋(object code)๋ฅผ ํฌํจํ๋ ๋ชฉ์ ํ์ผ์ด ๋จ
๋ชฉ์ ํ์ผ vs ์คํ ํ์ผ
๋ชฉ์ ํ์ผ๊ณผ ์คํ ํ์ผ์ ๋ ๋ค ๊ธฐ๊ณ์ด๋ก ์ด๋ฃจ์ด์ง ํ์ผ์ด์ง๋ง, ๋ค๋ฅด๋ค!
๋ชฉ์ ํ์ผ์ ๋งํน(linking)์ ๊ฑฐ์น ์ดํ์ ์คํ ํ์ผ์ด ๋๋ค.
4) ๋งํน(linking)
- ํ ํ์ผ์์ ๋ค๋ฅธ ํ์ผ์ ์๋ ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ ์ํฉ์์ ํ์ผ์ ์ฐ๊ฒฐํด์ฃผ๋ ๊ณผ์
์ฆ, ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ชฉ์ ํ์ผ์ ํ๋์ ์คํ ํ์ผ๋ก ์ฐ๊ฒฐ์์ผ์ฃผ๋ ๊ณผ์