SISS/Assembly

메모리 주소지정방식

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 는 반드시 레지스터여야