-
๐ง ๊ธฐ๊ณ์์ค ์ฝ๋
-
๐ง ์ด์ ๋ธ๋ฆฌ์ด
-
โญ๏ธ ์ฝ๋ ์์
-
๐ง ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๊ณต๋ถํ๊ธฐ ์ ์์๋๋ฉด ์ข์ ๊ฒ๋ค
-
โญ๏ธ RIP
-
โญ๏ธ ๋ฉ๋ชจ๋ฆฌ
-
๐ง x86-64์ ์ ์ ๋ ์ง์คํฐ
-
๐ง ์คํผ๋๋ ์๋ณ์
-
๐ง ๋ฐ์ดํฐ ์ด๋ ์ธ์คํธ๋ญ์ - MOV
-
๐ง ์คํ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ์ถ์ถ - push, pop
-
๐ง ์ ํจ์ฃผ์ ์ ์ฌ - Load Effective Address
-
๐ง ์ฐ์ ์ฐ์ฐ ๋ช ๋ น์ด
-
โญ๏ธ 2 ์คํผ๋๋ ๋ช ๋ น์ด
-
โญ๏ธ 1 ์คํผ๋๋ ๋ช ๋ น์ด
-
๐ง ๊ธฐ๊ณ์์ค ์ฝ๋
ํ๋์ ๊ธฐ๊ณ์ด ์ธ์คํธ๋ญ์ ์ ๋งค์ฐ ๊ธฐ์ด์ ์ธ ๋์๋ง์ ์ํํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ ์ง์คํฐ๋ค์ ์ ์ฅ๋ ๋ ๊ฐ์ ์๋ฅผ ๋ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๋ ์ง์คํฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ฑฐ๋, ์๋ก์ด ์ธ์คํธ๋ญ์ ์ฃผ์๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๊ธฐํ๋ ๋ฑ์ ๋์์ ์ํํฉ๋๋ค.
์ปดํ์ผ๋ฌ๋ ์ผ๋ จ์ ์ธ์คํธ๋ญ์ ์ ์์ฑํด์ ์ฐ์ ์ฐ์ฐ์์ ๊ณ์ฐ, ๋ฐ๋ณต๋ฌธ ํ๋ก์์ ํธ์ถ๊ณผ ๋ฆฌํด ๋ฑ์ ํ๋ก๊ทธ๋จ ๊ตฌ๋ฌธ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๐ง ์ด์ ๋ธ๋ฆฌ์ด
๊ธฐ๊ณ์ด์ 1๋1 ๋์๊ด๊ณ๋ฅผ ๊ฐ๋ ๋ช ๋ น์ด๋ก ์ด๋ฃจ์ด์ง low-level ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค.
โญ๏ธ ์ฝ๋ ์์
long plus(long x, long y);
void sumstore(long x, long y, long * dest) {
long t = plus(x, y);
*dest = t;
}
์์ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
sumstore:
pushq %rbx
movq %rdx, %rbx
call plus
movq %rax, (%rbx)
popq %rbx
ret
๐ง ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๊ณต๋ถํ๊ธฐ ์ ์์๋๋ฉด ์ข์ ๊ฒ๋ค
โญ๏ธ RIP
RIP(EIP)๋ Instruction Pointer ์ ๋๋ค.
์ฆ ๋ค์ ์ธ์คํธ๋ญ์ ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
โญ๏ธ ๋ฉ๋ชจ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ์ ๋ฐฐ์ด์ ๋๋ค.
์ฃผ์์ ๊ธฐ๋ณธ ๋จ์๋ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์๋ ์ธ์คํธ๋ญ์ ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์์ผ๋ฉฐ, ์คํ๊ณผ ํ ๋ฑ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ ์ ์์ต๋๋ค.
๐ง x86-64์ ์ ์ ๋ ์ง์คํฐ
x86-64์ CPU๋ 64๋นํธ ๊ฐ์ ์ ์ฅํ ์ ์๋ 16๊ฐ์ ๋ ์ง์คํฐ๊ฐ ์กด์ฌํฉ๋๋ค.
์ด๋ค์ ์ ์ ๋ฐ์ดํฐ์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
์ด 16๊ฐ์ ๋ ์ง์คํฐ๋ ๋ชจ๋ %r๋ก ์์ํ๋ ์ด๋ฆ์ ๊ฐ์ง๋๋ค.
์ ์ฌ์ง์ ๋ณด๋ฉด %rXX ๋ ์ง์คํฐ์ ์ ๋ฐ์ ํฌ๊ธฐ์ ๋ํ์ฌ %eXX๋ผ๋ ์ด๋ฆ์ด ๋ถ์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
%eXX๋ %rXX์ ํ์ 4๋ฐ์ดํธ์ ํด๋นํฉ๋๋ค.
4๋ฐ์ดํธ๋ฟ๋ง ์๋๋ผ 2๋ฐ์ดํธ, 1๋ฐ์ดํธ์ ๊ฐ๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด๋ ์์ ์๋ 1๋ฐ์ดํธ ๋จ์๋ก ์ ๊ทผํ์๋ ๊ฒ์ด, ๊ธฐ์ ์ด ๋ฐ์ ํ๋ฉฐ 2๋ฐ์ดํธ, 4๋ฐ์ดํธ, 8๋ฐ์ดํธ ๋จ์๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ฉฐ ๋ ์ง์คํฐ์ ์ด๋ฆ์ด ๋ฐ๋์์ง๋ง, ํ์ ํธ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ณผ๊ฑฐ์ ๋ ์ง์คํฐ๋ค์ ์ด๋ฆ์ด ๋จ์์๋ ๊ฒ์ ๋๋ค.
์ ์ฒด 16๊ฐ์ ๋ ์ง์คํฐ์ ํ์ ๋ฐ์ดํธ๋ค์ ๋ฐ์ดํธ, ์๋(16๋นํธ), ๋๋ธ์๋(32๋นํธ), ์ฟผ๋์๋(64๋นํธ)์ฉ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ ๋ ์ง์คํฐ๋ค ์ค ์คํ ํฌ์ธํฐ ๋ ์ง์คํฐ(%rsp)๋ ๋ฐํ์ ์คํ์ ๋ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ผ๋ถ ์ธ์คํธ๋ญ์ ๋ค์ ํน๋ณํ ํด๋น ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ณ ์ฌ์ฉํ๋ฉฐ, ๋ค๋ฅธ ๋ ์ง์คํฐ๋ ์ด์ ๋นํด ์ฌ์ฉ์ด ์ข ๋ ์์ ๋กญ์ต๋๋ค.
๐ง ์คํผ๋๋ ์๋ณ์
๋๋ถ๋ถ์ ์ธ์คํธ๋ญ์ ์ ํ๋ ์ด์์ ์คํผ๋๋(ํผ์ฐ์ฐ์)๋ฅผ ๊ฐ์ง๋๋ค.
์คํผ๋๋๋ ์ฐ์ฐ์ ์ํํ ์์ค(Source)๊ฐ๊ณผ, ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ชฉ์ ์ง(Destination)์ ์์น๋ฅผ ๋ช ์ํฉ๋๋ค.
x86-64๋ ์ฌ๋ฌ๊ฐ์ง ์คํผ๋๋์ ํํ๋ฅผ ์ง์ํฉ๋๋ค.
์์ค ๊ฐ์ผ๋ก๋ ์์, ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ ์์ผ๋ฉฐ,
๋ชฉ์ ์ง์๋ ๋ ์ง์คํฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ ์ ์์ต๋๋ค.
Type | Form | Operand Value | Name |
Immediate | $Imm | $Imm$ | Immediate |
Register | $r_a$ | $R[r_a]$ | Register |
Memory | $Imm$ | $M[Imm]$ | Absolute |
Memory | $(r_a)$ | $M[R[r_a]]$ | Indirect |
Memory | $Imm((r_b))$ | $M[R[r_b] + Imm]$ | Base + Displayment |
Memory | $(r_b, r_i)$ | $M[R[r_b] + R[r_i]]$ | Indexed |
Memory | $Imm(r_b, r_i)$ | $M[R[r_b] + R[r_i] + Imm]$ | Indexed |
Memory | $(, r_i, s)$ | $M[R[r_i] \times s]$ | Scaled indexed |
Memory | $Imm(, r_i, s)$ | $M[R[r_i] \times s + Imm]$ | Scaled indexed |
Memory | $(r_b, r_i, s)$ | $M[R[r_b] + R[r_i] \times s ]$ | Scaled indexed |
Memory | $Imm(r_b, r_i, s)$ | $M[R[r_b] + R[r_i] \times s + Imm]$ | Scaled indexed |
๐ง ๋ฐ์ดํฐ ์ด๋ ์ธ์คํธ๋ญ์ - MOV
movq S, D
S์ ๊ฐ์ D์ ๋ณต์ฌํ๋ ๋ช ๋ น์ด์ ๋๋ค.
์ฃผ์ํ ์ฌํญ์ผ๋ก๋ ๋ชฉ์ ์ง์๋ ์์๊ฐ ์ฌ ์ ์๋ค๋ ๊ฒ๊ณผ,
๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ก์ ๋ฐ์ดํฐ ์ฐ์ฐ์ ํ ๊ฐ์ ๋ช ๋ น์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค.
(์์ค์ ๋ชฉ์ ์ง์ ๋์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ ์ ์์)
์์๋ ์๋์ ๊ฐ์ต๋๋ค.
void swap(long *xp, long *yp) {
long t0 = *xp;
long t1 = *yp;
*xp = t1;
*yp = t0;
}
์ ์ฝ๋๋ ๋ ๋ณ์์ ๊ฐ์ ๋ฐ๊พธ์ด์ฃผ๋ ํจ์๋ก์จ, ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
swap:
movq (%rdi), %rax # t0 = *xp
movq (%rsi), %rdx # t1 = *yp
movq %rdx, (%rdi) # *xp = t1
movq %rax, (%rsi) # *yp = t0
ret
(%rdi)๋ *xp์,
(%rsi)๋ *yp์,
%rax๋ t0์,
%rdx๋ t1์ ๋์๋ฉ๋๋ค.
๐ง ์คํ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ์ถ์ถ - push, pop
์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ(push)ํ๊ฑฐ๋, ์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ(pop)ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ์์๋ณป๋ก ํ๊ฒ ์ต๋๋ค.
๋์ค์ ์์๋ณด๊ฒ ๋๊ฒ ์ง๋ง, (ํน์ ์ด๋ฏธ ์์ค์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง) ์คํ์ ํ๋ก์์ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
x86-64์์ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์์ญ์ ์์นํฉ๋๋ค.
์คํ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์ฑ์ฅํ๋ฏ๋ก, ์คํ์ top ์์(๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ์์)๊ฐ ๋ชจ๋ ์คํ ์์ ์ค์์ ๊ฐ์ฅ ๋ฎ์ ์ฃผ์๋ฅผ ๊ฐ์ต๋๋ค.
์คํ ํฌ์ธํฐ %rsp๋ ์คํ ๋งจ ์ ์์์ ์ฃผ์๋ฅผ ์ ์ฅํฉ๋๋ค.
pushq ์ธ์คํธ๋ญ์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , popq ์ธ์คํธ๋ญ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
์ ๋ ์ธ์คํธ๋ญ์ ์ ๋จ ํ๋์ ์คํผ๋๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
(์คํ์ ์ถ๊ฐํ ์์ค ๋ฐ์ดํฐ / ์คํ์์ ๊ฐ์ ์ถ์ถํ์ฌ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๋ชฉ์ ์ง)
์ฟผ๋์๋ ๊ฐ์ ์คํ์ ์ถ๊ฐํ๋ ค๋ฉด, ๋จผ์ ์คํ ํฌ์ธํฐ๋ฅผ 8 ๊ฐ์์ํค๊ณ , ๊ทธ ๊ฐ์ ์คํ ์ฃผ์์ ์๋ก์ด top์ ์ ์ฅํ์ฌ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ pushq %rbp ์ธ์คํธ๋ญ์ ์ ๋์์ ๋ค์ ๋ ์ธ์คํธ๋ญ์ ์๊ณผ ๋์ผํฉ๋๋ค.
subq $8, %rsp
movq %rbp, (%rsp)
์์ ๋ ๊ฐ์ ์ธ์คํธ๋ญ์ ์ ์คํํ๊ธฐ ์ํด์๋ ์ด 8๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ pushq ์ธ์คํธ๋ญ์ ์ ์ฌ์ฉํ๋ฉด 1 ๋ฐ์ดํธ๋ง ์ฌ์ฉํ์ฌ ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋์๋๋ฅผ pop ํ๋ ๊ฒ์ ์คํ top ์์น์์์ ์ฝ๊ธฐ ์์ ํ์ ์คํ ํฌ์ธํฐ๋ฅผ 8 ์ฆ๊ฐ์ํค๋ ๊ฒ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
๋ฐ๋ผ์ popq %rax ์ธ์คํธ๋ญ์ ์ ๋์์ ๋ค์ ๋ ์ธ์คํฐ๋ญ์ ์๊ณผ ๋์ผํฉ๋๋ค.
movq (%rsp), %rax
addq $8, %rsp
๐ง ์ ํจ์ฃผ์ ์ ์ฌ - Load Effective Address
์ ํจ์ฃผ์ ์ ์ฌ ์ธ์คํธ๋ญ์ ์ธ leaq๋ movq ์ธ์คํธ๋ญ์ ์ ๋ณํ์ ๋๋ค.
์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ง์คํฐ๋ก ์ฝ์ด๋ค์ด๋ ์ธ์คํธ๋ญ์ ์ ํํ๋ฅผ ๊ฐ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ํ ์ฐธ์กฐํ์ง ์์ต๋๋ค.
leaq S, D์ ํํ๋ก ์ฌ์ฉ๋๋ฉฐ, S์๋ ์ฃผ์ ๋ชจ๋ ์์์ด, D์๋ ์์์ผ๋ก ํํ๋ ์ฃผ์๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
long m12(long x) {
return x * 12;
}
์๋ฅผ ๋ค์ด ์์ c ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ฒ์ญ๋ฉ๋๋ค.
leaq (%rdi, %rdi, 2), %rax # t <- x + x * 2
salq $2, %rax # return t << 2
์ ๋ leaq๊ฐ ์ด๋ป๊ฒ ์ฐ์ ์ฐ์ฐ์ ์ฐ์ผ ์ ์๋์ง ์ดํด๊ฐ ๋์ง ์์์๋๋ฐ, ์กฐ๊ธ ์๊ฐํด๋ณด๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
๋ ์ง์คํฐ์ ๋ค์ด์๋ ๊ฐ์ ๋จ์ํ ๊ฐ ์์ฒด์ผ์๋ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ผ์๋ ์์ต๋๋ค.
&x ๋ผ๋ ์ฐ์ฐ์ x์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ์ธ๋ฐ,
์ด๋ฅผ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์๊ฐํ๋ฉด x๋ผ๋ ๋ ์ง์คํฐ์ ๋ค์ด์๋ ๊ฐ์ ๋ฐํํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ฆ x์ ๋ค์ด์๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ์๋ ์ผ๋ฐ ๋ณ์์ ๊ฐ์ธ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ ์ฃผ์์ฐ์ฐ์์ ํตํ ์ฐ์ฐ์ ํตํด ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ ์ง์คํฐ %rdi๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 0x00000004์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋ฉด
leaq 4(%rdi) ๋ 0x00000008์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ๋ฐํํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ %rdi๊ฐ ๊ฐ์ง ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์๋ ์ ์๊ฐ 0x00000004์ธ ๊ฒฝ์ฐ
leaq 4(%rdi) ๋ 0x00000008์ด๋ผ๋ ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ ๊ฒ์ ๋๋ค.
leaq๋ ๋จ์ง ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ํ์ฌ ์ฃผ์๋ชจ๋ ์์์ ํตํด ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์์๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์๋ ๋ ๋ช ๋ น์ ๋์ผํ ๋ช ๋ น์ ๋๋ค.
leaq 0x4(%rax), %rax
add 0x4, %rax
๐ง ์ฐ์ ์ฐ์ฐ ๋ช ๋ น์ด
โญ๏ธ 2 ์คํผ๋๋ ๋ช ๋ น์ด
โญ๏ธ 1 ์คํผ๋๋ ๋ช ๋ น์ด
'๐ฅ Computer Science > ์์คํ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[3] - ๋ฐ๋ณต๋ฌธ (0) | 2022.10.13 |
---|---|
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[2] - ์กฐ๊ฑด๋ฌธ (2) | 2022.10.12 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] - 2022๋ ๋ Datalab (0) | 2022.10.04 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์์์ ํํ (๋ถ๋์์์ ) (0) | 2022.10.02 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ ์์ ํํ (0) | 2022.09.17 |
๐ง ๊ธฐ๊ณ์์ค ์ฝ๋
ํ๋์ ๊ธฐ๊ณ์ด ์ธ์คํธ๋ญ์ ์ ๋งค์ฐ ๊ธฐ์ด์ ์ธ ๋์๋ง์ ์ํํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ ์ง์คํฐ๋ค์ ์ ์ฅ๋ ๋ ๊ฐ์ ์๋ฅผ ๋ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ์ ๋ ์ง์คํฐ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๊ฑฐ๋, ์๋ก์ด ์ธ์คํธ๋ญ์ ์ฃผ์๋ก ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๊ธฐํ๋ ๋ฑ์ ๋์์ ์ํํฉ๋๋ค.
์ปดํ์ผ๋ฌ๋ ์ผ๋ จ์ ์ธ์คํธ๋ญ์ ์ ์์ฑํด์ ์ฐ์ ์ฐ์ฐ์์ ๊ณ์ฐ, ๋ฐ๋ณต๋ฌธ ํ๋ก์์ ํธ์ถ๊ณผ ๋ฆฌํด ๋ฑ์ ํ๋ก๊ทธ๋จ ๊ตฌ๋ฌธ์ ๊ตฌํํด์ผ ํฉ๋๋ค.
๐ง ์ด์ ๋ธ๋ฆฌ์ด
๊ธฐ๊ณ์ด์ 1๋1 ๋์๊ด๊ณ๋ฅผ ๊ฐ๋ ๋ช ๋ น์ด๋ก ์ด๋ฃจ์ด์ง low-level ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋๋ค.
โญ๏ธ ์ฝ๋ ์์
long plus(long x, long y);
void sumstore(long x, long y, long * dest) {
long t = plus(x, y);
*dest = t;
}
์์ ์ฝ๋๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
sumstore:
pushq %rbx
movq %rdx, %rbx
call plus
movq %rax, (%rbx)
popq %rbx
ret
๐ง ์ด์ ๋ธ๋ฆฌ์ด๋ฅผ ๊ณต๋ถํ๊ธฐ ์ ์์๋๋ฉด ์ข์ ๊ฒ๋ค
โญ๏ธ RIP
RIP(EIP)๋ Instruction Pointer ์ ๋๋ค.
์ฆ ๋ค์ ์ธ์คํธ๋ญ์ ์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
โญ๏ธ ๋ฉ๋ชจ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ์ ๋ฐฐ์ด์ ๋๋ค.
์ฃผ์์ ๊ธฐ๋ณธ ๋จ์๋ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ์๋ ์ธ์คํธ๋ญ์ ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์์ผ๋ฉฐ, ์คํ๊ณผ ํ ๋ฑ์ ์์ญ์ผ๋ก ๊ตฌ๋ถ๋ ์ ์์ต๋๋ค.
๐ง x86-64์ ์ ์ ๋ ์ง์คํฐ
x86-64์ CPU๋ 64๋นํธ ๊ฐ์ ์ ์ฅํ ์ ์๋ 16๊ฐ์ ๋ ์ง์คํฐ๊ฐ ์กด์ฌํฉ๋๋ค.
์ด๋ค์ ์ ์ ๋ฐ์ดํฐ์ ํฌ์ธํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
์ด 16๊ฐ์ ๋ ์ง์คํฐ๋ ๋ชจ๋ %r๋ก ์์ํ๋ ์ด๋ฆ์ ๊ฐ์ง๋๋ค.
์ ์ฌ์ง์ ๋ณด๋ฉด %rXX ๋ ์ง์คํฐ์ ์ ๋ฐ์ ํฌ๊ธฐ์ ๋ํ์ฌ %eXX๋ผ๋ ์ด๋ฆ์ด ๋ถ์ด์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
%eXX๋ %rXX์ ํ์ 4๋ฐ์ดํธ์ ํด๋นํฉ๋๋ค.
4๋ฐ์ดํธ๋ฟ๋ง ์๋๋ผ 2๋ฐ์ดํธ, 1๋ฐ์ดํธ์ ๊ฐ๊ฐ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ด๋ ์์ ์๋ 1๋ฐ์ดํธ ๋จ์๋ก ์ ๊ทผํ์๋ ๊ฒ์ด, ๊ธฐ์ ์ด ๋ฐ์ ํ๋ฉฐ 2๋ฐ์ดํธ, 4๋ฐ์ดํธ, 8๋ฐ์ดํธ ๋จ์๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋ฉฐ ๋ ์ง์คํฐ์ ์ด๋ฆ์ด ๋ฐ๋์์ง๋ง, ํ์ ํธ์์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ณผ๊ฑฐ์ ๋ ์ง์คํฐ๋ค์ ์ด๋ฆ์ด ๋จ์์๋ ๊ฒ์ ๋๋ค.
์ ์ฒด 16๊ฐ์ ๋ ์ง์คํฐ์ ํ์ ๋ฐ์ดํธ๋ค์ ๋ฐ์ดํธ, ์๋(16๋นํธ), ๋๋ธ์๋(32๋นํธ), ์ฟผ๋์๋(64๋นํธ)์ฉ ์ ๊ทผํ ์ ์์ต๋๋ค.
์ ๋ ์ง์คํฐ๋ค ์ค ์คํ ํฌ์ธํฐ ๋ ์ง์คํฐ(%rsp)๋ ๋ฐํ์ ์คํ์ ๋ ๋ถ๋ถ์ ๊ฐ๋ฆฌํค๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
์ผ๋ถ ์ธ์คํธ๋ญ์ ๋ค์ ํน๋ณํ ํด๋น ๋ ์ง์คํฐ๋ฅผ ์ฝ๊ณ ์ฌ์ฉํ๋ฉฐ, ๋ค๋ฅธ ๋ ์ง์คํฐ๋ ์ด์ ๋นํด ์ฌ์ฉ์ด ์ข ๋ ์์ ๋กญ์ต๋๋ค.
๐ง ์คํผ๋๋ ์๋ณ์
๋๋ถ๋ถ์ ์ธ์คํธ๋ญ์ ์ ํ๋ ์ด์์ ์คํผ๋๋(ํผ์ฐ์ฐ์)๋ฅผ ๊ฐ์ง๋๋ค.
์คํผ๋๋๋ ์ฐ์ฐ์ ์ํํ ์์ค(Source)๊ฐ๊ณผ, ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ชฉ์ ์ง(Destination)์ ์์น๋ฅผ ๋ช ์ํฉ๋๋ค.
x86-64๋ ์ฌ๋ฌ๊ฐ์ง ์คํผ๋๋์ ํํ๋ฅผ ์ง์ํฉ๋๋ค.
์์ค ๊ฐ์ผ๋ก๋ ์์, ๋ ์ง์คํฐ, ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ ์์ผ๋ฉฐ,
๋ชฉ์ ์ง์๋ ๋ ์ง์คํฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ ์ ์์ต๋๋ค.
Type | Form | Operand Value | Name |
Immediate | $Imm | $Imm$ | Immediate |
Register | $r_a$ | $R[r_a]$ | Register |
Memory | $Imm$ | $M[Imm]$ | Absolute |
Memory | $(r_a)$ | $M[R[r_a]]$ | Indirect |
Memory | $Imm((r_b))$ | $M[R[r_b] + Imm]$ | Base + Displayment |
Memory | $(r_b, r_i)$ | $M[R[r_b] + R[r_i]]$ | Indexed |
Memory | $Imm(r_b, r_i)$ | $M[R[r_b] + R[r_i] + Imm]$ | Indexed |
Memory | $(, r_i, s)$ | $M[R[r_i] \times s]$ | Scaled indexed |
Memory | $Imm(, r_i, s)$ | $M[R[r_i] \times s + Imm]$ | Scaled indexed |
Memory | $(r_b, r_i, s)$ | $M[R[r_b] + R[r_i] \times s ]$ | Scaled indexed |
Memory | $Imm(r_b, r_i, s)$ | $M[R[r_b] + R[r_i] \times s + Imm]$ | Scaled indexed |
๐ง ๋ฐ์ดํฐ ์ด๋ ์ธ์คํธ๋ญ์ - MOV
movq S, D
S์ ๊ฐ์ D์ ๋ณต์ฌํ๋ ๋ช ๋ น์ด์ ๋๋ค.
์ฃผ์ํ ์ฌํญ์ผ๋ก๋ ๋ชฉ์ ์ง์๋ ์์๊ฐ ์ฌ ์ ์๋ค๋ ๊ฒ๊ณผ,
๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๋ฉ๋ชจ๋ฆฌ๋ก์ ๋ฐ์ดํฐ ์ฐ์ฐ์ ํ ๊ฐ์ ๋ช ๋ น์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค.
(์์ค์ ๋ชฉ์ ์ง์ ๋์์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ ์ ์์)
์์๋ ์๋์ ๊ฐ์ต๋๋ค.
void swap(long *xp, long *yp) {
long t0 = *xp;
long t1 = *yp;
*xp = t1;
*yp = t0;
}
์ ์ฝ๋๋ ๋ ๋ณ์์ ๊ฐ์ ๋ฐ๊พธ์ด์ฃผ๋ ํจ์๋ก์จ, ์ด๋ฅผ ์ด์ ๋ธ๋ฆฌ์ด๋ก ๋ฒ์ญํ๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
swap:
movq (%rdi), %rax # t0 = *xp
movq (%rsi), %rdx # t1 = *yp
movq %rdx, (%rdi) # *xp = t1
movq %rax, (%rsi) # *yp = t0
ret
(%rdi)๋ *xp์,
(%rsi)๋ *yp์,
%rax๋ t0์,
%rdx๋ t1์ ๋์๋ฉ๋๋ค.
๐ง ์คํ ๋ฐ์ดํฐ์ ์ ์ฅ๊ณผ ์ถ์ถ - push, pop
์คํ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ(push)ํ๊ฑฐ๋, ์คํ์์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถ(pop)ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ช ๋ น์ด๋ฅผ ์์๋ณป๋ก ํ๊ฒ ์ต๋๋ค.
๋์ค์ ์์๋ณด๊ฒ ๋๊ฒ ์ง๋ง, (ํน์ ์ด๋ฏธ ์์ค์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง) ์คํ์ ํ๋ก์์ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค.
x86-64์์ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์์ญ์ ์์นํฉ๋๋ค.
์คํ์ ์๋ ๋ฐฉํฅ์ผ๋ก ์ฑ์ฅํ๋ฏ๋ก, ์คํ์ top ์์(๊ฐ์ฅ ์ต๊ทผ์ ์ ์ฅ๋ ์์)๊ฐ ๋ชจ๋ ์คํ ์์ ์ค์์ ๊ฐ์ฅ ๋ฎ์ ์ฃผ์๋ฅผ ๊ฐ์ต๋๋ค.
์คํ ํฌ์ธํฐ %rsp๋ ์คํ ๋งจ ์ ์์์ ์ฃผ์๋ฅผ ์ ์ฅํฉ๋๋ค.
pushq ์ธ์คํธ๋ญ์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , popq ์ธ์คํธ๋ญ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
์ ๋ ์ธ์คํธ๋ญ์ ์ ๋จ ํ๋์ ์คํผ๋๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
(์คํ์ ์ถ๊ฐํ ์์ค ๋ฐ์ดํฐ / ์คํ์์ ๊ฐ์ ์ถ์ถํ์ฌ ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ดํฐ ๋ชฉ์ ์ง)
์ฟผ๋์๋ ๊ฐ์ ์คํ์ ์ถ๊ฐํ๋ ค๋ฉด, ๋จผ์ ์คํ ํฌ์ธํฐ๋ฅผ 8 ๊ฐ์์ํค๊ณ , ๊ทธ ๊ฐ์ ์คํ ์ฃผ์์ ์๋ก์ด top์ ์ ์ฅํ์ฌ์ผ ํฉ๋๋ค.
๋ฐ๋ผ์ pushq %rbp ์ธ์คํธ๋ญ์ ์ ๋์์ ๋ค์ ๋ ์ธ์คํธ๋ญ์ ์๊ณผ ๋์ผํฉ๋๋ค.
subq $8, %rsp
movq %rbp, (%rsp)
์์ ๋ ๊ฐ์ ์ธ์คํธ๋ญ์ ์ ์คํํ๊ธฐ ์ํด์๋ ์ด 8๋ฐ์ดํธ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ pushq ์ธ์คํธ๋ญ์ ์ ์ฌ์ฉํ๋ฉด 1 ๋ฐ์ดํธ๋ง ์ฌ์ฉํ์ฌ ์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ต๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ฟผ๋์๋๋ฅผ pop ํ๋ ๊ฒ์ ์คํ top ์์น์์์ ์ฝ๊ธฐ ์์ ํ์ ์คํ ํฌ์ธํฐ๋ฅผ 8 ์ฆ๊ฐ์ํค๋ ๊ฒ์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.
๋ฐ๋ผ์ popq %rax ์ธ์คํธ๋ญ์ ์ ๋์์ ๋ค์ ๋ ์ธ์คํฐ๋ญ์ ์๊ณผ ๋์ผํฉ๋๋ค.
movq (%rsp), %rax
addq $8, %rsp
๐ง ์ ํจ์ฃผ์ ์ ์ฌ - Load Effective Address
์ ํจ์ฃผ์ ์ ์ฌ ์ธ์คํธ๋ญ์ ์ธ leaq๋ movq ์ธ์คํธ๋ญ์ ์ ๋ณํ์ ๋๋ค.
์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ ์ง์คํฐ๋ก ์ฝ์ด๋ค์ด๋ ์ธ์คํธ๋ญ์ ์ ํํ๋ฅผ ๊ฐ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ํ ์ฐธ์กฐํ์ง ์์ต๋๋ค.
leaq S, D์ ํํ๋ก ์ฌ์ฉ๋๋ฉฐ, S์๋ ์ฃผ์ ๋ชจ๋ ์์์ด, D์๋ ์์์ผ๋ก ํํ๋ ์ฃผ์๊ฐ์ด ์ ์ฅ๋ฉ๋๋ค.
long m12(long x) {
return x * 12;
}
์๋ฅผ ๋ค์ด ์์ c ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ฒ์ญ๋ฉ๋๋ค.
leaq (%rdi, %rdi, 2), %rax # t <- x + x * 2
salq $2, %rax # return t << 2
์ ๋ leaq๊ฐ ์ด๋ป๊ฒ ์ฐ์ ์ฐ์ฐ์ ์ฐ์ผ ์ ์๋์ง ์ดํด๊ฐ ๋์ง ์์์๋๋ฐ, ์กฐ๊ธ ์๊ฐํด๋ณด๋ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
๋ ์ง์คํฐ์ ๋ค์ด์๋ ๊ฐ์ ๋จ์ํ ๊ฐ ์์ฒด์ผ์๋ ์์ผ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์์ผ์๋ ์์ต๋๋ค.
&x ๋ผ๋ ์ฐ์ฐ์ x์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ์ธ๋ฐ,
์ด๋ฅผ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์๊ฐํ๋ฉด x๋ผ๋ ๋ ์ง์คํฐ์ ๋ค์ด์๋ ๊ฐ์ ๋ฐํํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ฆ x์ ๋ค์ด์๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ฃผ์๊ฐ ์๋ ์ผ๋ฐ ๋ณ์์ ๊ฐ์ธ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ ์ฃผ์์ฐ์ฐ์์ ํตํ ์ฐ์ฐ์ ํตํด ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ผ ์ ์๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ ์ง์คํฐ %rdi๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ 0x00000004์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ๋ฉด
leaq 4(%rdi) ๋ 0x00000008์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ๋ฐํํ ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ %rdi๊ฐ ๊ฐ์ง ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์๋ ์ ์๊ฐ 0x00000004์ธ ๊ฒฝ์ฐ
leaq 4(%rdi) ๋ 0x00000008์ด๋ผ๋ ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ ๊ฒ์ ๋๋ค.
leaq๋ ๋จ์ง ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ํ์ฌ ์ฃผ์๋ชจ๋ ์์์ ํตํด ๊ฐ๋จํ ์ฌ์น์ฐ์ฐ์ ์ํํ ์ ์๋ค๋ ๊ฒ์ ์์๊ฐ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ์๋ ๋ ๋ช ๋ น์ ๋์ผํ ๋ช ๋ น์ ๋๋ค.
leaq 0x4(%rax), %rax
add 0x4, %rax
๐ง ์ฐ์ ์ฐ์ฐ ๋ช ๋ น์ด
โญ๏ธ 2 ์คํผ๋๋ ๋ช ๋ น์ด
โญ๏ธ 1 ์คํผ๋๋ ๋ช ๋ น์ด
'๐ฅ Computer Science > ์์คํ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[3] - ๋ฐ๋ณต๋ฌธ (0) | 2022.10.13 |
---|---|
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ด์ ๋ธ๋ฆฌ์ด[2] - ์กฐ๊ฑด๋ฌธ (2) | 2022.10.12 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] - 2022๋ ๋ Datalab (0) | 2022.10.04 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์์์ ํํ (๋ถ๋์์์ ) (0) | 2022.10.02 |
[์์คํ ํ๋ก๊ทธ๋๋ฐ] ์ ์์ ํํ (0) | 2022.09.17 |