어셈블러에서 메모리 지정문제 어떻게 하고 있을까요..
글쓴이: dionysos / 작성시간: 일, 2005/04/03 - 12:18오후
어셈블러에서 메모리 명령어들의 주소 공간을 어떡게 access할수
있나요
예를 들면 32비트 컴퓨터에는 2의 32성 까지 4G까지의 메모리를
access할수 있는데 어셈블러 명령어를 보면 ADD m이라고 한다
면 메모리에 binary코드를 로드하고 cpu가 32비트씩 fetch
execute있다면 예를들어 opcode가 8bit 이고, flag가 8bit라고
한다면 나머지인 16bit의 주소공간(15M)을 엑세스할수 밖에 없지
않은가요(물론 base를 사용한다고 해도 프로그램 크기가 16M까
지밖에 안됨니다) 이걸 어떻게 해결하고 있을까요.
base를 바꿔주는 방법도 있지만 너무 효율성이 떨어지는군요
자세한 설명좀 부탁드립니다.
Forums:
x86의 경우는 가변입니다.제가 기억하기로는 x86 기계어코드는
x86의 경우는 가변입니다.
제가 기억하기로는 x86 기계어코드는
opcode, modrm, sib, displacement, immediate 순으로 나갑니다.
물론 이들이 모두 들어오지 않습니다.
길이도 가변입니다. 32비트 머신이라고 기계어가 모두 32비트 길이인
것은 아닙니다. (x86은 대략 1-17바이트)
opcode는 말 그대로 명령어 코드이고 (1-2바이트)
modrm은 오퍼랜드에 무엇이 들어오는지 판별할때 사용하고 (1바이트)
sib는 메모리 주소 지정시에 옵션으로 추가됩니다. (1바이트)
displacement는 메모리 주소 오프셋 (1/2/4바이트)
immediate는 오퍼랜드에 즉치 데이터가 들어갈 경우 즉치데이터값(1/2/4바이트)
이외에 세그먼트 오버라이드나 repXX류의 전치코드들은 opcode 앞에
붙습니다.
메모리주소는 modrm과 sib에 의해 주소지정모드가 결정되는데,
메모리주소가 직접 숫자나 레지스터 한개 정도로만 지정되는 경우
modrm만 있어도 되지만 2개 조합이거나 스케일이 추가되면 sib가
부가되죠.
*추가*
mips 같은 risc에서 기계어는 길이가 고정되어 있는데,
이 경우에는 메모리 주소를 모두 레지스터를 이용해서
하도록 하는 방법을 사용하고 있습니다. 다만 님말씀대로
부가 변위가 들어가는 경우 부가 변위에 할당되는 비트에 따라
제한이 들어가죠. 16비트로 제한할 경우 레지스터가
가리키는 지정주소에서 -32768~+32767까지만 되도록 하는 등등
Written By the Black Knight of Destruction
댓글 달기