프로그래밍/C++

#4. 변수와 레지스터

코딩하는상후니 2022. 7. 15. 22:00

*변수의 선언 & 사용
=> 데이터를 저장하는 바구니.
=> 처음 바구니 사용하겠다 선언 => 이름 , 크기 지정
 
 
*어셈블리 데이터 선언 방식
 
*초기화된 데이터 ( section .data )
[변수이름] [크기] [초기값]
[크기] db ( 1 ) / dw ( 2 ) / dd ( 4 )  /  dq ( 8 )
a dd 0
a dw 0
a dd 0
a dq 0
 
 
*초기화 되지 않은 데이터 ( section .bss )
[변수이름] [크기] [개수]
[크기]  resb ( 1 ) / resw ( 2 )  /  resd ( 4 )  /  resq ( 8 )
num resb 10
 
section .data
msg db 'Hello World', 0x00
a db 0x01,
 
section .bss
num resb 1
 

BSS  :  초기화되지 않은 전역, 정적 변수
Data  :  초기화한 전역, 정적 변수
 
 
*왜 Data 영역과 BSS 영역은 구분되어있을까 ??
=> '초기화' 되었냐 되지 않았냐 의 차이
=> 실행파일의 크기가 줄어들게 됨. => 초기화 되지 않았기 때문
=> 아주 오래전에는 메모리 비용이 비쌌기 때문에 최대한 파일 크기를 줄이려는 노력.
 
 
 
*메모리 <-> 레지스터,  두 곳 사이를 이동하는 방법 ??
1. mov [a], dword 0x13
2. mov rax, a
 
1. [ a ] ( a의 값에 ), mov (이동해라.) , dword 0x13 ( dword 의 크기만큼 0x13 이란 값으로. )
a 에는 dword 의 크기이므로, 0x00000013 이 들어가있음.
그림에서, 0x13, 0x0, 0x0, 0x0 으로 들어가 있는걸 볼 수 있음.
그 이후에 있는 데이터들은 레지스터에 값을 이리저리 저장하고 이동하다보니 생긴
쓰레기값이라 생각하면 됨.
 
2. rax ( rx 만큼 a 레지스터에 ), mov ( 이동해라. ) ,  a ( a 의 주소를 )
a  :  주소를 나타냄.
[a]  :  해당 주소에 있는 값을 나타냄.
 
 
*메모리값 -> 레지스터
    mov cl, [a]     
   
*레지스터값 -> 메모리
    mov [a], cl
 

 

본 내용은 인프런의 루키스님 강의를 듣고 정리한 내용입니다.

'프로그래밍 > C++' 카테고리의 다른 글

#6. 사칙연산  (0) 2022.07.15
#5. 문자와 엔디안  (0) 2022.07.15
#3. 레지스터  (0) 2022.07.14
#2. 데이터 기초  (0) 2022.07.14
#1. Assembly SASM  (0) 2022.07.14