Register: 두 판 사이의 차이

youngwiki
14번째 줄: 14번째 줄:
[[파일:Names for Part of Register.png|테두리|프레임없음|420x420픽셀]]
[[파일:Names for Part of Register.png|테두리|프레임없음|420x420픽셀]]


각각의 register는 8byte이지만 우리는 또한 해당 register의 lower 4byte, 2byte, 혹은 1byte에 접근할 수 있다.
각각의 register는 8byte이지만 우리는 또한 해당 register의 lower 4byte, 2byte, 혹은 1byte에 접근할 수 있다. 이때 8byte 접근은 longlong, 4byte 접근은 long이나 int,  2byte 접근은 short, 1바이트 접근은 char 자료형을 수정하고자 하는 것이다.


==Rules on the Use of Registers==
==Rules on the Use of Registers==

2025년 4월 3일 (목) 01:12 판

상위 문서: 컴퓨터 시스템

개요

Registers in x86-64

위의 대부분의 register들은 자유롭게 사용가능하지만, 특정 몇몇은 특정한 용도만을 위해서 사용된다.

  • %rip: program counter(instructor pointer)로 사용된다.
  • %rsp: stack pointer로 사용된다.

Names for part of Register

각각의 register는 8byte이지만 우리는 또한 해당 register의 lower 4byte, 2byte, 혹은 1byte에 접근할 수 있다. 이때 8byte 접근은 longlong, 4byte 접근은 long이나 int, 2byte 접근은 short, 1바이트 접근은 char 자료형을 수정하고자 하는 것이다.

Rules on the Use of Registers

Register들을 사용하기 위해서는 몇가지 규칙이 존재한다.

  • Calling convention
    • 함수의 1st, 2nd, 3rd argument는 반드시 %rdi, %rsi, %rdx로 pass된다.
    • Return 값은 %rax값이 pass된다.

Flag registers

%rip와 %rsp 말고도 x86-64에는 아래와 같이 특별한 레지스터들이 추가로 존재한다.

  • %ZF (Zero Flag): 연산 결과가 0이면 1로 설정됨
  • %SF (Sign Flag): 연산 결과가 음수이면 1로 설정됨
  • %CF (Carry Flag): 부호 없는 덧셈/뺄셈에서 자리올림/자리내림 발생 시 1로 설정
  • %OF (Overflow Flag): 부호 있는 연산에서 overflow 발생 시 1로 설정

위는 특정한 조건 분기나 연산 결과 판별 등을 위해 사용되는 flag register들이다. 이들은 단순히 true/false만 나타내면 되므로 크기는 1bit이다. 만약 해당 register의 값이 1이면 해당 조건을 만족, 0이면 조건이 만족되지 않음을 나타낸다. 또한 flag register들은 특정한 연산 후에 자동으로 갱신(automatically update)된다. 예를 들면 add, sub, and, or 등은 플래그를 변경하지만, mov, lea는 플래그에 영향을 주지 못한다. 이 때문에 flag register는 최신 연산 결과만을 유지하며, 사용자가 해당 register들을 직접 수정할 수도 없다.

각주