Offset : 기준 주소에서 얼만큼 떨어진 곳에 떨어진 메모리를 지칭 (변위차를 나타내는 정수형)
1) char a[6] = {0, 1, 2, 3, 4, 5}; : Offset으로 값을 이용해보자.
# 기준 주소 : 402000. 총 6 바이트를 사용할 것
우선 레지스터 EBX에 기준 주소값인 402000을 넣어주고, 다음과 같은 어셈블리를 작성한다.
기준 주소를 시작으로 주소값에 Offset을 더해 값을 0부터 5까지 넣어준다.
2) char a[3] = {0, 1, 2}; : Offset으로 레지스터를 이용해보자.
우선 ECX에 0 값을 저장해주고, 402000 주소에서 ECX의 값만큼 주소를 이동하여 CL값을 넣어준다.
첫 번째로 어셈블리를 실행하면 ECX의 값이 0이기 때문에 402000 주소의 값도 0이고, INC ECX를 해주면 1만큼 값이 증가하여 ECX의 값은 1이 된다.
그리고 다시 두 번째 어셈블리를 실행하면 ECX의 값이 1이 되었기 때문에 저장될 주소 역시 1만큼 증가하여 402001이 된 것을 알 수 있고, CL 값도 1이기 때문에 402001 주소에는 1의 값이 들어가 있음을 알 수 있다.
INC ECX를 다시 실행하면 1만큼 증가하여 ECX의 값이 2가 되고,
마지막으로 세 번째 어셈블리를 실행하면 ECX의 값은 2이므로 저장될 주소는 402002가 되고, CL 값도 2 이므로 402002 주소에는 2가 저장됨을 확인할 수 있다.
3) int a[3] = {0, 1, 2}; : Index를 이용해보자.
int형이기 때문에 주소값은 4 byte씩 증가해야 한다.
4 byte 공간을 이용하기 때문에 DWORD PTR로 크기를 4 byte만큼 지정한다.
ECX에 0 값을 다시 넣어준 뒤, 첫 번째 어셈블리어를 실행하면 ECX의 값이 0이기 때문에 402000 주소의 값도 0이 된다.
ECX를 1만큼 증가시킨 뒤, 두 번째 어셈블리를 실행하면 ECX의 값은 1이므로 ECX X 4 + 402000 = 402004가 된다. 402004 주소에 현재 ECX의 값인 1이 저장된다.
다시 ECX를 1만큼 증가시킨 뒤, 세 번째 어셈블리를 실행하면 ECX의 값은 2이므로, ECX X 4 + 402000 = 402008이 되며, 402008 주소에 현재 ECX의 값인 2가 저장된다.
다음과 같이 Index와 기준주소를 쓰고 Offset을 같이 사용할 수 있다.
그러나 다음과 같이 레지스터에 기준 주소를 저장한 후 기준 주소 대신 레지스터를 사용할 수는 없다.
메모리 주소를 지정할 때는 다음과 같은 규칙에 따라 지정해야 한다.
- [base 주소 + offset + index * scale]
- 레지스터 개수 최대 2개
- index 는 반드시 레지스터여야
'SISS > Assembly' 카테고리의 다른 글
조건분기명령어 JNE, JA, JB 상태 레지스터 CF, JA JB에 N과 E 붙이기 (0) | 2018.08.19 |
---|---|
조건분기명령어 JZ(JE) 상태레지스터 ZF (0) | 2018.08.12 |
레지스터로 주소지정하기 (0) | 2018.07.28 |
ADD, SUB (0) | 2018.07.28 |
증감 명령어 (0) | 2018.07.28 |