๐Ÿ“š ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘๊ฐ„๊ณ ์‚ฌ ์ •๋ฆฌ

๐Ÿ“š ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ค‘๊ฐ„๊ณ ์‚ฌ ์ •๋ฆฌ

์ค‘๊ฐ„๊ณ ์‚ฌ๋Œ€๋น„

์กฑ๋ณด ๋ถ„์„

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๊ฐ€ ์•ˆ ๋œฐ ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ฅ˜๊ฐ€ ๋‚œ๋‹ค๋Š”๊ฑด ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ์ฐ”๋ €๋‹ค๋Š” ์ด์•ผ๊ธฐ์ž„.

๋ฒ„ํผ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ : ๋ฐฐ์—ด์— ํ• ๋‹น๋œ ํฌ๊ธฐ ์ด์ƒ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒƒ. ๋ณด์•ˆ ์ทจ์•ฝ์„ฑ์˜ ์›์ธ์ž„.

Share: Twitter Facebook
Seunghun Yang's Picture

About Seunghun Yang

Seunghun is undergraduate student at Computer Science Engineering in CNU(Chungnam National University).

Daejeon, South Korea

Comments