어셈블리어 질문입니다.
어셈블리어에서
8086 시스템에선 원래 각각의 레지스터가 16bit이므로 0~65535의 범위 즉 2의 16승밖에는
가질수 없지만 cs ds ss 레지스터는 각각 ip,bp,sp 포인터 레지스터와 연동해서
a41eh 이러한 16진수 주소가 있다고 할때 저장된 내용을 불러와서는
a41e0h 로 0을 더 붙여서 실재주소값은
예> cs + ip 가 되어서
a41e0h
+ 31ah
------------
a44fah
가 된다고 배웠습니다.
이로써 공간을 충분이 넓게 (2의 32승 -1 만큼의범위) 할당받을수 있다고 하더라구요
개념적으로는 이해가 되었는데요
계산해보니 이해가 안되더라구요
16진수 네자리 ffff 는 최대값 65535를 가지고
만약 cs가 10000h 라고의 단위로 끊어진다면 오른쪽 0000 네자리는 ip의 값으로 채울수
있구요
그래서 결론은 한자리수 더 늘어난 다섯자리 2의 20승의 범위(2의 32승이아니라)
를 가질수 있는데요
위 예> 에서 처럼 책에서는 cs의 값중 오른쪽 네자리를 비워놓지 않았습니다.
ip포인터를 채울수 있는데도 말이죠
물론 저렇게 하더라도 이러한 개념의 수행은 가능하다는 것은 알겠습니다.
첫째,
그런데 그 이유가 cs 코드세그먼트 레지스터에 있는 명령어들이 채워지는 순서대로
주소값이 정해지기 때문인가요?
둘째,
또한 배우기로 00을 두개 붙이면 전체범위는 중간부분까지밖에 콘트롤 할수 없게 된다는
데요 이유는 16bit는 64k(65535) 의 크기라서 그렇다는데 왜 그런지 이해할수가없습니다.
a41e00h
+ 31ah
------------
a4201ah
가능한거 같은데요
이런식으로 해서 0을 네게 0000 붙이면 2의 32승도 가능할거같은데요
셋째,
그렇다면 어떻게 해서 2의 32승의 범위를 콘트롤 할수 있다는 것인지 정말 알고싶습니다.
세가지 질문 답변 부탁드립니다.
Re: 어셈블리어 질문입니다.
책이 잘못 되었습니다.
그렇게 안되는 이유는 하드웨어적으로 지원하지 않기 때문입니다. 세그먼트 레지스터는 무조건 왼쪽으로 4칸 쉬프트하게 고정되어 있습니다.
8086에서는 불가능합니다.
아무래도 16비트 레지스터 두개를 묶어서 32비트 연산이 가능하다는 점과
아무래도 16비트 레지스터 두개를 묶어서 32비트 연산이 가능하다는 점과 세그먼트 어드레싱에 대해서 혼동하시는 것 같은데, 전자는 32비트 연산을 할 수 있고(2^32), 후자는 주소 지정에만 사용되고 20비트로 고정되어 있습니다(8086과 그 이후 CPU의 호환 모드에서는).
--
익스펙토 페트로눔
댓글 달기