728x90
반응형
3.4 정보 접근하기
- x86_64 CPU는 64비트 값을 저장할 수 있는 16개의 범용 레지스터를 보유
- 레지스터는 정수 데이터와 포인터를 저장
3.4.1 오퍼랜드 식별자
- 인스트럭션은 하나 이상의 오퍼랜드를 가짐
- 연산을 수행할 소스값과 그 결과를 저장할 목적지의 위치를 명시
- 결과값은 레지스터나 메모리에 저장
타입(Type)
- 상수(immediate) -> ‘$’ 기호 다음에 C 표준서식을 사용하는 정수
- 레지스터(register) -> 레지스터의 내용
- 메모리 참조 -> 유효 주소(effective address)에 의해 메모리 위치에 접근
일반적인 형태
Imm + R[rb] + R[ri]*s
Imm : 상수 오프셋
rb : 베이스 레지스터 (64비트)
ri : 인덱스 레지스터 (64비트)
s : 배율 (1, 2, 4 ,8) 값을 가짐
연습문제 3.1
더보기
Operand | Value | Comment |
---|---|---|
%rax | 0x100 | %rax 레지스터의 값 |
0x104 | 0xAB | 메모리 주소 0x104에 저장된 값 |
$0x108 | 0x108 | 상수 값 |
(%rax) | 0xFF | %rax(0x100) 주소에 저장된 값 |
4(%rax) | 0xAB | %rax(0x100) 주소에 4를 더한 0x104 주소의 값 |
9(%rax,%rdx) | 0x11 | %rax와 %rdx를 더하고 9를 더한 주소(0x10C)의 값 |
260(%rcx,%rdx) | 0x13 | %rcx와 %rdx를 더하고 260을 더한 주소(0x108)의 값 |
0xFC(,%rcx,4) | 0xFF | %rcx를 4배 하고 0xFC를 더한 주소(0x100)의 값 |
(%rax,%rdx,4) | 0x11 | %rax와 %rdx의 4배 값을 더한 주소(0x10C)의 값 |
3.4.2 데이터 이동 인스트럭션
데이터를 한 위치에서 다른 위치로 복사하는 명령
인스트럭션(2가지)
- 소스 값을 레지스터에 적재하는 인스트럭션
- 레지스터의 값을 목적지에 쓰기 위한 인스트럭션
MOV 클래스
- movb(1 바이트), movw(2 바이트), movl(4 바이트), movq(8 바이트)
- 서로 다른 크기의 데이터에 대한 계산
MOVZ(Zero-Extend) 클래스
- 목적지의 남은 바이트들을 모두 0으로 채움(Unsigned 표현에 사용)
- movz 명령어는 unsigned 데이터를 이동시킬 때 사용됨
- 이 명령어는 이동하는 데이터를 0으로 확장시킴(부호 비트는 영향을 받지 않음)
MOVS(Sign-Extend) 클래스
- 소스 오퍼랜드의 가장 중요한 비트를 반복해서 복사하는 부호 확장으로 채움
- movs 명령어는 signed 데이터를 이동시킬 때 사용됨
- 이 명령어는 이동하는 데이터를 부호 비트에 따라 확장시킴
- 음수일 경우에는 1로, 양수일 경우에는 0으로 확장됨
소스 오퍼랜드
상수, 레지스터 저장 값, 메모리 저장 값
목적 오퍼랜드
레지스터 또는 메모리 주소의 위치를 지정
특징
- 레지스터의 크기는 인스트럭션의 마지막 문자(‘b’,’w’,’l’,’q’)가 나타내는 크기와 일치해야 함
- 예외사항으로 movl이 레지스터를 목적지로 하는 경우
- 레지스터의 상위 4바이트도 0으로 설정
- 소스 오퍼랜드가 먼저 나오고 목적 오퍼랜드가 나옴
참고
- 보수 : 컴퓨터에서 음수를 표현하는 방법
- 1의 보수(Ones' complement):
- 1의 보수는 음수를 표현하기 위해 원래 숫자의 모든 비트를 반전시키는 방법입니다. 즉, 0은 1로, 1은 0으로 바꿉니다. 예를 들어, 4비트 숫자에서 3(0011)의 1의 보수는 -3(1100)입니다. 이 방법은 산술 연산에서 오버플로우가 발생하는 것을 방지하지 못하는 단점이 있습니다.
- 2의 보수(Two's complement):
- 2의 보수는 1의 보수에 1을 더하는 방법입니다. 예를 들어, 4비트 숫자에서 3(0011)의 2의 보수는 -3(1101)입니다. 이 방법은 1의 보수의 단점을 보완하고, 0을 포함한 모든 정수를 고유하게 나타낼 수 있습니다. 또한 덧셈 및 뺄셈을 하나의 연산으로 수행할 수 있습니다.
- 1의 보수(Ones' complement):
연습문제 3.2
더보기
레지스터 | 크기 | 설명 |
%eax | 32비트 | 확장 누산기 레지스터 (Extended Accumulator). 일반적으로 정수 연산에 사용되며, 함수의 반환값을 저장하는 데 사용. x86-64 아키텍처에서도 널리 사용 |
%rsp | 64비트 | 스택 포인터 레지스터 (Stack Pointer). 현재 스택의 최상단을 가리키며, 함수 호출과 반환, 로컬 변수 할당 등에 사용 |
%rdx | 64비트 | 데이터 레지스터 (Data Register). 정수 연산, 특히 나눗셈 연산에서 나머지를 저장하거나 시스템 호출에서 추가 인자 전달에 사용 |
%dx | 16비트 | %rdx 레지스터의 하위 16비트. 특정 상황에서 16비트 연산에 사용되며, 호환성을 위해 남아있음 |
%bl | 8비트 | 베이스 레지스터 (Base Register) %rbx의 하위 8비트. 주로 데이터 처리와 논리 연산에 사용 |
%rbx | 64비트 | 베이스 레지스터. 데이터 저장 및 연산에 사용되며, 메모리 주소 지정에 자주 사용 |
%rax | 64비트 | 누산기 레지스터 (Accumulator). 일반적인 계산, 특히 64비트 연산에 사용되며, 시스템 호출의 반환값 처리에도 사용 |
%dl | 8비트 | 1데이터 레지스터 %rdx의 하위 8비트. 주로 8비트 데이터 처리와 논리 연산에 사용 |
연습문제 3.3
movb $0xF, (%ebx)
# %ebx는 32비트 레지스터이고, x86-64 아키텍처에서는 사용되지 않음. 즉, %rbx와 같은 64비트 레지스터를 사용해야 함
movl %rax, (%rsp)
# %rax는 64비트 레지스터. 그러나 movl 명령어는 32비트 데이터를 이동시키는 데 사용. 따라서, 64비트 레지스터와 32비트 명령어 사이에 크기 불일치가 있음
movw (%rax),4(%rsp)
# 어셈블리어에서는 한 명령어 안에서 소스와 대상이 모두 메모리 참조일 수 없음. 이 명령어는 메모리에서 메모리로 데이터를 직접 이동시키려고 하므로, 문법에 맞지 않음
movb %al,%sl
# %sl이라는 레지스터는 존재하지 않음. sil 같은 x86-64 아키텍처의 올바른 8비트 레지스터 이름을 사용해야 함
movq %rax,$0x123
# movq 명령어는 대상이 레지스터나 메모리 주소여야 함. $0x123 같은 상수 값(immediate value)은 소스로만 사용될 수 있고, 대상으로는 사용될 수 없음
movl %eax,%rdx
# 여기서 %eax는 32비트 레지스터이고, %dx는 16비트 레지스터. 두 레지스터의 크기가 다르므로, 이 명령어는 크기 불일치 오류 발생
movb %si, 8(%rbp)
# %si는 16비트 레지스터. movb는 8비트 데이터를 이동시키는 명령어이므로, %si와 같은 16비트 레지스터는 사용할 수 없고 %sil 또는 다른 8비트 레지스터를 사용해야 함
연습문제 3.4
더보기
src_t | dest_t | Instruction | Comments |
long | long | movq (%rdi), %rax | 8바이트를 읽어서 %rax에 저장 |
movq %rax, (%rsi) | %rax에 저장된 8바이트를 (%rsi)에 저장 | ||
char | int | movsbl (%rdi), %eax | 부호 있는 char를 int로 변환 |
movl %eax, (%rsi) | 변환된 4바이트 int 값을 (%rsi)에 저장 | ||
char | unsigned | movsbl (%rdi), %eax | 부호 있는 char를 int로 변환 |
movl %eax, (%rsi) | 변환된 4바이트 값을 (%rsi)에 저장 | ||
unsigned char | long | movzbl (%rdi), %eax | 부호 없는 char를 0으로 확장하여 long으로 변환 |
movq %rax, (%rsi) | 변환된 8바이트 값을 (%rsi)에 저장 | ||
int | char | movl (%rdi), %eax | 4바이트 int 값을 읽어 %eax에 저장 |
movb %al, (%rsi) | %eax의 하위 1바이트인 %al을 (%rsi)에 저장 | ||
unsigned | unsigned char | movl (%rdi), %eax | 4바이트 값을 읽어 %eax에 저장 |
movb %al, (%rsi) | %eax의 하위 1바이트인 %al을 (%rsi)에 저장 | ||
char | short | movsbw (%rdi), %ax | 부호 있는 char를 short로 변환 |
movw %ax, (%rsi) | 변환된 2바이트 값을 (%rsi)에 저장 |
728x90
반응형
'크래프톤 정글 - TIL' 카테고리의 다른 글
크래프톤 정글 5기 TIL - Day 20(CS:APP) (0) | 2024.04.08 |
---|---|
크래프톤 정글 5기 TIL - Day 19(CS:APP) (0) | 2024.04.08 |
크래프톤 정글 5기 TIL - Day 18(DP, Greedy, Knapsack) (0) | 2024.04.05 |
크래프톤 정글 5기 TIL - Day 17(LCS) (0) | 2024.04.04 |
크래프톤 정글 5기 TIL - Day 16(알고리즘) (0) | 2024.04.03 |