Assembly_basic

Assembly ๊ธฐ๊ณ„์–ด๋กœ 1๋Œ€1 ๋Œ€์‘ ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋กœ, human readable ํ•œ ์–ธ์–ด ์ค‘ ๊ฐ€์žฅ ๊ธฐ๊ณ„์–ด์— ๊ฐ€๊นŒ์šด ์–ธ์–ด์ด๋‹ค. ๊ธฐ๊ณ„์–ด๋กœ ์ปดํŒŒ์ผ ์ง์ „์— ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๋กœ ๋ณ€ํ™˜์„ ๊ฑฐ์นœ๋‹ค. operation code(๋ช…๋ น์–ด) ์™€ operand(ํ”ผ์—ฐ์‚ฐ์ž) ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๋ช…๋ น์–ด๋Š” ๋ฐ์ดํ„ฐ ์ด๋™, ์‚ฐ์ˆ ์—ฐ์‚ฐ, ๋…ผ๋ฆฌ์—ฐ์‚ฐ, ๋น„๊ต, ๋ถ„๊ธฐ, ์Šคํƒ, ํ”„๋กœ์‹œ์ €, ์‹œ์Šคํ…œ์ฝœ์˜ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค. ํ”ผ์—ฐ์‚ฐ์ž ์ž๋ฆฌ์—๋Š” ์ƒ์ˆ˜(Immediate Value), ๋ ˆ์ง€์Šคํ„ฐ(Register), ๋ฉ”๋ชจ๋ฆฌ(Memory)๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ์ˆซ์ž๋ฅผ ๋„ฃ์œผ๋ฉด ์ƒ์ˆ˜์ด๋‹ค. [] ๋กœ ๋‘˜๋Ÿฌ์‹ธ์ธ ์ˆซ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ์ด๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ํ”ผ์—ฐ์‚ฐ์ž ์•ž์—๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํฌ๊ธฐ ์ง€์ •์ž(Size Directive)๊ฐ€ ๋ถ™์„ ์ˆ˜ ์žˆ๋‹ค. BYTE: 8bit BYTE PTR rax : rax ๋ ˆ์ง€์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ 1๋ฐ”์ดํŠธ๋งŒํผ ์ฐธ์กฐ WORD: 16bit WORD PTR [0x8048000] : 0x8048000์˜ ๋ฐ์ดํ„ฐ๋ฅผ 2๋ฐ”์ดํŠธ๋งŒํผ ์ฐธ์กฐ DWORD: 32bit QWORD: 64bit ๋ช…๋ น์–ด mov โ€œ๊ฐ’"์„ ๋ ˆ์ง€์Šคํ„ฐ๋ฆฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ช…๋ น mov dst, src : src ๊ฐ’์„ dst์— ๋ฎ์–ด์”€ mov rdi, rsi : rsi์˜ ๊ฐ’์„ rdi์— ๋Œ€์ž… mov QWORD PTR[rdi], rsi : rsi์˜ ๊ฐ’์„ rdi๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์— ๋Œ€์ž… mov QWORD PTR[rdi + 8 * rcx], rsi : rsi์˜ ๊ฐ’์„ (rdi + 8 * rcx)๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์— ๋Œ€์ž… dst = ๋ ˆ์ง€์Šคํ„ฐ, src = ๋ ˆ์ง€์Šคํ„ฐ : src๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์„ dst๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์— ๋ฎ์–ด์”€ dst = ๋ฉ”๋ชจ๋ฆฌ, src = ๋ ˆ์ง€์Šคํ„ฐ : src๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์„ dst๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์— ๋ฎ์–ด์”€ dst = ๋ ˆ์ง€์Šคํ„ฐ, src = ๋ฉ”๋ชจ๋ฆฌ : src๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์„ dst๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ์˜ ๊ฐ’์— ๋ฎ์–ด์”€ dst = ๋ฉ”๋ชจ๋ฆฌ, src = ๋ฉ”๋ชจ๋ฆฌ : ๋ถˆ๊ฐ€๋Šฅ mov dst, [mem + 4] : mem + 4 ์ฃผ์†Œ์— ์ €์žฅ๋œ ๊ฐ’์„ dst์— ๋ฎ์–ด์”€ dst ๊ฐ’์œผ๋กœ๋Š” ์ฃผ์†Œ๋‚˜ ํฌ์ธํ„ฐ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. lea โ€œ์ฃผ์†Œ"๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ๋ฆฌ๋‚˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๋Š” ๋ช…๋ น lea dst, src : src๊ฐ’์„ dst์— ๋ฎ์–ด์”€ (src๋Š” ์ฃผ์†Œ๊ฐ’) lea rsi, [rbx + 8 * rcx] : (rbx + 8 * rcx) ๋ฅผ rsi์— ๋Œ€์ž… lea dst, [mem + 4] : mem ๊ฐ’์— 4๋ฅผ ๋”ํ•œ ๊ฐ’์„ dst์— ๋ฎ์–ด์”€ add add dst, src : dst ์— ์žˆ๋Š” ๊ฐ’์— src ๊ฐ’์„ ๋”ํ•ด dst์— ๋ฎ์–ด์”€ dst๋Š” ์ฃผ์†Œ, src๋Š” ๊ฐ’ sub sub dst, src: : dst ์— ์žˆ๋Š” ๊ฐ’์— src ๊ฐ’์„ ๋นผ๊ณ  dst ์ฃผ์†Œ์— ๋ฎ์–ด์”€ dst๋Š” ์ฃผ์†Œ, src๋Š” ๊ฐ’ inc inc op : op ์— ์žˆ๋Š” ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚ด op๋Š” ์ฃผ์†Œ dec dec op : op ์— ์žˆ๋Š” ๊ฐ’์„ 1 ๊ฐ์†Œ์‹œํ‚ด op๋Š” ์ฃผ์†Œ and and dst, src : src์™€ dst ๊ฐ’์„ and ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ dst์— ์ €์žฅ or or dst, src : src์™€ dst ๊ฐ’์„ or ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ dst์— ์ €์žฅ xor xor dst, src : src์™€ dst ๊ฐ’์„ xor ์—ฐ์‚ฐํ•œ ๊ฒฐ๊ณผ๋ฅผ dst์— ์ €์žฅ not not op : op ๊ฐ’์„ not ์—ฐ์‚ฐํ•œ ๊ฐ’์„ op์— ์ €์žฅ comp cmp rax, rbx : rax ๊ฐ’๊ณผ rbx ๊ฐ’์„ ๋น„๊ตํ•œ ํ›„, ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ”Œ๋ž˜๊ทธ ์„ค์ • if rax == rbx: ZF = 1 test test rax, rbx : rax ๊ฐ’๊ณผ rbx ๊ฐ’์„ and ์—ฐ์‚ฐ ํ›„, ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ํ”Œ๋ž˜๊ทธ ์„ค์ • jmp jmp addr : addr ์ฃผ์†Œ๋กœ rip๋ฅผ ์ด๋™ํ•œ๋‹ค. je je addr : ์ง์ „์— ๋น„๊ตํ•œ cmp rax rbx ์—ฐ์‚ฐ์—์„œ rax == rbx ๋ผ๋ฉด addr๋กœ rip ๋ฅผ ์ด๋™ํ•œ๋‹ค. jg jg addr : ์ง์ „์— ๋น„๊ตํ•œ cmp rax rbx ์—ฐ์‚ฐ์—์„œ rax > rbx ๋ผ๋ฉด addr๋กœ rip ๋ฅผ ์ด๋™ํ•œ๋‹ค. push push val : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์— โ€˜valโ€™ ๊ฐ’์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. rsp ๋ฅผ ํ•œ์นธ ์œ„๋กœ ์˜ฎ๊ธฐ๊ณ , ๊ทธ ์œ„์น˜์— โ€˜valโ€™์„ ๋Œ€์ž…ํ•œ๋‹ค. rsp -= 8; [rsp] = val ๋™์ž‘๊ณผ ๋™์ผํ•˜๋‹ค. push val ํ˜•ํƒœ๋กœ๋Š” 4byte ๋ฐ์ดํ„ฐ๋ฐ–์— ์ฃผ์ž…ํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, 4byte๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ์ž…ํ•  ๋•Œ๋Š” ๊ฐ’์„ ๋ ˆ์ง€์Šคํ„ฐ์— ๋Œ€์ž…ํ•˜๊ณ , ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ pushํ•œ๋‹ค. mov rax 0x0102030405060708 push rax pop pop rax : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์— ์žˆ๋Š” ๊ฐ’์„ โ€˜raxโ€™ ์ฃผ์†Œ์— ๋Œ€์ž…ํ•œ๋‹ค. rsp ์œ„์น˜์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , rsp ๋ฅผ ํ•œ์นธ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธด๋‹ค. rsp += 8; reg = [rsp-8] ๋™์ž‘๊ณผ ๋™์ผํ•˜๋‹ค. call call addr โ€˜addrโ€™ ์œ„์น˜์˜ ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœ โ€˜pushโ€™ ๋ช…๋ น๊ณผ โ€˜jumpโ€™ ๋ช…๋ น์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒ์— ๋‹ค์Œ ์‹คํ–‰ ์ฃผ์†Œ๋ฅผ pushํ•œ๋‹ค. (push rip + 8) rip๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ๋ช…๋ น์–ด๊ฐ€ ์ ํžŒ ์ฃผ์†Œ๋กœ ์ด๋™ํ•œ๋‹ค. (jump) leave rsp๋ฅผ rbp + 8 ์œ„์น˜๋กœ ์ด๋™ํ•œ๋‹ค. rbp๋„ ๊ฐฑ์‹ ํ•œ๋‹ค. mov rsp, rbp; pop rbp ๋ช…๋ น๊ณผ ๋™์ผํ•˜๋‹ค. ret rip๋ฅผ rsp๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์Šคํƒ์˜ ์ฃผ์†Œ์— ๋‹ด๊ธด ๊ฐ’์œผ๋กœ ์ด๋™ํ•œ๋‹ค. pop rip ๋ช…๋ น๊ณผ ๋™์ผํ•˜๋‹ค. ์‹œ์Šคํ…œ์ฝœ ์šด์˜์ฒด์ œ๋Š” ํ•˜๋“œ์›จ์–ด ๋ฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์ด๊ด„ํ•˜๋ฉฐ, ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œํ•œํ•˜์—ฌ ํ•ดํ‚น์œผ๋กœ๋ถ€ํ„ฐ ์ปดํ“จํ„ฐ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์ปค๋„ ๋ชจ๋“œ์™€ ์œ ์ € ๋ชจ๋“œ๋กœ ๊ถŒํ•œ์„ ๋ถ„๋ฆฌํ•œ๋‹ค. ์‹œ์Šคํ…œ ์ฝœ์€ ์œ ์ €๋ชจ๋“œ์—์„œ ์‹œ์Šคํ…œ์—๊ฒŒ ์ปค๋„ ๋ชจ๋“œ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘๋“ค์„ ์š”์ฒญํ•˜๋Š” ๋™์ž‘์ด๋‹ค. ์œ ์ €๊ฐ€ ์‹œ์Šคํ…œ ์ฝœ์„ ํ˜ธ์ถœํ•˜๋ฉด ์ปค๋„์€ ์ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์œ ์ €์—๊ฒŒ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋ ˆ์ง€์Šคํ„ฐ ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ x86-64 ์•„ํ‚คํ…์ฒ˜ ๋ ˆ์ง€์Šคํ„ฐ ์ฐธ์กฐ r0 ~ r15๊นŒ์ง€ ์กด์žฌํ•˜๋ฉฐ, r0 ~ r7 ๊นŒ์ง€๋Š” ์ด๋ฆ„์ด ๋ถ™๊ณ , r8๋ถ€ํ„ฐ r15๊นŒ์ง€๋Š” ์ˆซ์ž๋กœ ๋ถ€๋ฅธ๋‹ค. rax : (Extended Accumulator Register) ์‚ฌ์น™์—ฐ์‚ฐ์—์„œ ์ž๋™์œผ๋กœ ํ”ผ์—ฐ์‚ฐ์ž์˜ ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ๋…ผ๋ฆฌ ์—ฐ์‚ฐ(๋ง์…ˆ, ๋บ„์…ˆ ๋“ฑ)์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ์ €์žฅ๋œ๋‹ค. ํ”ผ์—ฐ์‚ฐ์ž์™€ ๋ณ„๊ฐœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์‹œ์Šคํ…œ ์ฝœ์˜ ์‹ค์งˆ์ ์ธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€๋ฆฌํ‚ด ์‹œ์Šคํ…œ ์ฝœ์˜ ๋ฐ˜ํ™˜๊ฐ’๋„ rax์— ์ €์žฅ๋จ x64๊ตฌ์กฐ์—์„œ rax ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” eax ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ax : eax๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ์ด์ „, CPU์˜ word๊ฐ€ 16bit ์ผ ๋•Œ ์‚ฌ์šฉ๋˜๋˜ ๋ ˆ์ง€์Šคํ„ฐ ํฐ ์˜๋ฏธ๋Š” ์—†์ง€๋งŒ ๊ด€์Šต์ฒ˜๋Ÿผ ์‚ฌ์šฉ๋˜๋ฉฐ eax์—์„œ ํ•˜์œ„ 2byte๋ฅผ ์ž๋ฅธ ๊ฐ’์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ax ๋Š” ๋‹ค์‹œ ah์™€ al๋กœ ํ•œ byte์”ฉ ๋‚˜๋‰œ๋‹ค. ah : ax์—์„œ ์ƒ์œ„ 1byte al : ax์—์„œ ํ•˜์œ„ 1byte byte_8 byte_7 byte_6 byte_5 byte_4 byte_3 byte_2 byte_1 rax_8 rax_7 rax_6 rax_5 rax_4 rax_3 rax_2 rax_1 - - - - eax_4 eax_3 eax_2 eax_1 - - - - - - - ax_2 - - - - - - - ah rbx(ebx) : (Extended Base register)๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ rcx(ecx) : (Extended Counter Register)CPU loop counter rdx(edx) : ์‹œ์Šคํ…œ ์ฝœ ์‹คํ–‰ ์‹œ ์„ธ ๋ฒˆ์งธ ์ธ์ž์˜ ์ฃผ์†Œ / (Extended Data Register) rsi : ์‹œ์Šคํ…œ ์ฝœ ์‹คํ–‰์‹œ ๋‘ ๋ฒˆ์งธ ์ธ์ž์˜ ์ฃผ์†Œ / (source index) ๋ฐ์ดํ„ฐ ์ด๋™์‹œ ์›๋ณธ์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ x64๊ตฌ์กฐ์—์„œ rsi ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” esi ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. rdi : ํ•จ์ˆ˜ ์‹คํ–‰์‹œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ์ฃผ์†Œ / ์‹œ์Šคํ…œ ์ฝœ ์‹คํ–‰์‹œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ์ฃผ์†Œ / (destination index) ๋ฐ์ดํ„ฐ ์ด๋™์‹œ ๋ชฉ์ ์ง€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ x64๊ตฌ์กฐ์—์„œ rdi ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” edi ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. rbp : (Base Register Pointer)์Šคํƒ ๋ณต๊ท€ ์ฃผ์†Œ rbp ์ฃผ์†Œ์—๋Š” ํ•จ์ˆ˜๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ  ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ํ•จ์ˆ˜(caller) ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์œผ๋กœ rbp๋ฅผ ์ด๋™ํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์†Œ SFP(Stack Frame Pointer) ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ํ˜ธ์ถœ์ž(caller)์˜ SFP๋ฅผ stack์— ๋„ฃ๊ณ , ์‹คํ–‰๋œ ํ•จ์ˆ˜๊ฐ€ ๋๋‚  ๋•Œ ์ด๋ฅผ popํ•˜์—ฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ์ฝ”๋“œ ๋ผ์ธ์œผ๋กœ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๋งˆ๋‹ค push rbp ์ฝ”๋“œ๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. x64๊ตฌ์กฐ์—์„œ rbp ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” ebp ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ebp : ์Šคํƒ ํ”„๋ ˆ์ž„ ์ตœํ•˜๋‹จ์˜ ์ฃผ์†Œ๊ฐ’ (Base pointer register) x86์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ’์œผ๋กœ, x64์—์„œ๋Š” rbp๋กœ ๋Œ€์ฒด๋œ๋‹ค. ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๊ฒฝ์šฐ, EBP ๊ฐ’์ด ์Šคํƒ์— push๋˜์–ด, ์ด์ „ ํ•จ์ˆ˜์˜ EBP๊ฐ’์ด ์Šคํƒ์— ์Œ“์ด๊ฒŒ ๋œ๋‹ค. rsp : ์Šคํƒ์˜ ์ตœ์ƒ๋‹จ์˜ ์ฃผ์†Œ x64๊ตฌ์กฐ์—์„œ rsp ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” esp ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. esp : ์Šคํƒ ์ตœ์ƒ๋‹จ์˜ ์ฃผ์†Œ๊ฐ’ (Stack pointer register) PUSH, POP, SUB, CALL ๋ช…๋ น์„ ์ˆ˜ํ–‰ ํ•  ๋•Œ ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค. PUSH, POP ์˜ ๊ธฐ์ค€์ด ๋˜๋Š” ํฌ์ธํ„ฐ์ด๋‹ค. r8 ~ r15๊นŒ์ง€๋Š” ๋”ฐ๋กœ ๋ช…์นญ์ด ์—†๋‹ค. ๊ฐ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ 64๋น„ํŠธ ์ผ๋•Œ ํ•˜์œ„ 32๋น„ํŠธ(=32bit ์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ช…์นญ), ํ•˜์œ„ 16bit, ํ•˜์œ„ 8bit ๋ฅผ ์นญํ•˜๋Š” ๋ช…์นญ์ด ๊ฐ๊ฐ ์กด์žฌํ•œ๋‹ค. 64๋น„ํŠธ ํ•˜์œ„32๋น„ํŠธ ํ•˜์œ„16๋น„ํŠธ ํ•˜์œ„8๋น„ํŠธ rax eax ax al rbx ebx bx bl rcx ecx cx cl rdx edx dx dl rsi esi si sil rdi edi di dil rbp ebp bp bpl rsp esp sp spl r8 r8d r8w r8b r9 r9d r9w r9b โ€ฆ โ€ฆ โ€ฆ โ€ฆ r15 r15d r15w r15b ์„ธ๊ทธ๋จผํŠธ ๋ ˆ์ง€์Šคํ„ฐ cs, ss, ds, es, fs, gs cs : code segment ds : data segment es : extra segment fs, gs : ์•ž์„  ์„ธ ๊ฐœ์˜ segment๋ฅผ ๋งŒ๋“ค๊ณ  ์—ฌ์œ ๋ถ„ ๋‘๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•œ ๊ฒƒ. cs/ds/es๋Š” CPU๊ฐ€ ๋ช…ํ™•ํ•œ ์‚ฌ์šฉ ์šฉ๋„๋ฅผ ๊ฐ€์ง€๋Š” ๋ฐ˜๋ฉด fs/gs๋Š” ์ •ํ•ด์ง„ ์šฉ๋„๊ฐ€ ์—†์–ด OS๊ฐ€ ์ž„์˜๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” fs segment register๋ฅผ Thread Local Storage(TLS) ์˜ ํฌ์ธํ„ฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ๋ช…๋ น์–ด ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ Instruction Pointer Register, IP rip : ํ˜„์žฌ ๋ช…๋ น ์‹คํ–‰ ์ฃผ์†Œ x64๊ตฌ์กฐ์—์„œ rip ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , x86๊ตฌ์กฐ์—์„œ๋Š” eip ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ ๋ ˆ์ง€์Šคํ„ฐ CF(Carry Flag) : ๋ถ€ํ˜ธ ์—†๋Š” ์ˆ˜์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋น„ํŠธ์˜ ๋ฒ”์œ„๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ 1๋กœ ์„ธํŒ… ZF(Zero Flag) : ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ 0์ผ ๊ฒฝ์šฐ 1๋กœ ์„ธํŒ… SF(Sign Flag) : ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์Œ์ˆ˜์ผ ๊ฒฝ์šฐ 1๋กœ ์„ธํŒ… OF(Overflow Flag) : ๋ถ€ํ˜ธ ์žˆ๋Š” ์ˆ˜์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ€ ๋น„ํŠธ ๋ฒ”์œ„๋ฅผ ๋„˜์„ ๊ฒฝ์šฐ 1๋กœ ์„ธํŒ… ํ”„๋กœ์‹œ์ € ํŠน์ • ์ฃผ์†Œ์˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค. ํ”„๋กœ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง€๊ณ , ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค. Section object ํŒŒ์ผ ์•ˆ์—์„œ ์žฌ๋ฐฐ์น˜ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ฅผ ์„น์…˜(section) ์ด๋ผ ํ•œ๋‹ค. objdump -h ๋กœ ๋ชฉ์ ํŒŒ์ผ์˜ Section์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šคํƒํ”„๋ ˆ์ž„ ๊ฐ ํ•จ์ˆ˜๋“ค์€ ์‹คํ–‰๋˜๋ฉด์„œ ์ง€์—ญ๋ณ€์ˆ˜์™€ ์ž„์‹œ ๊ฐ’๋“ค์„ ์ €์žฅํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๊ฐ’๋“ค์€ ์Šคํƒ ์˜์—ญ์— ์ €์žฅ๋œ๋‹ค. ...

<span title='2024-02-21 20:10:48 +0900 KST'>February 21, 2024</span>&nbsp;ยท&nbsp;8 min&nbsp;ยท&nbsp;AswinBlue