변수와 레지스터

namu·2022년 6월 17일

메모리에는 Data(초기화한 정적 변수), Text(프로그램 코드) 등
파일의 내용이 그대로 올라간다고 보면 되고,

추가로 BSS(초기화하지 않은 전역, 정적 변수),
Heap(동적 메모리 할당), Stack(지역 변수 등)이 메모리에 할당된다.

변수는 데이터를 저장하는 공간, 레지스터와 차이점은
미리 사용하겠다고 선언(이름과 크기 지정) 해야 한다는 것

; 8 bit = 1 byte
; 16 bit = 2 byte = 1 word
; 32 bit = 4 byte = 2 word = 1 dword (double-word)
; 64 bit = 8 byte = 4 word = 1 qword (quad-word)

; 초기화되는 데이터
; [변수이름] [크기] [초기값]
; [크기] db(define byte, 1), dw(define word, 2), dd(define double-word, 4), dq(define quad-word, 8)
section .data
	a db 0x11
    b dw 0x2222
    c dd 0x33333333
    d dq 0x4444444444444444
; 초기화되지 않는 데이터
; [변수이름] [크기] [개수]
; [크기] resb(1) resw(2) resd(4) resq(8)
section .bss
	e resb 10

초기화되는 데이터와 그렇지 않는 데이터를 구분하는 이유
초기화되지 않는 데이터는 전부 0으로 초기화되고,
이렇게 초기값을 지정하지 않은 부분들까지 실행파일에 전부 담을 필요가 없으니까,
실행파일의 크기가 줄어든다는 장점이 있음.
실질적으로 메모리에 올라갈 때는 각자의 영역이 잡혀서 잘 사용할 수 있게 된다.

; 메모리 <-> 레지스터
; 메모리에는 구분할 수 있도록 주소(번지수)가 있다.
; 여기서 rax에는 a의 값이 아닌 주소가 들어가게 된다.
; a의 주소값은 실행 시마다 달라질 수 있다.
mov rax, a ; a라는 공간의 주소값을 rax에 복사
mov rax, [a] ; a라는 공간 안에 있는 값을 rax에 복사, 0x4433333333222211
mov al, [a] ; 레지스터 a의 하위 8비트에 a의 값을 복사

mov [a], 0x55 ; 빌드 에러, 상수 사용 시 크기를 지정해야 함. 앞에 0이 생략된 형태일 수 있기 때문에.
mov [a], byte 0x55
mov [a], word 0x6666 ; 옆에 있는 메모리를 침범하여 덮어씀. 변수란 우리만의 상상 속에 있는 개념.
mov [a], cl

mov 명령으로 메모리와 레지스터 공간 사이에서 서로 복사할 수 있다.
레지스터와 메모리 간의 핑퐁.

profile
안녕하세요

0개의 댓글