ํฌ์ŠคํŠธ

๐ŸŒ‘ 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 ์ •์ˆ˜ํ˜•
        1. ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ํƒ€์ž… ์ฒดํฌ๊ฐ€ ์ด๋ฃจ์–ด์ง
        1. ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋ช‡ ๊ฐ€์ง€ ์‚ฐ์ˆ  ์—ฐ์‚ฐ ์ œํ•œ
        1. ++/โ€“, ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž… ์‚ฌ์ด์ฆˆ ๋งŒํผ
  • *.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
}

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.