1. 메모리 크기 지정
1) DWORD, WORD, BYTE PTR
MOV DWORD PTR DS [402000], EAX
- PTR : Pointer - 메모리 공간을 가리킴
- DWORD(4 byte), WORD(2 byte), BYTE(1 byte) :
# WORD : 16 bit에서 사용된 단위. 32 bit가 되면서 WORD가 확장된 Double WORD 나타남.
=> [402000]에 4 바이트만큼 사용하여 EAX 값을 저장하겠다는 의미
=> [402000]에 2 바이트만큼 사용하여 AX 값을 저장하겠다는 의미
=> [402000]에 1 바이트만큼 사용하여 AL의 값을 저장하겠다는 의미
부여하고자 하는 메모리 공간의 크기와 값의 크기가 동일해야 한다.
EX) WORD는 2 byte이지만 EAX는 4 byte이기 때문에 크기가 동일하지 않아 다음과 같은 오류가 발생한다.
NOP : No Operation _ 아무것도 동작하지 않음.
♠ 주의할 점 ♠
: 위에서 EAX, AX, AL 등에 저장되어 있는 값을 메모리에 저장할 때는 레지스터의 크기가 이미 정해져있기 때문에 메모리에 크기를 직접 지정하지 않아도 자동으로 지정이 가능했다.
그러나 아래와 같이 크기가 정해져 있지 않은 값을 메모리에 저장하고자 하면 크기를 구체적으로 지정해달라는 오류가 발생한다. 이러한 경우에는 직접 메모리의 크기를 지정해주어야 한다.
=> 4 byte 크기 만큼 메모리에 0값을 저장한다.
2) dump 창에서 값 저장하기
① 저장하고 싶은 값의 크기만큼 dump 창에서 드래그를 해준 후 마우스 오른쪽 > Edit > Binary edit을 누른다.
② 다음과 같은 창이 뜨면 저장하고 싶은 값을 입력해주면 된다.
# 왼쪽 밑의 Keep Size를 체크하면 드래그했던 크기만큼만 저장할 수 있지만 체크를 해제하면 원하는만큼 값을 더 입력할 수 있다.
(위의 값을 넣었을 때 dump 창)
# Assemble 창에서도 Keep size를 체크표시한 후 아래와 같이 입력하면 이 어셈블리를 위한 공간이 없다는 오류가 발생한다. 여기서 0을 16 byte로 인식하기 때문이다. 따라서 저 어셈블리를 실행시키려면 keep size의 체크표시를 해제해주어야 한다.
③ 값을 입력한 후에 전 상태로 돌리고 싶다면 마우스 오른쪽 > Edit > Undo selection을 누르면 된다.
2. 메모리 저장방식 : Little Endian, Big Endian
1) Little Endian 리틀 엔디언 : 낮은 자리부터 메모리에 저장
- 장점 : 낮은 자리의 데이터가 먼저 오기 때문에 부분을 읽기가 쉽고, 더 높은 자리의 데이터를 추가하기가 쉽다. 또한, CPU가 데이터를 읽을 때 편리하다.
2) Big Endian 빅 엔디언 : 높은 자리(Most Significant)부터 메모리에 저장
- 장점 : 사람이 읽기 편하다.
현재 [402001] 주소의 메모리에 12345678을 넣어주는 어셈블리를 작성하였는데, dump창을 확인해보면 12345678이 아닌 78 56 34 12 가 저장되어있는 것을 알 수 있다. 이는 인텔 32 bit가 리틀 엔디언 방식을 따르고 있기 때문이다.
다음과 같이 값 3456을 저장할 때에도 34 56으로 저장되는 것이 아닌 56 34로 저장된다.
위에서 [402000]에 저장한 3456 값을 AX에 저장하고 modify EAX 창을 켜서 보면 dump 창에서는 56 34로 저장되었지만 AX에는 3456 그대로 잘 저장되어있는 것을 확인할 수 있다.
'SISS > Assembly' 카테고리의 다른 글
증감 명령어 (0) | 2018.07.28 |
---|---|
JMP 명령어 (0) | 2018.07.22 |
메모리 주소와 접근 (0) | 2018.07.18 |
범용레지스터와 메모리 (0) | 2018.07.16 |
Assembly의 시작 (0) | 2018.07.01 |