GaGe

어셈블리어 06. 메모리 크기 지정 본문

SISS (2017-2018)/어셈블리어

어셈블리어 06. 메모리 크기 지정

Sorrel 2018. 7. 15. 17:57


전 시간에서 봤던 byte ptr에 대해서 알아보겠다.

 byte뿐만 아니라
dword,

 
word도 존재한다.

그렇다면 이것들이 의미하는 바는 무엇일까?

그 전에 공통적으로 들어가는 PTR이 의미하는 바는 무엇일까?
ptr은 c언어에서도 배웠듯, 포인터의 줄인 말이다. 어셈블리어에서의 포인터는 메모리의 공간을 가리키는 말이다.



DWORD = 4byte (d=double)
WORD = 2byte
BYTE = 1byte

32비트 구조다라고 했을 때 word(기본)=4byte여야 자연스러운 것 같은데 사실은 2byte인 이유는 원래 16비트였었는데 32비트로 확장이 된 것이기 때문에 word의 의미를 4byte로 바꾸면 헷갈릴까봐 원래의 의미인 2byte로 계속 쓰도록 했기 때문이다.
32비트에서는 확장된 개념인 dword를 쓴다.

다시 코드로 돌아와서 dword ptr 402000이라 함은 402000주소부터 4바이트를 사용하겠다 라는 의미다.  위에 있는 코드처럼 eax가 4바이트니까!


그럼 eax크기 (4byte) 인데 word를 넣으면 어떻게 될까?


예상한대로 size오류가 난다.


eax의 값을 402000에 넣어서 실행시켰다.
여기서 주의! eax는 75459191인데 왜 메모리에는 91914575가 들어갔을까? 왜 반대일까?

이것은 인텔이 리틀엔디안이라고 낮은 자리의 바이트를 먼저 넣게 하는데, 이는 다음 시간에 설명!

즉 dword ptr은 메모리공간 사용의 크기를 지정한다는 말이다.

(nop는 no operation의 약자로 아무 실행도 하지 않고 패스패스 하는 의미)



402000에 cx값도 넣어보고



402000에 dl값도 넣어보고

다양한 크기의 값을 넣어보았다.


메모리에 숫자를 넣어보자.
mov [402000],0
그럼 0은 레지스터 때와는 다르게 크기를 모른다.


그래서 에러가 뜬다
mov dword ptr [402000],0을 넣어서 해결!
0이 4byte의 0이구나 라는 것을 알려준다.


명령어 말고 바로 메모리 공간의 값을 직접 바꿔보자.
dump 창을 클릭하고 해당 영역을 드래그 한 다음에 우클릭하고 edit(ctrl+e)을 클릭하면 바로 바꿀 수 있는 창이 뜬다.

여기서 keep size를 주의해야 하는데
keep size를 하면 드래그 한 부분까지만 갖ㅅ이 들어가고 더 눌러도 써지지 않는다. keep size를 안 하면 숫자를 계속 치면 계속 들어간다. 그러면 드래그 한 곳 이후까지도 값이 저장된다. 변경을 취소하려면 우클릭에 undo selection을 하면 된다.



이렇게 드래그 한 부분은 4byte뿐인데 값이 그 이후에도 들어간다.





코드 중에 ds가 있는데 이것은 뭐냐.
segment를 의미하는데 종류는 ds cs es fs gs ss등이 있다.
프로그램의 각 부분을 가리키는 것을 담당한다.
ex) cs는 코드 영역을 읽어오는구나~
ds는 데이터 영역에서 읽어오는구나~
ss는 셋팅 영역에서 읽어오는구나~
라고 대충 판단이 가능하다.
Comments