ํฌ์ŠคํŠธ

๐ŸŒ‘ Addressing Mode

๐Ÿ’ซ ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ


  • ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ Addressing Mode
    • ์ฃผ์†Œ ์ฆ‰์‹œ Address Immediate ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ
      • ์ฃผ์†Œ ๋ชจ๋“œ
        • ํ”ผ์—ฐ์‚ฐ์ž์— ๋‚˜ํƒ€๋‚œ ๊ฐ’์„ ์ฃผ์†Œ๋กœ ํ•ด์„ํ•จ (์ง์ ‘ ๊ฐ„์ ‘, ์ ˆ๋Œ€ ์ƒ๋Œ€ ์ฃผ์†Œ ํ•ด๋‹น)
      • ์ฆ‰์‹œ ๋ชจ๋“œ
        • ํ”ผ์—ฐ์‚ฐ์ž์— ๋‚˜ํƒ€๋‚œ ๊ฐ’์€ ์ƒ์ˆ˜๋กœ ํ•ด์„ํ•จ
    • ์ง์ ‘ ๊ฐ„์ ‘ Direct Indirect ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ
      • ์ง์ ‘ ์ฃผ์†Œ
        • ๊ธฐ๊ณ„ ๋ช…๋ น์–ด์˜ ํ”ผ์—ฐ์‚ฐ์ž ๋ถ€๋ถ„์ด ์ฃผ๊ธฐ์–ต์žฅ์น˜ ์ ‘๊ทผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
        • #์ฃผ์†Œ โ†’ ๊ฐ’ ๊ฐ€์ ธ์˜ด
      • ๊ฐ„์ ‘ ์ฃผ์†Œ
        • ํ”ผ์—ฐ์‚ฐ์ž ๋ถ€๋ถ„์ด ๊ฐ€๋ฅดํ‚ค๋Š” ๊ณณ์— ์ €์žฅ๋œ ๊ธฐ์–ต์žฅ์น˜ ๊ฐ™์ด 2์ฐจ(์ตœ์ข…) ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
        • #์ฃผ์†Œ โ†’ ์ฃผ์†Œ โ†’ ๊ฐ’ ๊ฐ€์ ธ์˜ด Like ํฌ์ธํ„ฐ
    • ์ ˆ๋Œ€ ์ƒ๋Œ€ Absolute Relative ์ฃผ์†Œ ์ง€์ • ๋ชจ๋“œ
      • ์ ˆ๋Œ€ ์ฃผ์†Œ
        • ํ”ผ์—ฐ์‚ฐ์ž์— ๋‚˜ํƒ€๋‚œ ์ฃผ์†Œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ฃผ๊ธฐ์–ต์žฅ์น˜ ์ ‘๊ทผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
        • #์ฃผ์†Œ โ†’ ๊ฐ’ ๊ฐ€์ ธ์˜ด
      • ์ƒ๋Œ€ ์ฃผ์†Œ
        • ํ”ผ์—ฐ์‚ฐ์ž์— ๋‚˜ํƒ€๋‚œ ์ฃผ์†Œ์— ์ œ 3์˜ ๊ธฐ์ค€ ๊ฐ’์„ ๋”ํ•œ ๊ฐ’์ด ์ฃผ๊ธฐ์–ต์žฅ์น˜ ์ ‘๊ทผ ์ฃผ์†Œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ
        • #์ฃผ์†Œ + ๊ธฐ์ค€ ๊ฐ’ โ†’ ๊ฐ’ ๊ฐ€์ ธ์˜ด
  • OP Coder ์—ฐ์‚ฐ ์ฝ”๋“œ, Operand ํ”ผ์—ฐ์‚ฐ์ž
  • I.E. Add_์ ˆ๋Œ€/์ƒ๋Œ€_์ง์ ‘/๊ฐ„์ ‘, ์ƒ์ˆ˜

๐Ÿ’ซ TODO


๊ฐ„๋‹จํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๋ชจ๋“œ

  1. ์ฐธ๊ณ 
    • Reg[R] : ๋ ˆ์ง€์Šคํ„ฐ R ์•ˆ์˜ ๊ฐ’
    • Mem[M] : ๋ฉ”๋ชจ๋ฆฌ M ์•ˆ์˜ ๊ฐ’๊ฐ’
  2. ํ‘œ์ค€๋ชจ๋“œ (R)
    • Mem[Reg[R]]
    • ๋ ˆ์ง€์Šคํ„ฐ R์€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • C์˜ ํฌ์ธํ„ฐ ์—ญ์ฐธ์กฐ (Dereferencing)
    • movq (%rcx), %rax
  3. ๋ณ€์œ„๋ชจ๋“œ D(R)
    • Mem[Reg[R]+D]
    • ๋ ˆ์ง€์Šคํ„ฐ R์€ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์—ญ์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋ฅผ ๋‚˜ํƒ€๋ƒ„
    • ์ƒ์ˆ˜ ๋ณ€์œ„ D๋Š” ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋ƒ„
    • movq 8(%rbp), %rdx
