2013-12-11 3 views
1

다양한 명령어 세트 아키텍처의 워드 크기 및 어셈블리 언어와의 관련성에 대한 질문은 아래를 참조하십시오. 모든 도움을 주셔서 감사합니다.워드 크기 및 표시 형식

처음 몇 가지 사실 (이 중 하나라도 잘못 되었다면 수정하십시오). 프로세서 아키텍처의 말씀 크기가 나타냅니다

  1. 각의 최대 크기는
  2. 각 메모리 주소의 최대 크기 (양을 등록 : (EDIT 이들 중 일부는 잘못했다, 아래 Seva의의 게시물을 참조하시기 바랍니다) 언급 할 수있는 메모리)의
  3. CPU가 단일 명령으로 처리 할 수있는 가장 큰 정수
  4. 단일 조작
,536에 및 상기 작업 메모리에서 전송 될 수있는 데이터의 가장 큰 부분
  • 여기에 정말 이상한 점이 있습니다. IA-32 용 어셈블리 언어에서 단어는 16 비트 길이으로 지정됩니다. IA-32는 32 비트 컴퓨팅을 지원하는 모든 x86 버전을 의미합니다 (즉, 단어는 32 비트 길이 임).

    그저 단어의 전체적인 이해를 돕고 위의 내용이 위의 목록과 구분됩니다.

    , 날이의 하단에 도착 해 주셔서 감사합니다

    매그너스

    편집 2 : x86 아키텍처에 두 유용한 링크 아래를 참조하시기 바랍니다. 아래 altie에 의해 게시 된

    1. : http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture
    2. 내가 건너 발견 간단한 86 가이드 : 그 가정의 http://www.swansontec.com/sintel.html
  • +1

    _ "프로세서 아키텍처의 워드 크기는 각 명령어의 크기를 나타냅니다." 예를 들어, x86은 가변 길이 명령어를 사용합니다. – Michael

    +0

    죄송합니다. 내 게시물을 업데이트합니다. – Magnus

    +0

    x86은 아마도 "단어"의 정의에 사용하는 최악의 예제 일 것입니다. – harold

    답변

    6

    모든 반례가 있습니다.

    각 명령

    인텔 x86의 크기는 영원 전부터 가변 길이 명령어를했다. Thumb-2 모드에서는 ARM도 마찬가지입니다. 각의 최대 크기는

    뜻 등록

    -정수 레지스터, 맞죠? 인텔의 부동 소수점 레지스터는 예를 들어 10 바이트 길이입니다. 이것은 가장 가까운 것입니다. 그러나 Intel x86은 주목할만한 예외입니다. "word"에 대한 정의는 16 비트 CPU의 시점에서 수정되었습니다. ISA가 계속 움직이면서 정의가 멈췄다.

    마찬가지로 ARM의 AArch64 명령어 세트에서 "word"는 "32 비트"를 의미하고 범용 레지스터는 64 비트입니다. "단어"의 정의는 ARM의 32 비트 전성기에서 수정되어 이후로 계속 유지되었습니다.

    분명히 잘못된 각각의 메모리 주소의 가장 큰 크기입니다. 16 비트 Intel 286에는 24 비트 주소 공간이 있습니다. 이 작업은 메모리 관리 장치 (MMU)를 통해 수행됩니다. 레지스터의 사용자 수준 주소는 메모리 하위 시스템에 들어가는 실제 주소와 다릅니다. 최근 인텔 CPU에서 PAE와 동일합니다. 예전에는 Intel x86의 선형 20 비트 주소가 16 비트 세그먼트와 오프셋으로 만들어졌습니다. 예외를 제외하고는 그러나 다시 - CPU가 단일 명령어

    이 하나를 처리 할 수 ​​

    가장 큰 정수 가깝습니다. 여기 저기에 두 개의 등록 명령이 있습니다. MIPS에는 hi : lo - 하나의 64 비트 레지스터 역할을하는 전용 비트 쌍 (32 비트 레지스터)이 있습니다. 인텔은 xDX : xAX 쌍에 대해 작동하는 명령을 가지고 있습니다. 그리고 SIMD에서 시작하지 마라.

    한 번의 동작으로 상기 작업 메모리로 전송 될 수있는 데이터의

    큰 조각

    ARM은 16 개 개의 레지스터를 저장할 수있는 "로드 여러"및 "저장소 여러"명령이 한 가지. 인텔에는 PUSHA/POPA가 있습니다. 물리적 인면에서 메모리 버스도 다양합니다.

    더러운 사실은 단어가 나타나는 책의 컨텍스트와 단어를 사용하는 어셈블러 밖의 단어에 대한 진정한 정의가 하나도 없다는 것입니다. 인텔에서는 "단어"는 시대에 뒤 떨어진 16 비트 청크를 나타냅니다. CPU가 32 비트와 64 비트가됨에 따라 정의를 그대로 유지했습니다. 이제는 DWORD와 QWORDS에 대해 이야기하고 있습니다. 최신 64 비트 인텔 CPU의 레지스터는 QWORD 크기입니다. Intel보다 더 이상 엄격하지 않은 Windows API는 16 비트 Intel에서 태어 났으며 여전히 데이터 유형을 유지합니다. WORD은 windows.h에 unsigned short (2 바이트)로 정의되어 있으며 변경이 불가능합니다. 따라서 구조 레이아웃, 즉 모든 곳의 바이너리 형식이 손상 될 수 있습니다.

    반면에 "word"는 AArch64 명령어 세트의 컨텍스트에서도 32 비트를 나타냅니다. 따라서 16 비트 피연산자와 함께 작동하는 "하프 워드로드"와 같은 어셈블리 명령이 있습니다. 그래서 C에서 Windows 용 ARM (Windows Phone, Windows RT, Windows CE/Mobile) 및 어셈블리 용으로 코딩 할 때 두 가지 다른 정의를 명심해야합니다. 다행히도, 모호함을 감안할 때, 아무도 단어의 관점에서 생각하지 않습니다. 적어도 자신의 마음에 실제 크기를 유지하지 않고는 말입니다. 또한 ARM의 어셈블리 언어는 필요할 때마다 16 비트 변수를 승격시켜 가능한 한 32 비트 값으로 작업 할 것을 강력히 권장합니다. 따라서 함수에 대한 16 비트 매개 변수조차도 내부적으로 32 비트 레지스터로 전달됩니다.

    +0

    흠. 그렇다면 ISA가 메모리 주소의 크기가 아니라면 32 비트 ISA라고 말하는 것은 무엇을 의미합니까? – Magnus

    +0

    우리가 "고도의 문맥에 의존하는 명령문"이라고 부르는 것입니다. 명령 크기가 정확히 32 비트 인 명령 세트 (ARM 또는 MIPS에 적용). ** 기본 ** 레지스터 크기가 32 비트이지만 (인텔에 적용되는 것처럼) 무시할 수있는 ISA. 평소처럼 악마가 세부 사항에 있습니다. –

    +0

    ARM은 Thumb이라는 모드를 사용했지만 레지스터와 주소는 여전히 32 비트이지만 명령은 모두 16 비트였습니다. 따라서 32 비트 코드와 16 비트 ARM 코드에 대해 바닐라 ARM과 Thumb을 의미합니다. Thumb ("Thumb-2")의 현대적인 맛은 가변 길이 인코딩 (16 또는 32 비트)을 사용합니다. 따라서 더 이상 16 비트 코드를 말하는 것은 불공평합니다. 이제는 "Thumb 코드"입니다. –

    1

    Seva의 진술 "내가 SIMD에서 시작하게하지 마라."에 대해 자세히 설명하기 위해 많은 x86 명령어가 많은 피연산자 유형을 지원합니다. 자세한 내용은 여기를 참조하십시오. http://en.wikibooks.org/wiki/X86_Assembly/X86_Architecture

    CPUID 명령 출력의 다양한 필드에서 이러한 모드가 지원되는지 여부를 알 수 있습니다. 예를 들어 SSE 플래그는 XMM 레지스터가 사용 가능한지 여부를 알려주고 AVX 플래그는 사용 가능한 YMM 레지스터가 있는지 알려줍니다.

    +1

    고마워, 그 링크는 매우 유용합니다. 나는 그것을 메인 포스트에 추가 할 것이다. – Magnus