Programming/Assembly

어셈블리어 - 레지스터(Register)

lee308812 2021. 3. 13. 12:52

[ Register ]

- 레지스터 : 프로세서(CPU)가 사용하는 메모리

- CPU 안에 존재하며 가장 속도가 빠른 저장장치이며 비용이 비싸고 용량이 작다.

(레지스터 > 캐시 메모리 > 메인 메모리(주로 DRAM) > 하드디스크/SSD)

 

[ 64-Bits General Purpose Register ]

 

- 범용 레지스터. 연산결과, 상수, 주소 등을 저장한다.

- RAX, RBX, RCX, RDX, RSP 등 여러개가 존재하는데 우리는 주로 A,B,C,D를 사용한다.

- 어셈블리어에서 해당 레지스터의 몇 byte를 사용할 것인지에 따라 아래와 접두어/접미어를 다르게 붙여서 사용한다. 

 

 

A 레지스터

- RAX : 8bytes = 4 word = 1 qword

- EAX : 4bytes = 2 word = 1 dword

- AX : 2bytes = 1 word

- AH, AL : 1byte

mov al, 0x11  ; A레지스터의 하위 2byte에 0x11를 write한다.

 

[ 어셈블리어 ] 

 우리가 영어로 되어있는 프로그래밍 언어를 작성해도 컴퓨터가 영어를 알아들을리 없다. 따라서, 컴파일러를 사용해 우리가 작성한 프로그래밍 언어 소스 파일을 기계어로 변환해주게 된다. 그 중에 어셈블리어는 가장 기계어에 가까운 low 레벨에 해당하는 프로그래밍 언어이며, 어셈블리어에 대응되는 컴파일러를 어셈블러라고 한다. 

 

어셈블리의 IDE(통합 개발 환경)는 구글에서 SASM이라고 검색해서 내려받을 수 있다.

SASM - Simple crossplatform IDE for NASM, MASM, GAS, FASM assembly languages (dman95.github.io)

 

SASM - Simple crossplatform IDE for NASM, MASM, GAS, FASM assembly languages

SASM SASM (SimpleASM) - simple Open Source crossplatform IDE for NASM, MASM, GAS, FASM assembly languages. SASM has syntax highlighting and debugger. The program works out of the box and is great for beginners to learn assembly language. SASM is translated

dman95.github.io

 다운로드 받아 설치 후, 만약 64bit 환경일 경우 [Settings] - [Settings] 에서 Build 탭에서 Mode를 반드시 x64로 체크해줘야한다.

 

[ MOV 명령어 ]

- 데이터를 복사하는 명령어이다. (이동이 아니다!)

- 사용법 : mov a, b (b를 a로 복사한다.)

- 아래와 같이 코드를 작성하고, xor rax, rax에 breakpoint를 걸고 F5를 눌러 실행한다.

breakpoint가 걸린 상태에서, [Debug] - [Show registers]를 체크해주면 아래와 같이 Register 값을 볼 수 있다.

%include "io64.inc"

section .text ; .text section은 우리가 작성할 코드 영역을 의미한다.
global CMAIN
CMAIN:
    mov rbp, rsp; for correct debugging
    ;write your code here
    
    ; A레지스터에 8byte 크기로 0x1111111111111111 write
    mov rax, 0x1111111111111111    
    
    ; B레지스터에 4byte 크기로 0x22222222 write
    mov ebx, 0x22222222
    
    ; C레지스터에 2byte 크기로 0x3333 write
    mov cx, 0x3333
    
    ; D레지스터에 1byte 크기로 0x44 write
    mov dl, 0x44
    
    xor rax, rax
    ret

여기서, 레지스터 D(rdx)는 하위 1바이트에만 0x44를 복사하였으므로 상위 7byte는 쓰레기값으로 남아있어 이상한 값으로 보이는 것이며(실행 환경마다 값이 다르다), 하위 1바이트에 0x44는 정상적으로 복사된 것을 확인할 수 있다.

물론, 레지스터에서 다른 레지스터로 MOV하는 것도 가능하다.

; D레지스터에서 64byte 크기로 A레지스터에 가져온다.
mov rax, rdx