1
2
3
4
5
6
7
8
9
10
11
12
void Temp(SomeType a, SomeType b) {}
// a โ†’ %rdi, b โ†’ %rsi

__asm
{
	Temp:
		movq (%rdi), %rax
		movq (%rsi), %rdx
		movq %rdx, (%rdi)
		movq %rax, (%rsi)
	ret
}
  • ์™„์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๋ชจ๋“œ (์ธ๋ฑ์Šค ์ฃผ์†Œ๋ชจ๋“œ)
    • ์ผ๋ฐ˜ ํ˜•ํƒœ
      • D(Rb, Ri, S) Mem[Reg[Rb]+S*Reg[Ri]+D]
      • D: ์ƒ์ˆ˜ ๋ณ€์œ„(Displacement) 1,2,4 Bytes
      • Rb: Base Register : 16๊ฐœ ์ •์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ ์ค‘ ์–ด๋–ค ๊ฒƒ
      • Ri: Index Register: %rap๋ฅผ ์ œ์™ธํ•œ ์–ด๋–ค ๊ฒƒ
        • ์˜์™ธ๋กœ %ebp๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ
      • s: ๋ฐฐ์šธ (Scale): 1,2,4,8 (why there numbers?)
    • ํŠน์ˆ˜ ํ˜•ํƒœ
      • (Rb, Ri) Mem[Reg[Rb]+Reg[Ri]]
      • D(Rb,Ri) Mem[Reg[Rb]+Reg[Ri]+D]
      • (Rb,Ri,S) Mem[Reg[Rb]+S*Reg[Ri]]

@ ์—ฌ๋Ÿฌ ์˜คํผ๋žœ๋“œ ํ˜•ํƒœ

  • ๋ฐ์ดํ„ฐ์˜ ์ด๋™ : x86-64
    • ๋ฐ์ดํ„ฐ ์ด๋™ move Source, Dest
      • Indtel์€ move Dest, Source
    • ํ”ผ์—ฐ์‚ฐ์ž (์˜คํผ๋žœ๋“œ Operands)
      • Immediate ์ •์ˆ˜ ์ƒ์ˆ˜ ๋ฐ์ดํ„ฐ
        • i.e. $0x400, $-533
        • C์ƒ์ˆ˜ ๊ฐ™์ง€๋งŒ โ€˜$โ€™์ ‘๋‘์–ด ๋ถ™์ž„
        • 1,2,4 Bytes๋กœ ์ธ์ฝ”๋“œ
      • Register: 16๊ฐœ ์ •์ˆ˜ ๋ ˆ์ง€์Šคํ„ฐ ์ค‘ ํ•˜๋‚˜
        • i.e. %rax, %r13
        • ํŠน๋ณ„ํžˆ %rsp๋Š” ํŠน์ˆ˜ ์šฉ๋„๋กœ ์˜ˆ์•ฝ๋˜์–ด ์žˆ์Œ
        • ๊ทธ ์™ธ ๋ ˆ์ง€์Šคํ„ฐ๋“ค์€ ํŠน์ • ๋ช…๋ น์„ ์œ„ํ•œ ํŠน์ˆ˜์šฉ๋„๋ฅผ ๊ฐ€์ง
      • Memory: ๋ ˆ์ง€์Šคํ„ฐ์˜ ์ฃผ์–ด์ง„ ์ฃผ์†Œ์—์„œ ์—ฐ์†๋œ 8๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ
        • ๊ฐ„๋‹จ ์— :%rax
        • ๋‹ค์–‘ํ•œ ์ฃผ์†Œ๋ชจ๋“œ (Address Modes) ์ œ๊ณต
  • movq ์˜คํผ๋Ÿฐ๋“œ ์กฐํ•ฉ
    • Imm
      • to Reg, movq $0x4, %rax
        • Like c temp = 0x4;
      • to Mem, movq $-146, (%rax)
        • Like c *p = -147;
    • Reg
      • to Reg, movq %rax, %rdx
        • Like c temp2 = temp1;
      • to Mem, movq %rax, (%rdx)
        • Like *p = temp;
    • Mem
      • to Reg. movq (%rax), %rdx
        • Like c temp = *p;
    • ํ•˜๋‚˜์˜ ๋ช…๋ น์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ๋Š” ์ด๋™ ๋ถˆ๊ฐ€
  • ๋ฐ์ดํ„ฐ ์ด๋™
    • movx, x in {b,w,l,q}
    • movq, 8Byte quad word
    • movl, 4Byte double word
    • movw, 2Byte word
    • movb, 1Byte byte
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.