변수는 데이터를 담는 바구니이다.
변수는 data 영역과 bss 영역에 담을 수 있는데
data에서는 [변수이름] [크기] [초기 값]으로 초기화 된 데이터를 담는다.
[크기]는 db(1바이트) dw(2) dd(4) dq(8)이 있다.
ex) a db 0x11
bss에서는 [변수이름] [크기] [개수]로 초기화 되지 않은 데이터를 담는다.
[크기]는 resb(1) resw(2) resd(4) resq(8)
ex) b resw 0x2222
data영역의 데이터들은 초기 값을 알 수 있지만 bss영역의 데이터들은 초기 값이 0으로 고정된다.
그래서 용량이 줄어든다는 장점이 있다.
이제 메모리의 데이터를 레지스터에 넣을 수 있는지 테스트해보자.

먼저 data에 크기가 다른 변수 a,b,c,d를 만들었다.

그리고 나서 레지스터끼리 데이터를 복사한것과 동일하게 변수 a를 rax에 넣어본다.

결과는 예상하지 못한 값인데 이 값을 메모리에 address 항목을 체크하고 넣어주면

놀랍게도 a와 같은 값을 가진다. 즉 mov rax,a 는 a의 값을 rax에게 주는 것이 아니라 a의 주소를 주는 것이다. 그리고 a의 연속된 값들을 볼 때 a,b,c,d는 쭉 붙어있으므로 0x403010에서 1을 더한 0x403011은 b의 주소이다.그럼 방법을 바꿔보자.


a에 괄호를 씌워주니 제대로 값이 복사되었다. 하지만 a 1바이트 값만 복사된 것이 아닌 주변 값까지 모두 복사되었다.
주변값이 복사되지 않고 정확히 a의 1바이트 값만 복사하는 법은 mov rax가 아닌 al을 사용하면 rax는 8바이트 al은 1바이트이기 때문에 정확히 1바이트만 복사한다. 반대로 상수값이나 레지스터의 값을 메모리로 복사할 수도 있다.


0x5555를 메모리의 a변수 자리에 집어넣었더니 1바이트를 넘는 2바이트 데이터이기 때문에 b변수의 영역까지 침범했다.
'CS' 카테고리의 다른 글
| [어셈블리] 반복문 (0) | 2022.06.18 |
|---|---|
| [어셈블리] 분기문 (0) | 2022.06.18 |
| [어셈블리] 쉬프트 연산 (0) | 2022.06.18 |
| [어셈블리] 입출력, 사칙 연산 (0) | 2022.06.18 |
| [어셈블리] 레지스터 기초 (0) | 2022.06.18 |