x86-64가 어떻게 발전되어 왔는지
원조: 16비트 8개의 레지스터
확장1: 32비트 8개의 레지스터
확장2: 64비트 16개의 레지스터 --> 현모델
레지스터의 이름들을 %r
로 시작된다
레지스터는 무엇을 저장할 때 사용 될까?
각각의 레지스터는 그의 쓰임새가 다르다 예를 들어
%rsp
처럼 런타임 스택의 끝부분을 가르킬때도 있다. 또한 8바이트보다 작은 것을 설정할 때, 나머지 바이트, 즉 상위 바이트를 0으로 만들어 버린다.
immediate: 상수값
%후에 C 표준 서식을 사용하는 정수
: $-577
, $0x1F
어셈블러는 해당값을 인코딩하는 가장 컴팩트한 방법을 자동으로 선택
register: 레지스터의 내용, 레지스ㅡ터들의 하위 일부분인 8,4,2,1을 가리킨다.
ra
는 임의의 레지스터 a를, R[ra]
를 배열R과 레지스터 식별자를 인덱스로 사용하는 형태로 나타낸다.
effective address: 계산된 주소에 의해 메모리 위치에 접근
Mb[Addr]
과 같이 표시하여 저장된 bq바이트를 참조하는 것을 나타낸다.
마지막으로 여러가지 유형의 메모리를 참조 하는 주소 지정 방식 Imm(rb, ri, s)
상수오프셋 Imm, 베이스 레지스터 rb,인덱스 레지스터 ri, 배율 s,s
1,2,4,8의 값을 갖는다
그러니까 여기서 연산 같은 것을 많이하는데
0x
가 붙게 되면 그것은 16 진수를 의미하고
260(%rcx, %rdx)
의 뜻은 260 + 레지스터1의 값 + 레지스터2의 값을 의미한다.
한마디로 변환할때 우리는 사고의 방식이 10진수니까 왠만하면 10진수로 바꿔서 하는게 나을 것 같다
예를 들어 0xFC(,%rcx, 4)
와 같이 나타내면 위와 다르게 FC
16진수로 계산하라는 뜻이다
데이터 이동 명령을 설명할 때 여러개의 인스트럭션 클래스로 구분 후, 동일한 동작을 다른 오퍼랜드 크기를 사용해 수행 한다.
소스 오퍼랜드
: 상수, 레지스터 저장값, 메모리 저장값
목적 오퍼랜드
: 레지스터 또는 메모리 주소의 위치를 지정
movabsq: 임의의 64 비트 상수 값을 오퍼랜드로 가질 수 있다
그니까 한마디로 mov는 같은 크기로만 갈 수 있는 데!
레지스터로 갔을때는 그 크기의 mov 명령어를 넣어주고 그게 아닐때는 보통 메모리로 가는데 그때는 사실상 가는 정보의 값을 보내주면 되는 것 같다.
아무래도 메모리에는 크기에 제한이 없는? 느낌이 드는 갑다.