raxλ x86_64 μν€ν
μ²μμ
"Return value Accumulator Register"μ μ½μλ‘,
μ°μ μ°μ° κ²°κ³Ό λ° ν¨μ λ°νκ°μ μ μ₯νλ μν μ κ°μ§ μ€μ¬ λ μ§μ€ν°μ΄λ€.
eax (32λΉνΈ), ax (16λΉνΈ), al (8λΉνΈ)μ κ°μ μ΄λ¦μΌλ‘λ νμ νΈνλ¨mov, add, mul, syscall λ± μλ§μ λͺ
λ Ήμ΄μμ νμλ‘ μ¬μ©λ¨raxλ§ λ°λ‘ μ€μνκ² λ€λ£¨λκ°?return ν€μλλ‘ λ°νλλ κ°μ νμ raxλ₯Ό ν΅ν΄ μ λ¬λ¨raxμ λ£κ³ ,raxμ λ΄μ μ μ νλ‘κ·Έλ¨μ λ°ννλ€raxλ κΈ°λ³Έ μ°μ μ°μ° κ²°κ³Ό μ μ₯μλ‘ μ°μΈλ€raxλ₯Ό μ¬μ©ν΄μΌ νλ€β¨ κ²°κ΅
raxλ λ¨μν μμ μ μ₯μκ° μλ,
ν¨μ, μ°μ°, μμ€ν νΈμΆ λ± λͺ¨λ νλ¦μ μΆκ΅¬μ΄μ μ€μ¬ μΆμ΄λ€.
mov rax, 3
add rax, 5 ; rax = 8
CμΈμ΄ ν¨μμμ return κ°μ raxμ λ΄κ²¨ νΈμΆμμκ² μ λ¬λλ€.
int f() { return 42; }
μ ν¨μλ λ΄λΆμ μΌλ‘:
mov eax, 42
ret
β νΈμΆμλ raxμμ λ°νκ°μ κΊΌλΈλ€.
raxμ μμ€ν
μ½ λ²νΈλ₯Ό λ΄λλ€.rax κ°μ ν΄μνμ¬ μ΄λ€ κΈ°λ₯μ νΈμΆν μ§ κ²°μ νλ€.mov rax, 1 ; write μμ€ν
μ½
mov rdi, 1 ; fd
mov rsi, msg ; buf
mov rdx, len ; size
syscall
π PintOSμμλ μ μ νλ‘κ·Έλ¨μ΄ syscallμ μ€νν λ raxλ₯Ό ν΅ν΄ μ΄λ€ κΈ°λ₯μ μμ²νλμ§ κ΅¬λΆνλ€.
| μ΄λ¦ | ν¬κΈ° | μ€λͺ |
|---|---|---|
rax | 64λΉνΈ | μ 체 64λΉνΈ |
eax | νμ 32λΉνΈ | raxμ νμ μ λ° |
ax | νμ 16λΉνΈ | eaxμ νμ μ λ° |
al | νμ 8λΉνΈ | axμ νμ μ λ° |
μμ:
rax = 0x00000000000000FFμ΄λ©΄,al = 0xFF,ax = 0x00FF,eax = 0x000000FF
rax κ°μ κΊΌλ΄, μ΄λ€ syscallμ μμ²νλμ§ νμΈνλ€.raxμ λ΄μ μ μ νλ‘κ·Έλ¨μΌλ‘ λ°ννλ€.// μμ: syscall.c λ΄λΆ
switch (f->R.rax) {
case SYS_WRITE:
...
f->R.rax = write(fd, buf, size);
break;
}
β fλ struct intr_frame*, μ¦ μ μ νλ‘κ·Έλ¨μ μΈν°λ½νΈ λΉμ λ μ§μ€ν° μνλ₯Ό 보κ΄ν ꡬ쑰체λ€.
raxλ x86_64μμ μ°μ° κ²°κ³Ό, ν¨μ λ°νκ°, μμ€ν
μ½ λ²νΈ λ° κ²°κ³Όκ°μ μ μ₯νλ λ μ§μ€ν°μ΄λ€.raxλ₯Ό ν΅ν΄ μ λ¬λλ€.raxλ₯Ό ν΅ν΄ syscall λ²νΈμ λ°νκ°μ μ£Όκ³ λ°λλ€.raxλ μ°μ°/ν΅μ /μ μ΄μ μ€μ¬μ΄λ―λ‘, λ³λ ν€μλλ‘ νμ΅ν λ§ν κ°μ₯ μ€μν λ μ§μ€ν°λ€.