본문으로 바로가기

[Assembly] 2. 메모리의 사용과 포인터 사용

category Study/Assembly 2018. 10. 30. 10:41
반응형
메모리는 레지스터와 마찬가지로 저장공간이며 휘발성이다. 단 레지스터는 공간이 제한적이지만, 메모리는 (레지스터에 비해) 매우 넉넉하다. 대신 느리다.

순서를 매겨본다면 이렇게 되겠다.

속도 : 레지스터 > 메모리 > 보조기억장치(HDD/SSD)
가격 : 레지스터 > 메모리 > 보조기억장치(HDD/SSD)

메모리를 사용할 때는 일반 상수와 구분을 하기 위해 대괄호를 씌운다.
ex) 메모리 주소가 402000이라고 할때, [402000]으로 사용한다.

mov 명령어에서 메모리를 사용할 때는 mov "크기" ptr ds:[메모리주소]의 꼴로 사용한다. 레지스터의 사용과 다르게 크기가 붙는 이유는 레지스터는 값의 크기가 정해저 있어 크기를 정해줄 필요가 없지만, 메모리는 값의 크기에 따라 내용이 완전히 바뀌고, 메모리의 공간을 지정해줄 때 복잡해지는 것을 막기 위해 크기를 미리 넣어주는 것이다.

실행 예시)

1
2
3
4
5
6
7
8
mov byte ptr ds:[402000], 2 // 메모리 402000에 8bit '2'값을 넣는다.
// 실행값 : 402000 | 02 ( 402000 )
 
mov word ptr ds:[402000], 2 // 메모리 402000에 16bit '2'값을 넣는다.
// 실행값 : 402000 | 00 02 ( 402000, 402001 )
 
mov dword ptr ds:[402000], 2 // 메모리 402000에 32bit '2'값을 넣는다. 
// 실행값 : 402000 | 00 00 00 02 ( 402000 ~ 402003 )
cs

그리고 C언어의 포인터와 같이 메모리의 주소를 다른 메모리의 넣어 사용할 수 있다.

사용법은 간단하다.

1
2
3
4
mov dword ptr ds:[402010], 402000 // 메모리 402010에 메모리 402000의 주소를 넣는다.
 
mov eax, [402010// 레지스터 eax에 402010의 값( 00402000 )을 넣는다.
mov dword ptr ds:[eax], 1 // 대괄호 안에 들어 있는 값은 모두 메모리의 주소로 보기 때문에 eax에 1을 넣는것이 아닌, eax 안에 있는 메모리 402000에 1을 입력한다.
cs

이렇게 실행하면 정상적으로 메모리 402000에 4바이트 1이 들어간것을 알 수있다.


반응형