어셈블러에서 메모리 지정문제 어떻게 하고 있을까요..

dionysos의 이미지

어셈블러에서 메모리 명령어들의 주소 공간을 어떡게 access할수

있나요

예를 들면 32비트 컴퓨터에는 2의 32성 까지 4G까지의 메모리를

access할수 있는데 어셈블러 명령어를 보면 ADD m이라고 한다

면 메모리에 binary코드를 로드하고 cpu가 32비트씩 fetch

execute있다면 예를들어 opcode가 8bit 이고, flag가 8bit라고

한다면 나머지인 16bit의 주소공간(15M)을 엑세스할수 밖에 없지

않은가요(물론 base를 사용한다고 해도 프로그램 크기가 16M까

지밖에 안됨니다) 이걸 어떻게 해결하고 있을까요.

base를 바꿔주는 방법도 있지만 너무 효율성이 떨어지는군요

자세한 설명좀 부탁드립니다.

Necromancer의 이미지

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

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.