temp - hochan222/Everything-in-JavaScript GitHub Wiki
libasm
โ About libasm
๐ An assembly (or assembler) language, often abbreviated asm, is a low-level programming language for a computer, or other programmable device, in which there is a very strong (but often not one-to-one) correspondence between the language and the architectureโs machine code instructions. Each assembly language is specific to a particular computer architecture. In contrast, most high-level programming languages are generally portable across multiple architectures but require interpreting or compiling. Assembly language may also be called symbolic machine code.
Environment
Intel vs AT&T APPLY Systemcall
x86_64 macos, intel, .s
nasm ๋ค์ด๋ก๋
brew install nasm
Linux
- nasm -f elf64 file.s -o file.o
Mac
- nasm -f macho64 file.s -o file.o
Assembler
๊ฐ ๊ฐ์ธ์ฉ ์ปดํจํฐ์๋ ์ปดํจํฐ์ ์ฐ์ , ๋ ผ๋ฆฌ ๋ฐ ์ ์ด ํ๋์ ์ ์ดํ๋ โโ๋ง์ดํฌ๋ก ํ๋ก์ธ์๊ฐ ์๋ค. ๊ฐ ํ๋ก์ธ์ ์ ํ๊ตฐ์๋ ํค๋ณด๋์์ ์ ๋ ฅ ๋ฐ๊ธฐ, ํ๋ฉด์ ์ ๋ณด ํ์๋ฑ๊ณผ ๊ฐ์ ๋ค์ํ ์์ ์ ์ํํ๊ธฐ ์ํ ๊ณ ์ ํ ์ง์นจ ์ธํธ๊ฐ ์์ต๋ค. ์ด ๋ช ๋ น์ด ์ธํธ๋ฅผ ๊ธฐ๊ณ์ด ๋ช ๋ น์ด๋ผ๊ณ ํ๋ค. ํ๋ก์ธ์๋ ๋นํธ ์ํ์ค ์ธ 1 ๋๋ 0 ์ธ ๊ธฐ๊ณ์ด ๋ช ๋ น์ด๋ง ์ดํดํ๋ค. ๊ธฐ๊ณ์ด๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ฌ์ฉํ๊ธฐ์๋ ๋๋ฌด ๋ณต์กํ๊ณ ์ดํดํ๊ธฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์๋ณด๋ค ์ดํดํ๊ธฐ ์ฌ์ด ํ์์ผ๋ก ์์ฑํ๊ธฐ์ํ ์ผ๋ จ์ ๋ช ๋ น์ธ ํน์ ํ๋ก์ธ์ ์ ํ๊ตฐ์ ์ํด ์ ์์ค ์ธ์ด๊ฐ ๊ฐ๋ฐ๋์๋๋ฐ, ์ด ์ธ์ด๋ฅผ ์ด์ ๋ธ๋ฌ (์ด์ ๋ธ๋ฆฌ ์ธ์ด)๋ผ๊ณ ํ๋ค.
Assembler๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์
- ํน์ ํ๋ก์ธ์์๋ง ์๋ ๋ ์ง์คํฐ๋ I/O ์ ๋ฐ๋ก ์ ๊ทผํ ์ ์๋ค.
- ์ฝ๋ ํ๋ํ๋์ ๋์์ ๋ชจ๋ ์ ์ดํ๊ณ , ์ฌ๋ฌ๋ถ์ด ์๊ฐํ ๋๋ก ์์ง์ด๊ฒ ํ ์ ์๋ค.
- ํฌ๋ฆฌํฐ์ปฌ ์น์ ๋ฑ์์ ๋ฐ๋๋ฝ๊ณผ ๊ฐ์ ์ผ์ ์ผ๊ธฐํ ์ ์๋ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค ์ฐ๋ ๋๋ค์ ์ฝ๋ ๋์์ ๋งค์ฐ ์ ํํ๊ฒ ์ปจํธ๋กค ํ ์ ์๋ค.
- ์์ ์ ํ๋์จ์ด ์ค์ ์๋ง ์๋ฒฝํ๊ฒ ์ต์ ํ๋ ์ฝ๋๋ฅผ ์ง์ ์ ์ํ ์ ์๋ค. (๋ฒ์ฉ์ ์ธ ํธํ์ ์ํ ๋ถํ์ํ ์ฝ๋๋ฅผ ์์จ ์ ์๋ค.)
- ์ด์ ์ฒด์ , ํ๋ก์ธ์ ๋ฐ BIOS์ ์ํธ ์์ฉํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๊ธฐํ ์ฅ์น์์ ์ด๋ป๊ฒ ํํ๋๋์ง ์ ์ ์๋ค.
- ํ๋ก์ธ์๊ฐ ๋ช ๋ น์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ช ๋ น์ ์คํํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋ค.
- ํ๋ก๊ทธ๋จ์ด ์ธ๋ถ ์ฅ์น์ ์ก์ธ์คํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์๋ค.
Data size
- word: 2-byte data element
- double word: a 4-byte (32-bit) data element
- quadword: an 8-byte (64-bit) data element
- paragraph: 16-byte (128-bit) area
- kilobyte: 1024 bytes
- megabyte: 1,048,576 bytes
word: ์ปดํจํฐ ์ค๊ณ์ ์ ํด์ง๋ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ณธ ๋จ์
์ปดํจํฐ ๊ตฌ์กฐ
ํฐ ๋ ธ์ด๋ง์ ์ปดํจํฐ์ ๊ตฌ์กฐ๋ฅผ CPU(Central Processing Unit)์ ๋ฉ๋ชจ๋ฆฌ(memory)์ ๋๊ฐ์ ์ฃผ์ ๋ถ๋ถ์ผ๋ก ๋๋์ด์ ๊ตฌ์ฑํ๋ค. ๊ฐ๋จํ ๋งํด์ "์ฐ์ฐ"๊ณผ "์ ์ฅ"์ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์๋ค.
๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ค๊ณ ๋ ํ์ง๋ง ์ด๊ฒ๋ง ๊ฐ์ง๊ณ ๋ ์๋ฌด๋ฐ ์๋ฏธ๊ฐ ์๋ค. ๋จ์ง ๋นํธ์ ๋์ด ๋ฟ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ธ๋ชจ ์๋ ์ ๋ณด๋ก ๋ฐ๊พธ๊ธฐ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ์์ ํ๊ณ , ์ฎ๊ธฐ๋ ๋ฑ์ ์ผ์ ํด์ผ๋งํ๋ค. ์ด๋ฌํ ์ผ์ CPU๊ฐ ๋ด๋นํ๊ฒ ๋๋ค.
CPU
CPU๋ ํ๋ฒ์ ์๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ถํฐ ๋ช ๋ น(instruction)์ ์ฝ์ด ๋ค์ด๊ณ ์ด๊ฒ๋ค์ ์คํํ๋ค. ์ด๊ฒ์ fetch-execute cycle ๋ผ๊ณ ํ๋๋ฐ, ์ด ๋ช ๋ น์๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ค์ด ํฌํจ๋์ด ์๋ค.
- Program Counter
- Instruction Decoder
- Data bus
- General-purpose register
- Arithmetic and logic unit
program counter ๋ ์ปดํจํฐ์๊ฒ ๋ค์ ์ํํด์ผ๋ ๋ช ๋ น(instruction)์ ์๋ ค์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. ์ปดํจํฐ์ ์ ์ฅ์์ ํ๋ก๊ทธ๋จ๊ณผ ๋ฐ์ดํฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ๋ฐฉ์์ ์ํด์๋ ์ด๋ ํ ์ฐจ์ด๋ ์๋ค. ํด์์ ์ฐจ์ด๊ฐ ์์ ๋ฟ์ด๋ค. program counter์ ์คํ๋ ๋ค์ ๋ช ๋ น์ด ์ ์ฅ๋์ด ์๋ ๋ฉ๋ชจ๋ฆฌ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ค.
instruction decoder ๋ ๋ํ๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ๊ธฐ๋ฑ ๋ฐ์ดํฐ ์ด๋๊ณผ ๊ฐ์ ์ํํด์ผ๋ ๋ช ๋ น์ ํ์์ ์๋ ค์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉ๋๋ค. ์ปดํจํฐ์ ์ํ์ ๋ช ๋ น๋ค๊ณผ ๋ช ๋ น์ด ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ ์์น์ ๋ชฉ๋ก์ ์ํด์ ์ด๋ฃจ์ด ์ง๋ค.
data bus ๋ ๊ณ์ฐํ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์์น๋ฅผ ๊ฐ์ง๋ค. data bus๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ ์ด์ ๋ CPU์ Memory์ฌ์ด๋ฅผ ์ฐ๊ฒฐํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฒ์ค๋ผ๋๊ฑด ํ๋์ ๊ฐ์ฒด์ ํ์๋ก ํ๋ ์ฌ๋ฌ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐ๊ฒฐํ๋ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค.
์ ํ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ CPU ์ธ๋ถ์ ์์นํ๊ณ ์๋ค. ํ๋ก์ธ์๋ ๋น ๋ฅด๊ฒ ์ ๊ทผ ๊ฐ๋ฅํ ์์ฒด ๋ฉ๋ชจ๋ฆฌ์ธ register ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ๋ ์ง์คํฐ๋ ์ผ๋ฐ๋ชฉ์ (general-purpose) ๋ ์ง์คํฐ์ ํน๋ณ๋ชฉ์ (special-purpose) ๋ ์ง์คํฐ์ ๋๊ฐ์ง ์ข ๋ฅ๋ก ๋๋๋ค. ์ผ๋ฐ ๋ชฉ์ ๋ ์ง์คํฐ๋ ๋ง๊ทธ๋๋ก ๋ํ๊ธฐ, ๋นผ๊ธฐ, ๊ณฑํ๊ธฐ, ๋น๊ต์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ช ๋ น์ ์ํด์ ์ฌ์ฉ๋๋ค. ์ปดํจํฐ๋ ์ ํ๋ ๋ช๊ฐ๋ง์ ์ผ๋ฐ ๋ชฉ์ ๋ ์ง์คํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ๋ฟ์ด๋ฉฐ ๋๋ถ๋ถ์ ์ฃผ(main)๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด์ฉํ๋ค.
CPU๊ฐ ํ์๋ก ํ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์๋ค๋ฉด decoded instruction ์ ๋ฐ๋ผ์ ์์น์ฐ์ฐ(arithmetic)๊ณผ ๋ ผ๋ฆฌ์ฐ์ฐ(logic)์ ์ํํ๋ค. ์ด๊ฒ๋ค์ ์ค์ ์ํ๋๋ ๋ช ๋ น๋ค๋ก์จ ์ฐ์ฐ์ํ ๊ฒฐ๊ณผ๋ data bus๋ฅผ ํตํด์ ์ฃผ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ ์ด๋ ๋ ์ง์คํฐ๋ฆฌ์ ์ ์ฅ๋๋ค.
Memory
์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ ์ ์ฅ์์ญ์ ์ต์๋จ์๋ก ๋๋๊ณ , ์ฌ๊ธฐ์ ์ผ๋ จ์ ์ฐ์๋ ๋ฒํธ๋ฅผ ๋ถ์ฌ์ ๊ด๋ฆฌํ๊ฒ ๋๋ค. ํ๋ก๊ทธ๋จ์ ํ์ฐ์ ์ผ๋ก ๋ฐ์ดํฐ์ ๋ํ ์กฐ์์ ํ์๋ก ํ๋ฉฐ, ์ด๋ฌํ ๋ฐ์ดํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ฌ์ง๊ณ ์ฝํ์ง๊ฒ ๋๋ค. ๋ฐ์ดํฐ๊ฐ ์ด๋์ ๋์ ์ ์ฅ์์ญ์ ํ์๋ก ํ๋์ง์ ๋ํด์ ์๋ ๋ฐ๊ฐ ์ ํ ์์ผ๋ฏ๋ก, ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์ด๋ป๊ฒ ์ ์ฅ๋ ์ง๋ฅผ ๋ช ๋ น(instruction)์ ํตํด์ ์ปดํจํฐ์๊ฒ ์๋ ค์ค์ผ ํ๋ค. ์ด๋ฐ ๋ช ๋ น ์ญ์ ์ ์ฅ์์ญ์ ์ฐ์ฌ์งํ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค์ ์ปดํจํฐ๊ฐ ์ฝ์ด๊ฐ๊ฒ ๋๋ค. ํ๋ง๋๋ก ๋ชจ๋ ๊ฒ ๋ฉ๋ชจ๋ฆฌ์์ญ์ ๋ค์ด๊ฐ๋ค์ ์ปดํจํฐ์ ์ํด์ ์ฝํ์ง๊ณ ์คํ๋์ด์ง๋ค.
movl data_items(, %edi, 4), %ebx
์๋ฅผ ๋ค์ด ์์ ๋ช ๋ น์ 7์ ์ ์ฅ์์ญ์ ํ์๋ก ํ๋ค. ์ฒ์ ๋ช ๋ น์ 2๋ฐ์ดํธ, ๋ค์ ๋ ์ด์ง์คํฐ์ ์ฌ์ฉ์ ์ํด์ 1๋ฐ์ดํธ, ๋ง์ง๋ง์ผ๋ก data_items์์ญ์ ์ํด์ 4๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์์์๋ ์ด๋ฌํ ์์น๋ฅผ ์ผ๋ จ์ ์ซ์๋ฅผ ํตํด์ ์ฐพ์๋ด๊ฒ ๋๋ค.
์ ์ฅ ์์ญ ๋์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ์ด๋ฅผ ์ฌ์ฉํ์.
-
Address Address(์ฃผ์)๋ ์ ์ฅ์์น๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ์ํ ์ซ์๋ค. ์ปดํจํฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฒซ๋ฒ์งธ ์ฃผ์๊ฐ 0์ด ๋๋ฉฐ, ๊ณ์ 1์ฉ ์ฆ๊ฐํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ์ ์์น๋ฅผ ๊ฒฐ์ ํ๋ค. ์ด๋ฌํ ์ฃผ์๋ ์ปดํจํฐ๊ฐ ์ฌ์ฉํ๊ธฐ์๋ ํธ๋ฆฌํ์ง๋ง ์ธ๊ฐ์ด ๋ณด๊ธฐ์๋ ๋ฌธ์ ๊ฐ ์๊ธฐ ๋๋ฌธ์, ์ซ์ ๋์ ์ดํดํ๊ธฐ ์ฌ์ด ์ฌ๋ณผ (data_items ์ ๊ฐ์)์ ์ฌ์ฉํ๋ค.
-
Pointer ํฌ์ธํฐ๋ ์ฃผ์๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ํน์ ๋ ์ง์คํฐ์์ญ์ด๋ค. ์์ ์์ ์์ %ebx๊ฐ ํฌ์ธํฐ๋ก, ํ์ฌ์ stack์์ญ์ point(๊ฐ๋ฆฌํจ๋ค)ํ๋ค. ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ๊ณผ์ ์ ์์ด์ ๋ง์ ์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ค.
-
Byte ์ ์ฅ์ ์ํ ์ต์๋จ์๋ค. x86ํ๋ก์ธ์ค์ ๊ฒฝ์ฐ ํ๋ฐ์ดํธ๋ 8bit๋ก 0์์ 255์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ค.
-
Word ๋ ์ง์คํฐ์ ์ผ๋ฐ์ ์ธ ํฌ๋ค. x86 ํ๋ก์ธ์ค์ ๊ฒฝ์ฐ, 1 word๋ 4๋งํผ์ ์ ์ฅ์์ญ(4byte)์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
Instruction Pointer
์ปดํจํฐ๋ ๋ช ๋ น์ด๋ ์ง ์๋๋ฉด ์ผ๋ฐ ๋ฐ์ดํฐ๋ ์ง ๋์ผํ๊ฒ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉฐ, ๋ํ ์ด๋ค์ ๊ตฌ๋ถํ ๋ฅ๋ ฅ์ ๊ฐ์ง๊ณ ์์ง ์๋ค. Instruction pointer์ ๋ค์ ๋ช ๋ น(instruction)์ ๊ฐ๋ฅดํจ๋ค. ํด๋น ๋ช ๋ น์ ์คํํ๊ฒ ๋๋ฉด instruction pointer๋ ๋ค์ ๋ช ๋ น์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๊ฐ์ด ์ฆ๊ฐ๊ฐ๋๋ฉฐ, ํ์ฌ ์คํํด์ผ๋ ๋ช ๋ น์ ๋ง์น๊ฒ ๋๋ฉด, ๋ค์ instruction pointer์ ๊ฐ์ ์ดํผ๊ฒ ๋๋ค.
jmp๋ฑ์ ์ด์ฉํด์ ๋ช ๋ น์ ์ ํํ๊ฒ ๋ ๊ฒฝ์ฐ๋ ์ด๋ป๊ฒ ๋ ๊น? ์ด๋ด ๊ฒฝ์ฐ์ ์ปดํจํฐ๋ ๋ค์ ๋ช ๋ น์ด ์๋ ๋ค๋ฅธ ์์น์ ๋ช ๋ น์ ์คํํด์ผ ํ ๊ฒ์ด๋ค.
jmp somewhere
์ด ์ฝ๋๋ ์๋์ ์ฝ๋์ ๋์ผํ ์ผ์ ํ๋ค.
movl $somewhere, %eip
somewhere๋ ํ๋ก๊ทธ๋จ์ ์์ญ์ ์ฐธ์กฐํ๊ธฐ ์ํ ์์ง์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก %eip๊ฐ ์ง์ somewhere๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋ ๊ฒ์ ํ์ฉ์ด ๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ '$'ํ์๋ฅผ ์ด์ฉํ๊ฒ ๋ ๊ฒฝ์ฐ ์ด๋ฅผ ํ์ฉํ ์ ์๊ฒ ๋๋ค. $ํ์๊ฐ immediate mode addressiong๋ชจ๋๋ก somewhere๋ฅผ ๊ฐ์ผ๋ก ๋ค๋ฃฐ ์ ์๋๋ก ํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค. '$'ํ์๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ direct addressing mode๊ฐ ๋๋๋ฐ, ๊ทธ๋ด๊ฒฝ์ฐ somewhere์ ์ฃผ์์ ์๋ ๊ฐ์ด %eip๋ก ์ด๋๋๋ค.
movl $0, $ebx
0์์ $ํ์๊ฐ ๋ถ์ด ์๋๋ฐ, ์ด๊ฒ์ immediate-mode instruction๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๋ฏ๋ก 0์ ebx์ ์ง์ด ๋ฃ๊ฒ ๋๋ค. ๋ง์ฝ $ํ์๋ฅผ ์ ๊ฑฐํ๊ฒ ๋๋ฉด direct addressing mode๊ฐ ๋์ด์ 0๋ฒ์ฃผ์์ ๊ฐ์ด %ebx์ ๋ฐ์ด๋ฃ์ด์ง๊ฒ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ
ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ๋, ๊ฐ๊ฐ์ .section์ ์ด๋ฆ์ด ๊ฐ๋ฆฌํค๋ ์ง์ ์ด ๋ก๋๋๋ค. ์ค์ ์ฝ๋ (.text section)์ 0x0848000 ์ฃผ์์ ๋ก๋๋๋ค. .data์น์ ์ด ๊ทธ๋ค์์ ์์นํ๊ฒ ๋๊ณ , ๊ทธ๋ค์ .bss ์น์ ์ด ์์นํ๊ฒ ๋๋ค. .bss ๋ ๋ฒํผ์์ญ์ผ๋ก ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ๋ฉ๋ชจ๋ฆฌ์ ์์ญ์ ๋ฏธ๋ฆฌํ๋ณดํ ์ ์๊ฒ ๋์์ค๋ค. ์ฐ๋ฆฌ๋ run-time์ ๊น์ง๋ .bss์ ๊ฐ์ ๋ฐ์ด ๋ฃ์ ์ ์๋ค. .data์น์ ์ ๊ฒฝ์ฐ์๋ ๊ณต๊ฐ์ ํ ๋น(.long ๋ฑ์ ์ด์ฉํด์)ํ๊ณ ๊ฑฐ๊ธฐ์ ํ์ํ ๊ฐ์ ์ฆ์ ๋ฐ์ด ๋ฃ์ ์ ์๋ค. ์ด ๊ฐ๋ค์ ํ๋ก๊ทธ๋จ์ด ์ปดํ์ผ๋์ด์ ๋ง๋ค์ด ์ง๋, ํ๋ก๊ทธ๋จ ํ์ผ์ ์ง์ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ๋ฐ๋ฉด .bss ์น์ ์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋จ์ด ์คํ์ ์๋ ์ด๊ธฐํ ๋์ง ์๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํ๋ก๊ทธ๋จ ํ์ผ ์์ฒด์ ์ด๋ ํ ๊ฐ์ ์ ์ฅํ ์ ์๋ค. ์ฌ๊ธฐ์๋ ๋จ์ง ์ด๋์ ๋์ ์ ์ฅ๊ณต๊ฐ์ด ํ์ํ์ง ์ ๋ํ ์ ๋ณด๋ง์ด ์์ ๋ฟ์ด๋ค.
๋ฉ๋ชจ๋ฆฌ๋ pages๋ผ๋ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ฌ์ ๋๋๊ฒ ๋๋ค. x86ํ๋ก์ธ์ค์์ ์คํ๋๋ ๋ฆฌ๋ ์ค์์ ํ ํ์ด์ง๋ 4096 byte์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค. ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ ํ์ด์ง๋จ์๋ก ๋งคํ์ด ๋๋ค.
Register ๋?
๋ฐ์ดํฐ ๊ณ ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์ค์์ฒ๋ฆฌ์ฅ์น(CPU)์ ๋ค์ด์๋ ์๊ท๋ชจ ๋ฐ์ดํฐ ๊ธฐ์ต ์ฅ์น์ด๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ค๋ฉด, ํ๋ก์ธ์ค๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ ธ ์๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ธฐ ์ํด์ bus๋ฅผ ์ด์ฉํด์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค. ๋ฐ๋ฉด register๋ ํ๋ก์ธ์ค ๊ทธ ์์ ์ด ๊ฐ์ง๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๋ค. ์ด์ ๋ธ๋ฆฌ์์ ๋ ์ง์คํฐ๋ CPU๊ฐ ์ฌ์ฉํ๋ ๋ณ์์ด๋ค. ์ปดํจํฐ์ bit๊ฐ ํด์๋ก ์ฒ๋ฆฌ ์๋๊ฐ ๋น ๋ฅด๋ค.
- ๋ฒ์ฉ ๋ ์ง์คํฐ (64bit - 32bit - 16bit - up 8bit - down 8bit)
- rax (- eax - ax - ah - al)
- rbx (- ebx - bx - bh - bl)
- rcx (- ecx - cx - ch - cl)
- rdx (- edx - dx - dh - dl)
AX (๊ธฐ๋ณธ ๋์ฐ๊ธฐ)๋ I/o ๋ฐ ๋๋ถ๋ถ์ ์ฐ์ ์ฐ์ฐ์ ์ฌ์ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ณฑ์ ์ฐ์ฐ์์ ํผ์ฐ์ฐ์์ ํฌ๊ธฐ์ ๋ฐ๋ผ ํ๋์ ํผ์ฐ์ฐ์๊ฐ eax ๋๋ AX ๋๋ AL ๋ ์ง์คํฐ์ ์ ์ฅ๋๋ค. BX (๊ธฐ๋ณธ ๋ ์ง์คํฐ)๋ ์ธ๋ฑ์ฑ ๋ ์ฃผ์ ์ง์ ์ ์ฌ์ฉ๋๋ค. CX (์นด์ดํธ ๋ ์ง์คํฐ)๋ ๋ฐ๋ณต ์์ ์ ์ฌ์ดํด ์๋ฅผ ์ ์ฅํ๋ค (ECX ๋ฐ CX ๋ ์ง์คํฐ์ฒ๋ผ). DX (๋ฐ์ดํฐ ๋ ์ง์คํฐ)๋ ํฐ ๊ฐ๊ณผ ๊ด๋ จ๋ ๊ณฑ์ ๋ฐ ๋๋์ ์์ ์ ์ํํ๊ธฐ ์ํด AX ๋ฐ DX ๋ ์ง์คํฐ๋ฟ๋ง ์๋๋ผ I/o ์์ ์ ์ฌ์ฉ๋๋ค.
-
์ธ๋ฑ์ค ๋ ์ง์คํฐ
- rsi (src index)
- rdi (dest index)
-
์์ฃผ ์ฐ๋ ๋ช ๋ น์ด
- mov : ์คํผ๋๋ 1์ ์คํผ๋๋ 2์ ๊ฐ์ ๋์ ํฉ๋๋ค.
- add : ์คํผ๋๋ 1์ ์คํผ๋๋ 2๋ฅผ ๋ํฉ๋๋ค.
- sub : ์คํผ๋๋ 1์ ์คํผ๋๋ 2๋ฅผ ๋บ๋๋ค.
- inc : ์คํผ๋๋ ๊ฐ์ 1 ์ฆ๊ฐ ์ํต๋๋ค.
- dec : ์คํผ๋๋ ๊ฐ์ 1 ๊ฐ์์ํต๋๋ค.
- call : ํ๋ก์์ ธ๋ฅผ ํธ์ถํฉ๋๋ค. (ํจ์ ํธ์ถ)
- ret : ํธ์ถ์ ๋ค์ ์ง์ ์ผ๋ก ์ด๋ํฉ๋๋ค. (ํจ์๋ฅผ ๋๋ด๊ณ ํธ์ถ ์ง์ ์ผ๋ก ๋์๊ฐ๋๋ค.)
- cmp : ์คํผ๋๋ 1๊ณผ 2์ ๊ฐ์ ๋น๊ตํฉ๋๋ค. (์คํผ๋๋ 1์ ๊ฐ) - (์คํผ๋๋ 2์ ๊ฐ)
- jmp : ๋ถ๊ธฐ (์์ธํ ์ค๋ช ์ https://8jz5.tistory.com/50)
- push : ๋ ์ง์คํฐ ๋ด๋ถ์ ๊ฐ์ ์คํ์ ์์ ์ ์ฅํ๊ณ ๋ ์ง์คํฐ ๋ด๋ถ๋ฅผ ๋น์๋๋ค.
- pop : push๋ ๊ฐ์ ํด๋น ๋ ์ง์คํฐ๋ก ๊ฐ์ ธ์ต๋๋ค. (push, pop์ ํ์ ์ ์ถ์ ๋ฐ๋ฆ ๋๋ค.)
-
ํจ์ ํธ์ถ ๊ท์ฝ
- ํจ์ ํธ์ถ ์ ๋งค๊ฐ๋ณ์๋ rdi, rsi, rdx, rcx, r8, r9 ๋ฅผ ํตํด ๋์ด์ค๊ฑฐ๋ ๋๊ฒจ์ง๋๋ค.
- ์ด ๋ ๋งค๊ฐ๋ณ์์ ๊ฐฏ์์ ๊ด๊ณ์์ด ์ด ๋ ์ง์คํฐ๋ค์ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ค๋ฉด ์ค๋ฅ๊ฐ ๋ ์ ์์ต๋๋ค.
- ๋ฐํ๊ฐ์ ํญ์ rax์ ์ ์ฅ๋ฉ๋๋ค.
-
syscall
- syscall ๋ช ๋ น์ด๋ฅผ ํตํด ์์คํ ์์ ๋ฏธ๋ฆฌ ์ ์ธ๋์ด ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
- ์ด ๋ syscall ์ฝ๋๋ rax์ ๋ค์ด ์์ด์ผ ํ๋ฉฐ ๋ฐํ๊ฐ ๋ํ rax์ ์ ์ฅ๋ฉ๋๋ค.
- syscall ์ฝ๋๋ ์์คํ ๋ง๋ค ๋ค๋ฅด๋ฉฐ ๋งฅ์ https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master ํด๋น ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ญ์์ค.
- syscall ํ ์๋ฌ ๋ฐ์ ์ ์ด๋ __error ํจ์๋ฅผ ์ด์ฉํด ์ฒ๋ฆฌํด์ผํฉ๋๋ค.
- __error ํจ์๋ sys/errno.h ์ ์ ์ธ๋์ด ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋ฐ
section
์ด์ ๋ธ๋ฆฌ์ ์ธ์ด๋ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค.
- Data section
- ํ๋ก๊ทธ๋จ์ ๋ฐ์ดํฐ ํญ๋ชฉ์ด ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ์ธํ๋ ๋ฐ ์ฌ์ฉ
- ์์ ๊ฐ๊ณผ ํ์ผ ์ด๋ฆ ์ ์ฅ
- ํ๋ก๊ทธ๋จ ์ ์ฒด์์ ์ ์ ์ผ๋ก ์ ์ง
- Bss section
- ๋์ค์ ํ๋ก๊ทธ๋จ์์ ์ ์ธ ๋ ๋ฐ์ดํฐ์ ๋ํ ๋ฒํผ๋ฅผ ํฌํจํ๋ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์น์
- ๋ณ์ ์ ์ธ์ ์ฌ์ฉ
- ๋ฒํผ ๋ฉ๋ชจ๋ฆฌ๋ 0์ผ๋ก ์ฑ์์ง๋ค.
- Text section
- ์ฝ๋ ์ ์ฅ์ ์ฌ์ฉ
- Stack
- ํ๋ก๊ทธ๋จ์ ํจ์ ๋ฐ ํ๋ก ์์ ์ ์ ๋ฌ ๋ ๋ฐ์ดํฐ ๊ฐ์ ํฌํจํ๋ ์ธ๊ทธ๋จผํธ
์ฃผ์
; ๋ก ์ฌ์ฉํ๋ค.
[label] mnemonic [operands] [; comment]
add eax, ebx ; add ebx to eax
๋ ์ง์คํฐ๋ฅผ ์ด๊ธฐํ ํ๋ ๋ฐฉ๋ฒ
mov ax, 0 ; ax์ 0๊ฐ์ ๋ฃ๋ ๋ช
๋ น์
sub ax, ax ; ax-ax ์๊ธฐ ์์ ์ ๋ป
xor ax, ax ; ์๋ก ๊ฐ์๊ฐ์ ๊ฐ์ ๊ฒฝ์ฐ 0์ด ๋๋ ๋ฐฉ์
์ด๋ฐ ๋ฐฉ์์ ์ฐจ์ด๋ ์ปดํ์ผ ํ ๋ ํฌ๊ธฐ๊ฐ ๋ค๋ฅด๋ค. mov๋ 3 ~ 4์ ๋์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๋ฐ๋ฉด์ sub๋ xor๋ 1 ~ 2 ํฌ๊ธฐ๋ฅผ ๊ฐ๋๋ค.
์ฆ๊ฐ
inc rax ; rax 1์ฆ๊ฐ
dec rax ; rax 1๊ฐ์