๐ Assembly
https://coding-factory.tistory.com/651
https://blog.naver.com/PostView.nhn?isHttpsRedirect=true&blogId=ndb796&logNo=221054682271
http://yuchi.duckdns.org/xe/Programming_QA/5934
http://yuchi.duckdns.org/xe/Programming_QA/5950
https://sunrinjuntae.tistory.com/24
https://araikuma.tistory.com/600
https://nan491.tistory.com/entry/%EC%8A%A4%ED%83%9DStack-PUSH-POP
https://wikidocs.net/145932
RAM, DRAM
ISA, Instruction Set Architecture, ํ๋ก๊ทธ๋จ ๋ช
๋ น ๊ตฌ์กฐ
ISA๋ฅผ ์ผ๋ง๋ Abstraction ์ถ์ํ ํ๋์ง์ ๋ฐ๋ผ,
โ HLL High-Level Language
โ LLL Low-Level Language (= Machine L/๊ธฐ๊ณ์ด, Assemble L/Assembly)
โ ์ถ์ํ ์์ค, Machine L < Assembly < HLL
Assembly ์ด์
๋ธ๋ฆฌ
Machine L ๋ช
๋ น์ด์ 1:1 ๋์๋๋ ๋ช
๋ น์ด ์งํฉ, Machine L โ Assembly
โ ๋ ๋ค CPU์ ์ง์ ์ง์ํ ๋ช
๋ น์ด์ ์งํฉ์ ๋ง๋๋ ๊ฒ
โ ์ ์ฝ ์ฌํญ, Machine L = Assembly
Assembly ์ฃผ๋ก, ๊ฐ๋ณ์ธ์ ํจ์ ์ง์ ๊ตฌํ, HLL/HLL๋ฌธ๋ฒ์ผ๋ก ํ ์ ์๋ ์ผ, MMX/SSE ๋ฑ ํน์ ๊ธฐ๋ฅ
๊ฐ์ ๋ช
๋ น์ด๋ CPU/CPU ๋ฒ์ ๋ง๋ค ๊ธฐ๊ณ์ด/Assembly๊ฐ ๋ค๋ฆ
I.E. Intel x86 ๊ณ์ด CPU ๊ธฐ๊ณ์ด/Assembly โ ๋ค๋ฅธ ๋ฒค๋ CPU
(AMD/Cyrix CPU๋ ์๋ Intel ํธํ์นฉ, ๋ชจํ ๋กค๋ผ์ x68๊ณ์ด์ด ๋ํ์ ์ธ ๋น ํธํ์นฉ)
โ ๊ธฐ๊ณ์ด/Assembly๋ CPU ์ข
์์ , CPU๊ฐ ๋ฌ๋ผ์ง๋ฉด ์ ์ธ์ด๋ฅผ ๋ฐฐ์์ผ..
โ High-Level ์ธ์ด์ ๋ฑ์ฅ
Assembler, Assemble, Assembly โ Machine L
Compiler, Compile, HLL โ Machine L, Assembly
VM, HLL โ VM(HW/SW Simulation), VM ์ค์ ํ ํด๋น VM์ฉ Machine L๋ก Compile
I.E. JAVA, PC์ ๋์์ง SW์ธ JVM์ผ๋ก ๋์๊ฐ
UNIX OS๊ฐ C๋ก ์ฐ์ธ ์ดํ, OS ๊ฑฐ์ ๋๋ถ๋ถ C
๋ฌผ๋ก HW ์ง์ ๋ค๋ฃจ๊ฑฐ๋, ์๋์ ๋ฏผ๊ฐํ ์ผ๋ถ๋ Assembly๋ก
Windows, Unix, Linux๋ ๋๋ถ๋ถ์ C + ์ผ๋ถ Assembly๋ก
GUI vs CUI (Console)
Dos (Disk Operating System)
IBM PC๊ฐ ์ฒ์ ๋ณด๊ธ๋ ๋ ๋ผ์ํ OS
Windows 98๊น์ง๋งํด๋ ์๊น๋ง ํ๋ฉด์ ํ๋กฌํํธ ํ๋ ๋จ๋ ๋์ค ๋ถํ
์ด ์์์
Windows 2000/XP ์ดํ ๋์ค ๋ถํ
์ ๋ถ๊ฐ๋ฅ
OS ๋จ๊ณ ๋๋ฉด Command Prompt์ฐฝ์ ๋์ธ ์ ์๋๋ฐ, ์์ฐํ NT์ปค๋ ์๋ ๋์๊ฐ๋ ๋์์ธ๋ง ๋์ค์ฐฝ ๊ฐ์ UI
CUI ํ๋ก๊ทธ๋จ์ ๋ํ์ ์ธ ์๋ ๊ฐ์ข
์จ๋ผ์ธ ๊ฒ์์ ์๋ฒ ํ๋ก๊ทธ๋จ
- Preprocessor (์ ์ฒ๋ฆฌ๊ธฐ)
- ์ ํ์ #, Like #include
- Library, ๊ธฐ๋ฅ ์งํฉ, *.lib (*.dll๋ ์ฌ์ฉํ์ง๋ง Compile ํ ๋ *.lib)
- Header File, Library ๊ฐ์ ธ๋ค ์ธ ์ ์๊ฒ ์ ์ธํด๋ ๊ฒ, *.h
- #include, Header File ์ธ ์ ์๊ฒ ํ๋ ์ง์์ด
- Variable, ๋ฐ์ดํฐ๋ฅผ ๋ด์ ์ ์๋ ์ผ์ ๋จ์์ Register/Memory
- Struct, ํฌํจ๋ Variable(Data Type, Struct)๋ค์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ฐ์์ ์ผ๋ก ์กด์ฌ
- Array
- Struct ๋ด์ ํ๋(Variable)๋ค์ ์ฌ์ด์ฆ๋ ๋ถ๊ท์น
- Array ํ ์นธ์ ์ฌ์ด์ฆ๋ ๋ชจ๋ ๋์ผ
- ์ซ์๋ก ์ ํํ๊ฒ ์ฐพ์๋ผ ์ ์๋ ๊ฒ์ด๋ค. ์ธ๋ฑ์ค * ํ์นธ ์ฌ์ด์ฆ
- Pointer
- ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๋ฅผ ๋ค๋ฃจ๋๋ฐ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ ํ์
- VS unsigned ์ ์ํ
- ์ปดํ์ผ๋ฌ์ ์ํด ํ์ ์ฒดํฌ๊ฐ ์ด๋ฃจ์ด์ง
- ์ปดํ์ผ๋ฌ์ ์ํด ๋ช ๊ฐ์ง ์ฐ์ ์ฐ์ฐ ์ ํ
- ++/โ, ๊ฐ๋ฆฌํค๋ ๋ฐ์ดํฐ ํ์ ์ฌ์ด์ฆ ๋งํผ
- *.exe (pe File์ ํ ์ข
๋ฅ)
- pe Header์ main() Address์ ์๋๋ฒ์ง๊ฐ Entry Point๋ก ๊ธฐ๋ก
- *.exe๊ฐ ๋ก๋๋๊ณ ์คํ๋๋ฉด ์ด ์ฃผ์๋ฅผ ์ฝ์ด main() ๋ถํฐ ์คํ
์ธ์ Argument ์ ๋ฌ
์ผ๋ฐ์ ์ผ๋ก ์คํ
32/64-bit ์ดํ ๋ฐ์ดํฐ ๋ธ๋ก์ ์คํ์ push, ์ด๊ณผ๋ mov ๋ฑ์ผ๋ก ์นดํผํ๊ณ ํจ์์ ์ง์
ํ์ฌ ์คํ ์์ popํ๊ฑฐ๋ mov ๋ฑ์ผ๋ก ์นดํผ๋ ๋ฐ์ดํ๋ฅผ ์ต์ธ์ค
ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ญ์ ๋ฐ๋ก ์ ๋ฌํ๋ ค ํ๋ฉด ๋ค ์คํ์ ์นดํผํด์ผ ํ๋ฏ๋ก, ํจ์ ์ง์
์ ์๋ ์ ํ
โ Pointer, push ํ๋ฒ์ด๋ฉด ๋๋๊น
์ง์ญ๋ณ์, ํจ์๋ฅผ ๋ฒ์ด๋ ๋ ์๋ฉธ (๋ค๋ฅธ ์ฝ๋๋ค์ ์ํด Overwrite ๊ฐ๋ฅ)
ํจ์ ์ง์
์, ์คํํฌ์ธํฐ(%SP) - ์ฌ์ด์ฆ (์ฌ์ฉํ๋ ์ง์ญ๋ณ์์ ์ด ์ฌ์ด์ฆ๋ฅผ ๊ณ์ฐํด์ ์คํ ๊ณต๊ฐ ํ๋ณด)
ํจ์ ๋ฆฌํด ์, SP ์๋๋๋ก
Debug Interrupt
CPU์ ์๋ ํ๋ฆ์ ๊ฐ์ญํ๋ ์ผ์ข
์ ๊ธด๊ธ ์ ํธ
HW Interrupt, ํ์ด๋จธ์นฉ/ํ์ด๋จธ Interrupt, ์ฃผ๋ณ์ฅ์น์ IO/HW Interrupt
SW Interrupt, CPU๊ฐ ์ฐ์ฐ๋์ค ๋ฐ์์ํค๋ Interrupt
/0, ๊ธ์ง๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ Access โ Interrupt ๋ฐ์
๊ฒ์ ์ค โ์๋ชป๋ ์ฐ์ฐ์ค๋ฅ~โ ๋ฅผ ๋ณธ๋ค๋ฉด ์ด์ ๊ฐ์ SW Interrupt๋ก ์ธํด APP Crash
SW Interrupt๋ Exception, SW์ ์ผ๋ก ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์์ํฌ ์ ์์, __asm int 3
๋ฒ๊ทธ ์ ํ๊ณผ ์์ธ, ๋์ฒ ์๋ น
ํ๋ก๊ทธ๋จ์ด ํฌ๋์ฌํ๊ฒ ๋ง๋๋ ๋ฒ๊ทธ:
- commit ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ด๋๋ ์ค ์ต์ธ์ค
- ์ ์ OSํ์ ๋์๊ฐ๋ ๋ชจ๋ SW๋, OS๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์์ผ๋ง ์ธ ์ ์์
- ์คํ ์์ญ๋ ํ๋ก์ธ์ค ์ด๊ธฐํ์์ ํ ๋น๋ฐ์ ์์ญ
- ๋ณดํต reserve์ commit์ด๋ผ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋๋ฐ commit์ด ์ด๋ฃจ์ด์ ธ์ผ ํ ๋น๋ฐ์ ์ด๋๋ ์ค๊ฐ ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋งตํ๋๋ค.
- ๋ง์ฝ commit ๋์ง ์์, ๊ทธ๋ฌ๋๊น ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ๋งตํ ๋์ง ์์ ์์ญ์ ์ต์ธ์ค ํ๋ ค๊ณ ํ๋ฉด CPU๋ Exception ๋ฐ์
- ๋ํ 0๋ฒ์ง๋ ์ฌ์ฉ์ด ๋ถ๊ฐํ๋๋ก OS๊ฐ ์ค์ ํด๋์์ผ๋ฏ๋ก commit/์ต์ธ์ค ๋ถ๊ฐ
- Heap Crash
- HEAP : ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ๋ฉ์ด๋ฆฌ๋ก ๋ฐ์๋๊ณ ๋์ด์ฐ๋ ๋ฉ๋ชจ๋ฆฌ ํ
- I.E. malloc()/free(), new/delete
- ํ์ ํน์ฑ์ ํ ๋น๋ฐ์ ์ฌ์ด์ฆ๋ฅผ ๋๊ฒจ์ ๋ฎ์ด์ฐ๊ฒ ๋๋ฉด ๋ค๋ฅธ ๋ธ๋ญ์ด ๊นจ์ง
- Heap Crash๊ฐ ๋ฐ์ํ๋ฉด ๊ตฌํํ๊ธฐ ๋๋ฆ์ด์ง๋ง ๋์น์ฑ์ง ๋ชปํ๊ฒ ์กฐ์ฉํ๊ฒ ๋์๊ฐ์๋ ์๊ณ APP Crash ํ ์๋, ํ์ผ์ด ์ด๋ฆฌ์ง ์๊ธฐ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
__asm
{
; @@ Register, Bus, Memory (Text, Data, Stack, Heap), CPU (ALU)
; Kernel
; OS๊ฐ ์ฌ์ฉ, ํ๋จธ๋ ์ฌ์ฉ ๊ธ์ง/๋ถ๊ฐ
; Stack
; Assembly๊ฐ ๋น๋ฒํ๊ฒ, ์ ์ฅ๋๋ ๊ฐ ์ ์ฅ, Subroutine, Procedure ๋ฑ
; Stack ์๋ฃ ๊ตฌ์กฐ
; BasePointer ์์ ์์น๋ฅผ BP ๋ ์ง์คํฐ, StackPointer ์ ์ผ ์ ์์น๋ฅผ SP ๋ ์ง์คํฐ
; Glow Down, ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ๊ณผ ๋ฌ๋ฆฌ ๊ฑฐ๊พธ๋ก ์๋๋ค
; DLLs
; Linker๊ฐ ์ธ๋ถ์์ ๊ฐ์ ธ์จ ์ฝ๋๋ฅผ ํฉ์น ๋ ์ฌ์ฉ
; Endianness
; Byte Order, Byte๋ฅผ ๋ฐฐ์ดํ๋ ๋ฐฉ๋ฒ
; Big Endian, ํฐ ๋จ์๊ฐ ์์
; Little Endian, ์์ ๋จ์๊ฐ ์์
; ----
; ๋ฌธ๋ฒ { Intel (์ฃผ๋ก ์ฐ์), AT&T }
; ๋ช
๋ น์ด ์ํ ๋ฐฉ์ (ADD EAX EBX, Intel์ EAX += EBX, AT&T๋ EBX += EAX)
; ๊ฐ/์ซ์ ํ๊ธฐ ๋ฐฉ์ (Intel์ 16์ง์ Prefix h์ 2์ง์ Prefix b, AT&T๋ Prefix $)
; ๋ ์ง์คํฐ ํ๊ธฐ ๋ฐฉ์ (Intel์ ๊ทธ๋๋ก, AT&T๋ Prefix %)
; ํ ์ค ์ฃผ์
COMMENT !
์ฌ๋ฌ ์ค ์ฃผ์
๋๋ํ ๋์ @, #, $, % ๋ฑ๋ ๊ฐ๋ฅ
!
COMMENT !
C ์ธ๋ผ์ธ ์ด์
๋ธ๋ฆฌ
__asm
{
;
}
!
; ๋์๋ฌธ์ ์๊ด ์์
; NOP, 0x90
; ์๋ฌด ์์
๋ ์ํจ, ํด๋ญ ์๋ชจ, 1Byte์ ๋น ๊ณต๊ฐ ์ฐจ์ง
; MOV A B
; MOVE, A์ B ๊ฐ ๋ฃ๊ธฐ, ์ฐ์ฐ ํฌํจ ๋ถ๊ฐ๋ฅ
; ๋ช
๋ น์ด์ ์กฐํฉํ์ฌ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ์ ๋ฏธ์ฌ
; l Long 4-Byte
; w Word 2-Byte
; b Byte 1-Byte
; I.E. movl, 4-Byte ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฎ๊ธด๋ค
; = ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ์๋ ๋ ์ง์คํฐ๋ฅผ, ๊ฐ ํฌ๊ธฐ๋ณ๋ก ์ชผ๊ฐ์ด ์ธ ์ ์๋ค
; LEA A B
; Load Effective Address, ์ฐ์ฐ ํฌํจ ๊ฐ๋ฅ
; LEA EAX, [EAX + 1000]
; INC
; Increase ํผ ์ฐ์ฐ์์ 1์ ๋ํ๊ธฐ
; ์ฐ์ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ Zero Flag ZF, Overflow Flag OF ์ธํธ ๊ฐ๋ฅ
; JMP A
; ํน์ ์์น A๋ก ์ ํ
; JA, JB, JE ๋ฑ
; ---
; 004013D4 EB 01
; 004013D6 CC
; ---
; 215: jmp label_1
; 216: int 3
; 217: label_1:
; ---
; jmp == 0xEB 0x01
; ์ด์
๋ธ๋ฆฌ์์ JMP๋ ํ๊ฐ์ง๋ง ์ค์ ๋ก ๊ธฐ๊ณ์ด์ฝ๋๋ก ๋ฐ๋๋๋ ์์ ์คํผ๋๋(์์์๋ 0x01)์ ๋ฐ๋ผ ๊ฐ๊ฐ ๋ค๋ฅธ ๋ช
๋ น์ผ๋ก ๋์น๋๋ค.
; ์ด ๋ช
๋ น์ 1๋ฐ์ดํธ ๊ฑด๋๋ฐ๋ผ๋ ๋ป์ด ๋๊ฒ ๋ค.
; CALL
; ํจ์๋ฅผ ํธ์ถํ๋ค๊ฐ ๋ค์ ์๋ ์์น๋ก ๋์์ฌ ๋
; JMP์ ๋ค๋ฅธ ์ ์ ์คํํ ๋ค์ ๋๋๋ฉด RET์ ์ ์ฅํ๊ณ ๋ค์ ์๋ ์ํ๋ก ๋์์ด
! RET
; ํ์ฌ ํจ์๊ฐ ๋๋ ๋ค์ ๋์๊ฐ ์ฃผ์๋ฅผ ์ง์ ํ๊ธฐ ์ํด ์ฌ์ฉ
; PUSH
; ์คํ์ ๊ฐ ๋ฃ๊ธฐ
; POP
; ์คํ์ ์๋ ๊ฐ ๋นผ๋ด๊ธฐ
; INT 3, 0xCC
; ๋๋ฒ๊ทธ ์ธํฐ๋ฝํธ
; LEAVE
; ํ์ฌ๊น์ง์ ๋ฉ๋ชจ๋ฆฌ ์คํ ๋น์ฐ๊ณ , EBP๋ฅผ ์์ ์ด ํธ์ถํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ฑ์
; ์คํ์ค์ธ ํจ์๋ฅผ ์ข
๋ฃํ๊ธฐ ์ํด ์ ๋ฆฌํ๋ ์์
์ ์ฌ์ฉ
; ๋ฌธ๋ฒ
; ํจ์ ๋ฆฌํด ๊ฐ์ RAX, EAX์ ์ ์ฅ
; ๋ชฉ์ ์ง๋ RDI, ์ถ๋ฐ์ง๋ RSI
; RBP Base Pointer
; RSP Stack Pointer
; RIP ํ์ฌ ์คํํ ์ฝ๋์ ์ฃผ์
; ์์คํ
์ฝ
; ๋ ์ง์คํฐ 0 ์ด๊ธฐํ
; MOV AX, 0
; (ํฌ๊ธฐ 3~4)
; SUB AX, AX
; XOR AX, AX
; (ํฌ๊ธฐ 1~2)
add eax, edx;
; eax์ edx์ ๋ด์ฉ์ ๋ํ๋ค.
; ๋ํ๊ฐ์ eax ๋ ์ง์คํฐ์ ์ ์ฅ๋๋ค.
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
// Inline Assembly
int a = 0;
if (a) a = 0;
else a = 1;
//
int a = 0;
__asm
{
mov eax,dword ptr[a]
cmp eax,0
jz lb_set_a1
lb_set_a0:
xor eax,eax
mov dword ptr[a],eax
lb_set_a1:
inc eax
mov dword ptr[a],eax
}
//
int i = 0, s = 0;
lb_loop:
if (i >= 100)
goto lb_exit_loop;
s += i;
I++;
goto lb_loop;
lb_exit_loop:
//
int s = 0;
__asm
{
xor ecx,ecx
xor edx,edx
lb_loop:
inc ecx
add edx,ecx
cmp ecx,100
jnz lb_loop
mov dword ptr[s],edx
}