๐ ์์คํ ํ๋ก๊ทธ๋๋ฐ ์ค๊ฐ๊ณ ์ฌ ์ ๋ฆฌ
์ค๊ฐ๊ณ ์ฌ๋๋น
์กฑ๋ณด ๋ถ์
16๋
๊ธฐ๋ณธ์์(instruction step, ๋ ์ง์คํฐ, ์ธ์ ์ง์, ์คํ๋ฉ๋ชจ๋ฆฌ, ํ๋๊ทธ๋ ์ง์คํฐ, ์๋์)
๋ถ๋์์์ ๋ง๋ค๊ธฐ(s, E, M, exp, frac, %fํ์)
ํ๋ก์์ ์ธ์คํธ๋ญ์ (%rsp, %rip, %rax, %rsi, ํ๋ก์ฐ์ ๋ฐ์ดํฐ์ ๋ณด์กด, ๋น์ด์๋ ์ธ์คํธ๋ญ์ ์ฑ์ฐ๊ธฐ, ์คํ ๊ทธ๋ฆฌ๊ธฐ, ํด๋น ์ธ์คํธ๋ญ์ ์ด ํ์ํ ์ด์ )
๋ฃจํ ์ธ์คํธ๋ญ์ (C์ฝ๋ ๋ณํ forโwhile, whileโdowhile ๋ฑ, ๋ฐ๋ณต๋ฌธ if goto๋ฌธ์ผ๋ก ๋ฐ๊พธ๊ธฐ โ์ค๊ฐ์ผ๋ก์ ํโ, ๋น์ด์๋ ์ธ์คํธ๋ญ์ ์ฑ์ฐ๊ธฐ, โ์ค๊ฐ์ผ๋ก ์ ํโ ์ฌ์ฉํ๋ ์ด์ ์ค๋ช )
์ค์์น ์ธ์คํธ๋ญ์ (GDB/๋ฉ๋ชจ๋ฆฌ๋คํ๋ก switch๋ฌธ ์ถ์ ํ๊ธฐ)
๋ณด์์ทจ์ฝ์ฑ (์ด๋ค ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋๊ฐ)
14๋
๊ธฐ๋ณธ์์(instruction step, ์ค๋ฒํ๋ก์กฐ๊ฑด, ret์ ๋ฐ์ํ๋ ์ผ, if else๋ณด๋ค switch๊ฐ ์ ๋ฆฌํ์ ?, ๋ฆฌํ์๋์ ํ๋ณ๊ธฐ)
ํจํธ๋ฆฌ์ ๋ฏธ์ฌ์ผ ์์ (์ฑ ์์๋๊ฑฐ ๊ทธ๋๋ก + ์ธ์ ์ง์๋ก ๊ณ์ฐ์ ์ด๋ป๊ฒ๋๋)
swap ์ธ์คํธ๋ญ์ (C์ฝ๋๋ก ์ฑ์ฐ๊ธฐ, instruction์ผ๋ก ์ฑ์ฐ๊ธฐ)
2
CPU : ALU(arithmetic and logic unit)(execution), Control unit(decode), register(PC, ๋ฉ๋ชจ๋ฆฌ์ฃผ์/๋ฐ์ดํฐ, ๋ฒ์ฉ ๋ฑ), IO
๋ช ๋ น ์ฃผ๊ธฐ : fetch โ decode โ execution โ store
OS : HW๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋๋ก ๋์์ฃผ๋ system program. HW์ ์ถ์ํ. ํ๋ก์ธ์ค, ๋ฉ๋ชจ๋ฆฌ, ์ ์ถ๋ ฅ์ฅ์น , ์ํํธ์จ์ด์์
์ฑ๋ฅ๊ฐ์ , ์๋ฌ์ดํด๋ฅผ ์ํด ์ปดํ์ผ๊ณผ์ ์ ์๋๊ฒ์ด ์ข๋ค.
Computer = HW + SW(System SW, Application SW)
3
์์คํ ํ๋ก๊ทธ๋๋ฐ์์์ word = 32bit = 4byte
byte ordering ์ผ๋ก ์ธํด ์ฃผ์์ฒด๊ณ๋ word๊ธธ์ด๋งํผ ์ฆ๊ฐํ๋ค
ํ์โ์์์ฃผ์๋ก ๊ธฐ๋กํ๋ค.
big endian โ MSB๋ถํฐ LSB๋ก ๊ธฐ๋กํ๋ค. ๋ฎ์์ฃผ์์ ๋์์ฃผ์๋ถํฐ
little endian โ LSB๋ถํฐ MSB๋ก ๊ธฐ๋กํ๋ค. ๋ฎ์์ฃผ์์ ๋ฎ์์ฃผ์๋ถํฐ
ex) [MSB] 0x01234567 [LSB] big endian โ [ํ์] 01 23 45 67 [์์] little endian โ [ํ์] 67 45 23 01 [์์]
์๊ฐํด๋ด, ์คํ์ ๋์ ์ฃผ์์์ ๋ฎ์ ์ฃผ์๋ก ๋์ด๋. ๊ทธ๋ผ ์ฐ์ด๋๊ฑด ๋ฎ์์ฃผ์์์ ๋์์ฃผ์๋ก ์ฐ์ด๊ฒ ์ง? big endian์ ํฐ ์ฃผ์๋ก ๋๋๋ค๊ณ ํ๋๋ฐ, ๋๋๋ ๊ณณ์ด ์ด๋๊ฒ ์ด? ๋ง์ง๋ง์ ์ฐ์ด๋ ๊ณณ ์ด๊ฒ ์ง? ๊ทธ๋์ ๋น ์๋์ : ๋์ MSB๊ฐ ์จ๋ค โ ์ต์์๊ฐ MSB๋ค. ๋ฆฌํ์๋์๋ ๋ง์ฐฌ๊ฐ์ง๋ค ๋ฆฌํ ์๋์ : ๋์์ LSB๊ฐ ์จ๋ค โ ์ต์์๊ฐ LSB์ด๋ค.
๋นํธ์ฐ์ฐ์๋ ๋ ผ๋ฆฌ์ฐ์ฐ์์ ๋ค๋ฅด๋ค.
practice 1 : 0x39A7F8 = 0011 1001 1010 0111 1111 1000(2) 1100 0011 0101 0001(2) = 0xC351 255(10) = 1111 1111(2) 0x010E = 16^0 * 14 + 16^2 * 1 = 14 + 256 = 270(10)
practice 2 : 01101001 & 01010101 = 01000001 01101001 | 01010101 = 01111101 01101001 ^ 01010101 = 00111100 ~ 01010101 = 10101010
shift๋ bit ๋ฅผ ์ด๋์ํจ๋ค ยซ,ย ยป ์ผ๋ฐ์ ์ผ๋ก ๋น์๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๋๋ฐ,ย ยป์ MSB๋ฅผ ๋ณด์กดํ๋ ์ฐ์ shift๋ ์๋ค. ์ด๋ฅผ ๋ถํธํ์ฅ์ด๋ผ๊ณ ํจ. shift์ ํฌ๊ธฐ๊ฐ ์์์ด๊ฑฐ๋ ํdmใ word๋ณด๋ค ํฐ๊ฒฝ์ฐ ์ปดํจํฐ๊ฐ ๋ฏธ์น๋ค
practice 3 : 0110 0011 ยซย 4 = 0011 0000 1001 0101 ยซย 4 = 0101 0000 0110 0011ย ยป 4 (logical) = 0000 0110 1001 0101ย ยป 4 (logical) = 0000 0101 0110 0011ย ยป 4 (arithmetic) = 0000 0110 1001 0101ย ยป 4 (arithmetic) = 1111 1001
practice 4 : func : show_byte(pointer, size) โ ์ฌ์ด์ฆ๋ฒ๋งํผ ํ๋ฐ์ดํธ์ฉ ๋์ด์ ์ฃผ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ค int val = 0x87654321; byte_pointer valp = (byte_pointer) &val; show_byte(valp, 1); โ A : 4321 show_byte(valp, 2); โ B : 654321 A. little endian : 21 43, big endian : 43 21 B. little endian : 21 43 65, big endian : 65 43 21
BCD : 4๋นํธ๋ก 0~9๊น์ง ๋ํ๋ ๊ฐ ์๋ฆฌ์๋ง๋ค 4๋นํธ์ฉ โ ์กด๋๊ฒ ๋นํจ์จ์
๋ถํธ-ํฌ๊ธฐ : MSB๋ก ์ค์ง ๋ถํธ๋ง ๋ํ๋ด๊ณ ๋๋จธ์ง๋ก ๊ฐ๋ํ๋
unsigned : ๋ถํธ์์ด ๊ทธ๋ฅ ์ ๋ถ ๋นํธ๊ฐ ์๋ฅผ ๋ํ๋ (0 ~ 2^w -1)
signed : 2์ ๋ณด์๋ฅผ ์ฃผ๋ก ์ฌ์ฉํจ ๋นํธ๋ค์ง๊ณ 1๋ํ๊ธฐ โ๊ฒฐ๊ณผ์ ์ผ๋ก MSB๊ฐ ๊ณง ๋ถํธ์ (-2^(w-1) ~ 0 ~ 2^(w-1) -1)
ํฌ๊ธฐ ๊ฐ ์ ํ์ ๋ํด์๋ C๊ธฐ์ค limits.h์ ์์๋ก ์ง์ ๋์ด์๋ค. ๊ธฐ๊ธฐ๋ง๋ค ๊ฐ์ด ๋ฌ๋ผ์ง๋ ์ด๊ฑธ ์ด์ฉํด์ ๋ฌธ์ ๋ฅผํผํจ.
Practice 5 : 0x51 = 0101 0001 โ unsigned : 81, signed : 81 0xD9 = 1101 1001 โ unsigned : 9 + 13 * 16 = 208 + 9 = 217, signed : 217 - 128 = 89
signed ์ unsigned ๋ implicitํ ๋ณํ์ด ๊ฐ๋ฅํ๋ค
๊ณ์ฐ์ signed์ unsigned์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด Unsigned ๋ก ํต์ผํ์ฌ ๋ค๋ฃฌ๋ค
๋ง์ ์ ์ต์์ ๋นํธ๋ฅผ ๋์ด์๋ ์บ๋ฆฌ๊ฐ ๋ฐ์ํ๋ฉด ์บ๋ฆฌ๋ฅผ ๋ ๋ฆฐ๋ค (mod 2^w)
์+์ = ์, ์+์ = ์ ๋ฐ์์ overflow๊ฐ ๋ฐ์ํ ๊ฒ.
practice 6 :
int tadd_ok(int x, int y){
if(x >= 0 && y >= 0)
return ((x + y) >= 0) ? 1 : 0;
else if(x < 0 && y < 0)
return ((x + y) < 0) ? 1 : 0;
else
return 1;
}
practice 7 : -2147483647-1 == 2147483648U โ type : unsigned int, evaluation : 1 -2147483647-1 < 2147483647 โ type : signed int, evaluation : 1 -2147483647-1U < 2147483647 โ type : unsigned int, evaluation : 0 -2147483647-1 < -2147483647 โ type : signed int, evaluation : 1 -2147483647-1U < -2147483647 โ type : unsigned int, evaluation : 0
4
2์ง ๋ถ๋์์์ ํํ๋ 10์ง์๋ ๋ฐฉ์์ด ๋๊ฐ๋ค. ๋ถ์๋ถ๋ฅผ ์๋ฌด๋ฆฌํฉ์ณ๋ด์ผ ์ ์๊ฐ ์๋จ ๊ทธ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์ก์ค๋ก
x*2^yํํ๋ก ๋ชจ๋ ์๋ฅผ ํํํด์ผํ๋ฏ๋ก 10์ง์์ 0.33333โฆ ๊ฐ์ ํํํ ์ ์๋ ์๊ฐ ๋ฐ์
practice 1 : 0.010(2) = 2/8 = 0.25(10) 0.0011(2) = 3/16 = 0.1875(10) 0.0011010(2) = 26/128 tip)๋ถ์๋ถ๋ 1/2๋ก์์ํด์ย ยปํ ์๋ก 1/2^n์ด๋๊ณ ์ ์๋ถ๋ ๋์์๋ถํฐ 1๋ก์์ํด์ ยซํ ์๋ก 2^k๋๋ค
practice 2 : 0.75(10) = 3/4 = 0.11(2) 25/16 = 1.1001(2) tip)๊ณฑํ๊ธฐ๋ฅผ ๊ณ์ํด์ ์ ์๋ถ๋ฅผ ์ ๊ฑฐํด๊ฐ๋๊ฒ ์์ bit๊ฐ ๋๋ค.
practice 3 : 0.1์ด๋ 0.0001100110011001100110011001100110011โฆ. ์ปดํธํฐ์์๋ 23์๋ฆฌ๊น์ง๋ฐ์ ๋ชปํจ. 0.000110011001100110011 ์ค์ฐจ ๋ฐ์ 0.0000000000000000000011001100110011โฆ. = 9.54 * 10^-8 100์๊ฐ = 6000๋ถ = 360000์ด = 3600000*0.1์ด ๋ฐ์ํ ์๊ฐ์ค์ฐจ = 3600000 * 9.54 * 10^-8 = 36 * 9.54 * 10^-3 = 0.34344 ์ด์ 2000m์ด๋ฏ๋ก 2000m/s * 0.34344s = 686.88m
floating point expression : s M E (-1)^sM2^E,
float : s = 1bit, exp = 8bit, frac = 23bit
double : s = 1bit, exp = 11bit, frac = 52bit
์ ๊ทํ : exp = E + bias (bias = 2^(e-1) -1 = 127 or 1023), E = -126~127, -1022~1023, frac์ ์ฒซ๋นํธ 1๋ณด์ฅ.
ex) 15213(10) = 11101101101101(2) = 1.1101101101101(2) โ E = 13, frac = 1101101101101, s = 0 exp = E + bias = 13 + 127 = 140 = 1000 1100(2) frac = 110 1101 1011 0100 0000 0000(2) s = 0 โ 0 1000 1100 110 1101 1011 0100 0000 0000 โ 0100 0110 0110 1101 1011 0100 0000 0000
๋น์ ๊ทํ : exp = 0, E = 1 - bias (-126 or -1022), frac์ ์ฒซ ๋นํธ 0
โ frac = 0 : 0์ ๋ํ๋. s์๋ฐ๋ผ ์์ 0 ์์ 0์ด ๋๋จ
โ frac โ 0 : 0์ ๋งค์ฐ ๊ทผ์ ํ ์์๊ฐ์ ํ์. ์์์ E๋ -126์ด์๋ฏ ํํํ ์ ์๋ ๊ฐ์ฅ ์์ ์๋ฆฟ์๋ฅผ ๋ํ๋ ๊ฑฐ์ Epsilon?
ํน์๊ฐ : exp = 111โฆ1, E๋ bias๋ ํ์์์ ์ ์ด์ ์๊ฐ ์๋.
โ frac = 0 : ๋ฌดํ๋๋ฅผ ๋ํ๋. s์ ๋ฐ๋ผ ์์ ๋ฌดํ๋ ์์ ๋ฌดํ๋๋ก ๋๋จ
โ frac โ 0 : ์ซ์๊ฐ ์๋, Not a Number โ NaN
Practice 4 : -15213.0(10) = negate(11 1011 0110 1101(2)) = negate(1.1 1011 0110 1101(2) * 2^13) โ s = 1, frac = 1 1011 0110 1101 0000 0000 00, E = 13, exp = E + bias = 13 + 127 = 140 = 1000 1100(2) โ 1 1000 1100 1 1011 0110 1101 0000 0000 00 โ 1100 0110 0110 1101 1011 0100 0000 0000 9.6875(10) = 1001.1011(2) = 1.0011011(2) * 2^3 โ s = 0, exp = 3 + 127 = 130 = 1000 0010(2), frac = 0011 0110 0000 0000 0000 000 โ 0 1000 0010 0011 0110 0000 0000 0000 000 โ0100 0001 0001 1011 0000 0000 0000 0000
8๋นํธ ์์
s = 0, exp = 0000, frac = 000์ด๋ฉด โ ๋น์ ๊ทํ E = -6 value = 0
s = 0, exp = 0000, frac = 001์ด๋ฉด โ ๋น์ ๊ทํ E = -6, 0.000000001 = 1/512
s = 0, exp = 0000, frac = 010์ด๋ฉด โ ๋น์ ๊ทํ E = -6, 0.000000010 = 2/512
โฆ
s = 0, exp = 0000, frac = 111์ด๋ฉด โ ๋น์ ๊ทํ E = -6, 0.000000111 = 7/512
s = 0, exp = 0001, frac = 000์ด๋ฉด โ ์ ๊ทํ E = exp - 7 = -6, 1.000 โ 0.000001000 = 8/512
s = 0, exp = 0001, frac = 001 โ E = -6, 1.001 โ 0.000001001 = 9/512
s = 0, exp = 0001, frac = 010 โ E = -6, 1.010 โ 0.000001010 = 10/512
โฆ
s = 0, exp = 1110, frac = 111 โ E = 7, 1.111 โ 1111 0000 = 128 + 64 + 32 + 16 = 240
s = 0, exp = 1111, frac = 000 โ ํน์ infinite
s = 0, exp = 1111, frac โ 000 โ ํน์ NaN
ํท๊ฐ๋ฆฐ๊ฒ bias = 2^(e-1) -1 exp = E + bias(normal), 1 - bias(denormal) frac = 0 โ infinite (special)
๋ผ์ด๋ฉ(๊ทผ์ฌ) : ๊ฐ์ ๊ณ์ฐํด์ fracํ๋์ ์๋ง๊ฒ ๊ฐ์ ์กฐ์ ํ๋ค ์ธ์ ์ง์ ์ฌ์ฉ โ ๊ทผ์ ํ ์ง์๋ก ๊ฐ๋ค
๋ค๋ฅธ ๊ทผ์ฌ๋ฐฉ๋ฒ์ผ๋ก 0๋ฐฉํฅ ์ฌ๋ฆผ ๋ด๋ฆผ ๋ฐ์ฌ๋ฆผ ๋ฑ..
์ธ์ ์ง์ : ์ค๊ฐ์ ๋ผ์ด์์ ๋ ๊ฐ๊น์ด ์ง์๋ก ๊ฐ๋ค. ๊ทธ๊ฒ ์๋๋ฉด ๊ฑ ๋ฐ์ฌ๋ฆผ.
ex) 1/4์๋ฆฌ์์ ๊ทผ์ฌ 10.00 011(2) โ ์ค๊ฐ์ ์๋ โ ๋ฐ์ฌ๋ฆผ โ 10.00(2) 10.00 110(2) โ ์ค๊ฐ์ ์๋ โ ๋ฐ์ฌ๋ฆผ โ 10.01(2) 10.11 100(2) โ ์ค๊ฐ์ ๋ โ ์ธ์ ์ง์๋? โ 11.00(2) 10.10 100(2) โ ์ค๊ฐ์ ๋ โ ์ธ์ ์ง์๋? โ 10.10(2) ex) floating point ์ ๋ง๋ค๊ธฐ 128 = 1000 0000 = 1.000 0000 * 2^7 โ s = 0, E = 7, M = 1.000 0000 โ s = 0, exp = 7 + 7 = 14 = 1110 , frac = 000 โ 0111 0000 13 = 0000 1101 = 1.101 * 2^3 โ s = 0, exp = 3 + 7 = 10 = 1010, frac = 101 โ 0101 0101 17 = 0001 0001 =1.0001 * 2^4 โ s = 0, exp = 4 + 7 = 11 = 1011, M = 1.0001 = 1.000, frac = 000 โ 0101 1000 19 = 0001 0011 = 1.0011 * 2^4 โ s = 0, exp = 4 + 7 = 11 = 1011, M = 1.0011 = 1.010, frac = 010 โ 0101 1010 138 = 1000 1010 = 1.0001010 * 2^7 โ s = 0, exp = 7 + 7 = 14 = 1110, M = 1.0001010 = 1.001, frac = 001 โ 0111 0001 63 = 0011 1111 = 1.11111 * 2^5 โ s = 0, exp = 5 + 7 = 12 = 1100, M = 1.11111 = 10.000 โ s = 0, exp = 6 + 7 = 13 = 1101, M = 1.000, frac = 000 โ 0110 1000
practice 5 : 10.010(2) โ 10.0(2) : ์ค๊ฐ์ ๊ฑธ์ณค๋ค. ๋ด๋ ค์ผ ์ง์๋ค. 10.011(2) โ 10.1(2) : ์ค๊ฐ์ ์๊ฑธ์นจ. ๋ฐ์ฌ๋ฆผ์๋ฐ๋ผ ์ฌ๋ฆฐ๋ค. 10.110(2) โ 11.0(2) : ์ค๊ฐ์ ๊ฑธ์ณค๋ค. ์ฌ๋ ค์ผ ์ง์๋ค. 11.001(2) โ 11.0(2) : ์ค๊ฐ์ ์๊ฑธ์นจ. ๋ฐ์ฌ๋ฆผ์๋ฐ๋ผ ๋ด๋ฆฐ๋ค.
practice 6 : 10.010 = 1.0010 * 2^1 โ s = 0, exp = 1 + 7 = 8 = 1000, M = 1.0010, frac =001 โ 0100 0001 10.011 = 1.0011 * 2^1 โ s = 0, exp = 1 + 7 = 8 = 1000, M = 1.0011, frac = 010 โ 0100 0010 10.110 = 1.0110 * 2^1 โ s = 0, exp = 1 + 7 = 8 = 1000, M = 1.0110, frac = 011 โ 0100 0011 11.001 = 1.1001 * 2^1 โ s = 0, exp = 1 + 7 = 8, = 1000, M = 1.1001, frac = 100 โ 0100 0100
5
์ด์ ๋ธ๋ฆฌ์ด : ๊ธฐ๊ณ์ด์ 1:1 ๋์๊ด๊ณ๋ฅผ ๊ฐ๋ low level ์ธ์ด. ๋ฐ์ดํฐํ์ /์ฐ์ฐ ๋ชจ๋ ๊ธฐ์ด์ .
C์ฝ๋ ๋ณํ ๊ณผ์ : Cํ์ผ -์ปดํ์ผ๋ฌ(gcc -Og -S *.c)โ s(์ด์ ๋ธ๋ฆฌ)ํ์ผ -์ด์ ๋ธ๋ฌโ o(์ค๋ธ์ ํธ, ๋ฐ์ด๋๋ฆฌ)ํ์ผ -๋ง์ปค(ํ์ผ์ํธ๊ฐ ์ฐธ์กฐ/๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฐ๊ฒฐ)โ ์คํ๊ฐ๋ฅํํ๋ก๊ทธ๋จ
disassemble : objdump ๋ฅผ ์ด์ฉํ๊ฑฐ๋ gdb๋ฅผ์ด์ฉํ๋ค.
์์คํ ํ๋ก๊ทธ๋๋ฐ์์ ์๋๋ 16๋นํธ(2๋ฐ์ดํธ)์ด๋ค. ์ฟผ๋์๋๋? 16*4 = 64 = 8๋ฐ์ดํธ
๋ ์ง์คํฐ๋ 64๋ฐ์ดํธ (์ฟผ๋์๋)๊ธธ์ด๋ฅผ ๊ฐ๊ณ , ํ์ํธํ์ฑ์์ํด ๊ฐ 32๋นํธ, 16๋นํธ, 8๋นํธ, 4๋นํธ๋ก ๋๋๋ค.
operand : immediate $xxx, Register %xxx, Memory (%xxx)
์ปด๊ตฌ์ instruction๊ณผ๋ ์ข ๋ค๋ฅด๋ค. instruction src, dst๊ฐ ๊ธฐ๋ณธ! ๋ฐค๋ฉ์์ ํ๋ ๊ทธ๋๋ก๋ค
movq $0x4, %rax โ %rax๋ ์ง์คํฐ์ 0x4๊ฐ์ ๋ณต์ฌ movq $-147, (%rax) โ %rax๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ -147์ ๋ณต์ฌ %rax์ ๋ค์ด์๋ ๊ฐ์ด ์ฃผ์์ธ๊ฒฝ์ฐ movq %rax, %rdx โ %rdx๋ ์ง์คํฐ์ %rax๋ ์ง์คํฐ์ ์๋ ๋ด์ฉ์ผ ๋ณต์ฌ movq %rax, (%rdx) โ %rdx๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ %rax๋ ์ง์คํฐ์ ์๋ ๋ด์ฉ์ ๋ณต์ฌ movq (%rax), %rdx โ %rdx๋ ์ง์คํฐ์ %rax ๋ ์ง์คํฐ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์๋ ๋ด์ฉ์ ๋ณต์ฌ
๋ ์ง์คํฐ ์ฃผ์๊ฐ ๋ค์ด์๊ณ ๊ฑฐ๊ธฐ์ ๊ดํธ๋ฅผ ์์ฐ๋ฉด ๊ทธ๊ฑด ๊ทธ ๋ ์ง์คํฐ๊ฐ ์ ์ฅํ๊ณ ์๋ ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ๊ณต๊ฐ์ ์๋ฏธํ๋ค!!!!
๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ์ง์ ๋ชจ๋ : D(Rb, Ri, S) = (Rb) + s * (Ri) + D ์ฃผ์์ ๋ค์ ๊ฐ์ ๊ณ์ฐํ๋๊ฑฐ! ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ง์ ๋ชจ๋๋ offset๋ง ์๋๊ฑฐ
ex) 0x8(%rdx) = 0xf000 + 0x8 = 0xf008 (%rdx, %rcx) = 0xf000 + 0x0100 = 0xf100 (%rdx, %rcx, 4) = 0xf000 + 4 * 0x0100 = 0xf000 + 0x0400 = 0xf400 0x80(, %rdx, 2) = 0x80 + 2 * %rdx = 0x80 + 0x1e000 = 0x1e080 ๋ฌผ๋ก ์์ ์ฃผ์๊ฐ ์์์ผ๋ฉด ์ฃผ์๊ณ์ฐ์ด์ง๋ง ๊ทธ๋ฅ ๊ฐ์ด๋ค์ด์๋ ๊ฒฝ์ฐ๋ ์ฐ์ฐ๋จ RI์ RSP๋ ์ฌ ์ ์๋ค!!! D๋ S ๋ 1, 2, 4, 8์ด์จ๋ค..!?
leaq : src๋ก ๋ฉ๋ชจ๋ฆฌ์ง์ ๋ชจ๋๋ฐ๊ณ ๊ทธ๊ฑธ๋ก ๊ณ์ฐ๋๊ฑธ dst๋ก ๋ณด๋ธ๋ค
addq๋ ๋ค๋ฅธ๊ฑด src๊ฐ ๋ฌด์กฐ๊ฑด ์ฃผ์๋ชจ๋๋ก ํํ๋ ๊ฐ์ด ๋ค์ด์์ผ ํ๋ค๋์ ์ด๋ค.
ํญ์ ์ธ ์ ์๋ ๊ฑด ์๋๊ฒ, ์์์ ๋งํ๋ฏ ๋ช๊ฐ์ง ์ ์ฝ์ํฉ๋ฑ์ด ์์ D๋ s๋ 0 1 2 4 8๋ง์์ผํ๊ณ rsp๊ฐ ์ฌ์๋ ์๋ค๋์ง..
์ฃผ์ ๊ณ์ฐ ์์ %rdx = 0xf000 %rcx = 0x0100 0x8(%rdx) = 0x8 + 0xf000 = 0xf008 (%rdx, %rcx, ) = 0xf000 + 0x0100 = 0xf100 (%rdx, %rcx, 4) = 0xf000 + 0x0100 * 4 = 0xf400 0x80(, %rdx, 2) = 0x80 + 0xf000 * 2 = 0x1e080
incq, decq, negq, notq ๋ฑ 1์คํผ๋๋ ์ฐ์ฐ์๋ ์๋ค.
imul์ signed multiplication์ด๊ณ mul์ unsigned์ด๋ค.
6
๋ ์ง์คํฐ : ์์๋ฐ์ดํฐ %raxโฆ, ์คํํฌ์ธํฐ %rsp, ํ์ฌPC %rip, ํ ์คํธ๊ฐ CF, ZF, SF, OF
CF carry flag, ZF zero flag, SF sign flag, OF overflow flag
๊ฐ์ฅ ์ต๊ทผ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ์๋ฐ๋ผ ํ ์คํธ๊ฐ์ด ๋ณ๊ฒฝ๋๋ค. carry, zero, signed, overflow ๋ฑ (๊ผญ ์ ์ฅ๋๋ ์ฐ์ฐ์ด ์๋๋๋ผ๋)
cmpq src2, src1 : src1 - src2๋ฅผ ์ํํจ ํ๋๊ทธ ๊ฒฐ์
testq src2, src1 : src2 & src1์ ์ํํด ํ๋๊ทธ ๊ฒฐ์
๋ ๋ค ๊ฐ์ด ์ค์ ๋ก ๋ณ๊ฒฝ๋๋๊ฑด ์๋
์์ ๋น๊ต์ ํ๋๊ทธ๋ฅผ ์ด์ฉํด ๋ชฉ์ ์ง ๋ ์ง์คํฐ์ ๊ฐ๋ ๋ณ๊ฒฝํ ์ ์์. set์ธ์คํธ๋ญ์
set์ธ์คํธ๋ญ์ ์ ํ ๋ฐ์ดํธ๋ฅผ 00000000 ํน์ 00000001๋ก๋ง๋ฌ. ๋ฑ ํ๋ฐ์ดํธ๋ง.
sete ๊ฐ์ผ๋ฉด setne ๋ค๋ฅด๋ฉด sets signed์ด๋ฉด ์ฆ ์์์ด๋ฉด setns signed๊ฐ ์๋๋ฉด ์ฆ ์์์ด๋ฉด setge ํฌ๊ฑฐ๋ ๊ฐ์ผ๋ฉด setl ์์ผ๋ฉด setle ์๊ฑฐ๋ ๊ฐ์ผ๋ฉด seta ์ด์์ด๋ฉด setb ์ดํ๋ฉด
cmpq %rsi, %rdi //rdi๊ฐ ์์์ค๋ ๋น๊ต์์
setg %al //rdi > rsi์ด๋ฉด set
movzbl %al, %eax
ret
rsi rdi๋ฅผ ๋น๊ต (rdi๊ฐ - rsi๊ฐ ํด์) rdi๊ฐ ํฌ๋ฉด al์ ํ์ 1๋นํธ๋ฅผ set ๊ทธ๋ ๊ฒ set๋ ๋ฐ์ดํธ๋ฅผ rax๋ก ์ฎ๊ฒจ์ zero extension ์ด๋ ๊ฒ ํ๋ ค๊ณ movzbl์ ์ฐ๋๊ฑฐ์ ์ ์ด์ al์ด๋ rax๋ ๊ฐ์ ๋ ์ง์คํฐ์. ๋ฒ์๊ฐ ๋ค๋ฅธ๊ฑฐ์ง. zero extensionํ๋ ค๊ณ ์ด๋ ๊ฒ ์ด๊ฑฐ์
set์ธ์คํธ๋ญ์ ์ด๋ ์กฐ๊ธ ๋ฌ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ๋๊ฒ์๋๋ผ ๊ทธ๊ฑฐ๋ก ๋ฐ๋ก ๋ถ๊ธฐํ๋ jump๋์์. jump๋ ํ๋๊ทธ ์ปจ๋์ ์ด ๋ณ๊ฒฝ๋๋ฉด ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ด๋ป๊ฒ ํ๋ํ ์ง๋ฅผ ๊ฒฐ์ ํจ.
jmp ๋ฌด์กฐ๊ฑด๋ถ๊ธฐ je ๊ฐ์ผ๋ฉด jne ๋ค๋ฅด๋ฉด js ์์์ด๋ฉด jns ์์์ด๋ฉด jg ํฌ๋ฉด jge ํฌ๊ฑฐ๋๊ฐ์ผ๋ฉด jl ์์ผ๋ฉด jle ์๊ฑฐ๋๊ฐ์ผ๋ฉด ja ์ด์์ด๋ฉด jb ์ดํ๋ฉด
long absdiff(long x, long y){
long result;
if(x > y)
result = x - y;
else
result = y - x;
return result;
}
๋ค์๊ณผ ๊ฐ์ด goto๋ฌธ์ ํตํด ๋ณํ๋ ์ ์๋ค.
long absdiff(long x, long y){
long result;
int ntest = x <= y;
if(ntest) goto else;
result = x - y;
goto done;
else :
result = y - x;
done :
return result;
}
%rdi = x
%rsi = y
%rax = return value
absdiff :
cmpq %rsi, %rdi
jle else
mov %rdi, %rax
sub %rsi, %rax
ret
else :
mov %rsi, %rax
sub %rdi, %rax
ret
์ธ์คํธ๋ญ์ src, dst
jx Label : ์กฐ๊ฑด์ ๋ฐ๋ผ ์ฝ๋์ ์คํ ์์น๊ฐ ๋ณํ๋ค.
C์ธ์ด์ goto๋ฌธ์ ์ด์ฉํด jumpํ๋๊ฒ๊ณผ ์ ์ฌํ๊ฒ ๋์ํ๋ค.
cmovX : jmp๋ณด๋ค๋ cmovx๋ฅผ ์ฌ์ฉํ๋ค. โ jmp์ฐ๋ฉด ํ์ดํ๋ผ์ธ๊ผฌ์ฌ์ ๋นํจ์จ์
absdiff:
movq %rdi, %rax //rdi๊ฐ x์ rax์ ์์์ ์ฅ
subq %rsi, %rax //rax(x)์์ rsi(y)๋ฅผ ๋บ๊ฑธ rax(x - y)์ ์ ์ฅ
movq %rsi, %rdx //rsi(y)๋ฅผ rdx์ ์ ์ฅ
subq %rdi, %rdx //rdx(y)์์ rdi(x)๋ฅผ ๋นผ์ rdx(y - x)์ ์ ์ฅ
cmpq %rsi, %rdi //rdi(x)๋ rsi(y)๋ฅผ ๋น๊ตํด์
cmovle %rdx, %rax //x๊ฐ y๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค๋ฉด rdx(y - x)๋ฅผ rax์ ์ ์ฅ
ret
//์ผ๋จ ๋ ๋ค ๊ณ์ฐํด๋๊ณ ์ด๋ค๊ฑธ rax(๋ฆฌํด์์น)์ ์ค ์ง ์ ํํ๋ ๋ฐฉ์.
jmp์ฐ๋ฉด ํ๋ฆ์ด ๊ผฌ์ด๋ ๊ฑ cmovx๋ฅผ ์ฐ๋๊ฑฐ. ์ผ๋จ ๋ค ๊ณ์ฐํ๊ณ ๋ญ ๋ฐํํ ์ง๋ง ๊ฒฐ์ .
do while๋ฌธ
long pcount_dowhile(unsigned long x){
long result = 0;
do{
result += x & 0x1;
x >>= 1;
} while(x);
return result;
}
long pcount_goto(unsigned long x){
long result = 0;
Loop :
result += x & 0x1;
x >>= 1;
if(x) goto Loop;
return result;
}
pcount_assembly :
movl $0, %eax //%eax๋ result
Loop :
movq %rdi, %rdx //์ธ์๋ก ๋ฐ์ rdi๋ฅผ rdx๋ก ์ฎ๊ฒจ์ค
andl $1, %rdx //1์ด๋ and์ฐ์ฐ
addq %rdx, %rax //result์ ๋ํ๊ฐ ์ ์ฅ
shrq %rdi //shift right q ํ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ ํ๋๊ทธ์ ๋ฐ์๋จ
jne Loop //๊ทธ ๊ฒฐ๊ณผ๊ฐ 0์ด ์๋๋ผ๋ฉด ๋ฐ๋ณต
rep; ret
์ผ๋ฐ์ ์ธ while๋ฌธ
์ค๊ฐ ์ผ๋ก ์ ํ ํํ!!!!!
long pcount_while(unsigned long x){
long result = 0;
while(x){
result += x & 0x1;
x >>= 1;
}
return result;
}
//while -> do while
long pcount_dowhile(unsigned long x){
long result = 0;
if(!x) goto done;
do{
result += x & 0x1;
x >>= 1;
}while(x);
done :
return result;
}
//do while -> goto
long pcount_goto(unsigned long x){
long result = 0;
if(!x) goto done;
loop :
result += x & 0x1;
x >>= 1;
if(x) goto loop;
done :
return result;
}
//or just..
long pcount_goto(unsigned long x){
long result = 0;
goto Test;
Loop :
result += x & 0x1;
x >>= 1;
Test :
if(x) goto Loop;
return result;
}
pcout_assembly :
movq $0, %eax
jmp Test
Loop :
movq %rdi, %rdx
andq $1, %rdx
addq %rdx, %rax
shrq %rdi
Test :
testq $0, %rdi
jne Loop
์ด์ ๋ธ๋ฆฌ๋ ๋ด๊ฐ ์์ฑํ๊ฑฐ๋ผ ์ ํํ๊ฑฐ ์๋!!!! ์ผ๋ฐ์ ์ผ๋ก do while๋ฌธ์ผ๋ก ๋ฒ์ญํด์ go to๋ก ๋ณํ
์ ์ค๊ฐ์ผ๋ก ์ ํ๋ฅผ ์ฌ์ฉํ๋๊ฑด๊ฐ์? use the same loop structure as we saw for do-while loops but differ in how to implement the initial test. ์ผ๋จ unconditional jump๋ก test๋ฅผ ๊ฑฐ์ณ์ loop๋ก ๊ฐ๋คใ
//while
while(test)
body
//while->do while
if(!test) goto done;
do
body
whie(test);
done:
//do while->if
if(!test) goto done;
loop :
body
if(test) go to loop;
done:
goto test
loop :
body
test :
goto loop;
done : ...
for๋ฌธ์ while๋ก ๋ณํํด์ ๋์ผํ๊ฒ ์ฒ๋ฆฌํด์ค๋ค..
#define WSIZE 8*sizeOf(int)
long pcount_for(unsigned long x){
size_t i;
long result = 0;
for(i = 0; i < WSIZE; i++){
unsigned bit = (x >> i) & 0x1;
result += bit;
}
return result;
}
//into while loop..
long pcount_while(unsigned long x){
size_t i;
long result = 0;
while(i < WSIZE){
unsigned bit = (x >> i) & 0x1;
result += bit;
i++;
}
return result;
}
for(init; test; update){
body
}
init
while(test){
update
body
}
switch ๋ฌธ์ ์ ํํ ์ด๋ธ์ ๊ธฐ๋ก๋ ์ฃผ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์
switch_eg:
movq %rdx, %rcx
cmpq $6, %rdi //rdi๊ฐ 6๋ณด๋ค ํฌ๋ฉด, ์ฆ ์
๋ ฅ์ด switch ๋ฒ์๋ฅผ ๋ฒ์ด๋ default์ธ ๊ฒฝ์ฐ
ja L8 //L8์ด ๋ํดํธ์ผ๊ฑฐ์
jmp *L4(, %rdi, 8) //rdi์
๋ ฅ * 8 + L4๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ก ์ ํ
7
ํ๋ก์์ : ์ ์ด ์์๋ถ๋ก๊ฐ๋ค ๋ฆฌํด์ง์ ์ผ๋ก์ค๊ธฐ, ๋ฐ์ดํฐ ์ธ์์ ๋ฆฌํด๊ฐ ๋ ์ง์คํฐ์, ํ๋ก์์ ์คํ์ค ์คํ๋ฉ๋ชจ๋ฆฌ๊ด๋ฆฌ, ๋ฆฌํด์ ๋ฐํ
์คํ : ์คํ์ ๋์์ฃผ์๊ฐ ๋ฐ๋ฅ์ด๋ค. ์์์๋ถํฐ ์๋๋ก ๋ด๋ ค๊ฐ๋ฉฐ ์์ธ๋ค. %rsp๊ฐ ์คํํฌ์ธํฐ๋ก stack๋ฉ๋ชจ๋ฆฌ์ top์ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
pushq : %rsp๋ฅผ 8๊ฐ์์ํจ๋ค โ %rsp๊ฐ ์๋๋ก๋ด๋ ค๊ฐ๋ค โ ์คํ์ ๊ณต๊ฐ์ด ํ๋ณด๋๋ค, %rsp๊ฐ ๊ฐ๋ฆฌํค๋๊ณณ์ ๊ธฐ๋กํ๋ค โ ํ๋ณด๋ ์คํ๊ณต๊ฐ์ ๋ด์ฉ์ ์ง์ด๋ฃ๋๋ค
popq : %rsp๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ ์ฝ์ด์จ๋ค, %rsp๋ฅผ 8 ์ฆ๊ฐ์ํจ๋ค โ %rsp๊ฐ ์๋ก ์ฌ๋ผ๊ฐ๋ค โ ์คํ ๊ณต๊ฐ์ผ ๋น์์ค๋ค.
callq : ํ๋ก์์ ธ ํธ์ถ ๋ฆฌํดํ ์ฃผ์๋ฅผ ์คํ์ push, label๋ก ์ ํ
ret : ํ๋ก์์ ธ ๋ฆฌํด callํ ๋ ์คํ์ push๋ return์ฃผ์๋ฅผ popํด์ ํด๋น ์ฃผ์๋ก ํ์ถ
ex) 400544๊ฐ 400550์ ํธ์ถ โ ์คํ์ ๋์์ฌ๊ณณ์ธ 400549๊ฐ push๋จ (sp์ธ %rsp๊ฐ ๊ฐ์, ํด๋น ๊ณต๊ฐ์ ๋ฆฌํด์ฃผ์์ธ 40549๊ฐ ๊ธฐ๋ก๋จ) 400550์ด ํธ์ถ๋์์ผ๋ฏ๋ก %rip๊ฐ ๊ฐ๋ฆฌํค๋๊ณณ 400550์ผ๋ก ๋ณ๊ฒฝ๋จ (%rip๋ ๋ค์ ์ธ์คํธ๋ญ์ ์ฃผ์) ํธ์ถ๋ 400550์คํ โ ํ์คํ์ค ์คํ๋ ๋๋ง๋ค %rip์ %rsp์ ๋ณ๊ฒฝ์ด ์๊ธฐ๊ฒ ์ง๋ง, ์คํ์ ๋ค์ ๋ฆฌํด์ฃผ์๊ฐ ์๋๊ณณ๊น์ง pop๋ ๊ฒ. 400550์ ret๋ฅผ ๋ง๋จ (400557) โ ret์ ์คํ์ pop์์ผ return์ฃผ์๋ฅผ rip์ ๋ฐ์. (sp์ธ %rsp๊ฐ ๋ค์ ์ฆ๊ฐ, 400549๊ฐ %rip์ ๊ธฐ๋ก๋จ) ๋ฐ๋ผ์ ret์ดํ์๋ %rip๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ, ์ฆ ๋ค์ ์ธ์คํธ๋ญ์ ์ธ 400549๋ก ์ ์ด๊ฐ ์ด๋.
ํจ์ ํธ์ถ โ ์คํ์ ๋ฆฌํด๋์ด์ผ ํ ์ฃผ์๋ฅผ ๊ธฐ๋ก, ์ ์ด๊ฐ ํ๋ก์์ ๋ก ์ฎ๊ฒจ๊ฐ
ํจ์ ๋ฆฌํด โ ์คํ์ผ๋ก๋ถํฐ ๋ฆฌํด์ฃผ์๋ฅผ ๋ฐ์ rip์ ๊ธฐ๋ก, ์ ์ด๊ฐ ํด๋น ๋ฆฌํด์ฃผ์๋ก ์ฎ๊ฒจ๊ฐ.
๋ฐ์ดํฐํ๋ฆ
์ธ์ rdi, rsi, rdx, rcx, r8, r9 ์ด๋ ๊ฒ 6๊ฐ์ง์ฌ์ฉ, ๋ฆฌํด๊ฐ์ rax์ด์ฉ ์ ๋ถ์กฑํ๋ฉด ์คํ๋ ์
์คํ์ฒด์ : ์คํ์ด ํธ์ถ๋์ ๋ ๋ถํฐ ๋ฆฌํด์ ๊น์ง โ ์คํ์ ํ๋ ์์ผ๋ก ํ ๋น๋จ.
์คํํ๋ ์ : ํ๋ ์ํฌ์ธํฐ %rbp, ์คํํฌ์ธํฐ %rsp
ํ๋ก์์ ธ์ ์ง์ ํ ๋์ ํ๋ ์์ด ํ ๋น๋จ. call๋ช ๋ น์ผ๋ก ์์์ ์คํ์ push, return์์ ์์์ pop
์ฌ๊ท์ ์ผ๋ก ํธ์ถ๋๋ค๊ฑฐ๋ ํจ์์์์ ๋ค๋ฅธ ํจ์๊ฐ ๋ถ๋ฆฌ์ด์ ํ๋ก์์ ธ๊ฐ ์คํํ๋ ์์ ๋ ํ ๋น๋ฐ์์ผ ํ ํ์๊ฐ ์์ผ๋ฉด ๊ณ์ ์ถ๊ฐ๋ก ํ ๋น์ ๋ฐ์
์ง์ญ๋ณ์๋ ์ฃผ์๋ฅผ ์ฌ์ฉํ๊ฒ๋๋ฉด ์คํ์ ํ ๋นํด์ผํจ. ๋ ์ง์คํฐ์๋ ์ฃผ์๊ฐ ์๋ค!!
long call_incr(){
long v1 = 15213;
long v2 = incr(&v1, 3000); //v1์ ์ฃผ์๊ฐ ํ์ํ๋ฏ๋ก ์คํ ์ฌ์ฉํด์ผํจ.
return v1 + v2;
}
long incr(long *p, long val){
long x = *p;
long y = x + val;
*p = y;
return x;
}
call_incr :
subq $16, %rsp;
movq $15213, 8($rsp);
movq $3000, $esi;
leaq 8($rsp), $rdi; //rsp์ฃผ์ + 8์ rdi์ ์ ์ฅ -> rdi์ 15213์์ฃผ์
callq incr
addq 8(%rsp), %rax
addq $16, $rsp
ret
incr:
movq (%rdi), %rax //๊ดํธ๋ *์ ๊ฐ์ ์ญํ ์ ํ๋ค. ๊ทธ ์ฃผ์์ ๊ฐ์ ๊ฐ์ ธ์ค๋๊ฑฐ
addq %rax, %rsi
movq %rsi, (%rdi) //์ฌ๊ธฐ์๋ ๋ง์ฐฌ๊ฐ์ง. %rdi๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์ ๊ฐ์ ๋ฐ๊ฟ.
ret
์ธ์๋ก ์ฌ์ฉํ๋ rdi rsi rdx rcx r8 r9๋ ๋ค๋ฅธํจ์์ ํธ์ถ๋ก ์ธํด ์ง์์ง ์ ์์ ๋ฐ๋ผ์ ํธ์ถ์๋ ์์๊ฐ๋ค์ ํ๋ ์์ ์ ์ฅํด์ ํธ์ถ์์ ๋ณด๊ดํด์ฃผ๊ณ , callee๋ ์์ ๊ฐ๋ค ์ฌ์ฉ์ ์ ํ๋ ์์ ๋ณด๊ด, ๋ฆฌํด๋๋ฉด ๋ณต์. caller๋ callee์.
!!๊ด์ต ์ ๋ฆฌ!! caller saved : %rax, %rdi, %rsi, %rdx, %rcx, %r8, %r9, %r10, %r11 callee saved : %rbx, %r12, %r13, %r14, %rbp, %rsp %rax : ๋ฐํ %rdi ~ %r9 : ์ธ์ %r10, %r11 : ํธ์ถ์-์ ์ฅ ์์ %r12 ~ %r14 : ํผํธ์ถ์-์ ์ฅ ์์ %rbp : ์คํํ๋ ์(?) %rsp : ์คํ ํฌ์ธํฐ
8
๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ๋ฒ๊ทธ
๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๋ฐ๋ก segmentation fault๊ฐ ์ ๋ฐ ์ ์๋ค. ์ค๋ฅ๊ฐ ๋๋ค๋๊ฑด ์ค์ํ ๋ถ๋ถ์ ์ฐ๋ ๋ค๋ ์ด์ผ๊ธฐ์.
๋ฒํผ์ค๋ฒํ๋ก์ฐ : ๋ฐฐ์ด์ ํ ๋น๋ ํฌ๊ธฐ ์ด์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ์ ์๋ํ๋ ๊ฒ. ๋ณด์ ์ทจ์ฝ์ฑ์ ์์ธ์.
Comments