할 수 없는 이유는 무엇 값을 변경하 세그먼트에 등록?(MASM)

StackOverflow https://stackoverflow.com/questions/125532

  •  02-07-2019
  •  | 
  •  

문제

기로 결정했을 가르치는 자신이 어셈블리 언어입니다.

내가 깨달았는 내 프로그램 컴파일되지 않는 경우 시도 값을 변경하려면 모든 세그먼트에 등록합니다.

는 모든 문서가 발견했다고 말할 수 있는 실제로 값을 변경이 적어도 4 세그먼트를 등록,그래서 무엇이 있나요?

나는 정말에만 관심이 있는 이 시점에서,나는 없다 진정한 목적 변화에서 이러한 주소가 있습니다.

도움이 되었습니까?

해결책

당신이 말한 당신에 관심있는 이유는,그래서:

얼 모드에서,세그먼트는 64K"창에서"육체적 기억과 이러한 창은 간격 16 바이트다.보호 모드에서,세그먼트를 창을 실제 또는 가상 메모리 크기와 위치에 의해 결정됩 OS,그리고 많은 다른 속성을 포함하여 권한 수준 프로세스에 액세스할 수 있어야 하니다.

여기에서,모든 것을 내가 말을 참조하여 보호되는 모드입니다.

테이블이있 메모리에서 글로벌라는 설명이블(GDT),어디에 대한 정보를 이러한 창문 크기와 위치와 다른 속성을 유지합니다.또한 있을 수 있습니다 로컬 설명자의 테이블에 기초 과정,그리고 그들은 작업에서 유사한 방법으로,그래서 그냥에 초점을 GDT.

값을 로드하 세그먼트로 기록으로 알려져 세그먼트의 선택.그것은 지수로 GDT 또는 LDT,의 비트와 함께 여분의 보안 정보가 들어 있습니다.자연적으로는 경우 프로그램을 로드하는 설명자는 외부의 경계를 GDT,예외가 발생합니다.또한하는 경우 프로세스가 없는 충분한 권한 액세스하 세그먼트,또는 다른 뭔가가 잘못된 예외가 발생합니다.

예외가 발생하면 커널을 처리합니다.이런 예외의 것으로 분류 segmentation fault.그래서 OS 죽이 당신의 프로그램입니다.

거기에 하나의 마지막 주의:에서는 86 명령어 집합할 수 없습니다드 즉각적인 값으로 세그먼트 레지스터가 있습니다.를 사용해야 합니다 중간 등록하거나 메모리 연산자 또는 팝업으로 세그먼트에 등록합니다.

MOV DS, 160  ;INVALID - won't assemble

MOV AX, 160  ;VALID - assembles, but will probably result in an
MOV DS, AX   ;exception, and thus the death of your program

나는 그것이 지적되어야 하는 건물에 대 한 수 있습의 힙 세그먼트가 있습니다.하지만 AFAIK 올 때,주류 86 운영 체제 세그먼트 레지스터 역할만 몇 가지 목적:

  • 보안 메커니즘을 유지하는 등 사용자 공간에서 프로세스를 해치지 서 OS
  • 을 다루는 여러/멀티 코어 프로세서
  • 실 로컬 저장소:으로 최적화,몇몇 운영체제(을 포함한 리눅스와 윈도우)사용 세그먼트에 등록을 위한 스레드 로컬 저장(TLS).이후 스레드 공유하는 동일한 주소 공간,그것은 어려운 스레드를 알고""그 TLS 지역을 사용하지 않고 시스템 전화 또는 낭비 등록...하지만 이후 세그먼트 레지스터는 실질적으로 쓸모 없에서"을 낭비하"그들의 이익을 위해 빠른 TLS.참고 설정할 때 이까지,OS 건너 뛸 수 있는 세그먼트 레지스터에 직접 쓰 기술자 캐시 등록하는"숨"등록 사용하여 캐시 GDT/LDT 조회에 의해 트리거 참조하 세그먼트 레지스터 어떤 경우에는,당신이 시도하는 경우에서 읽을 세그먼트 레지스터 당신은 그것을 볼 수 없습니다.

외에도 세그먼트를 스레드당 TLS,정말로 소수에 의 세그먼트(번의 프로세서)사용하고 있습니다.응용 프로그램 프로그램 을 무시하 세그먼트 레지스터가 있습니다.

이 때문입 OS 디자인하지 않는,어떤 기술적인 제한 사항이 있습니다.가 포함 될 수 있습 운영 시스템을 필요로 하는 사용자 공간 프로그램과 함께 작동하는 세그먼트 레지스터,하지만 모르겠습니다.

다른 팁

Windows 실행 파일을 작성하고 있습니까?

보호 모드 (Win32)에서는 세그먼트 레지스터가 더 이상 사용되지 않습니다.

참조:

메모리 모델은 16 비트 세계의 예전과도 크게 다릅니다. Win32에서는 더 이상 메모리 모델이나 세그먼트에 관심이 없습니다! 메모리 모델은 하나뿐입니다 : 플랫 메모리 모델. 더 이상 64K 세그먼트가 없습니다. 메모리는 4GB의 넓은 연속 공간입니다. 또한 세그먼트 레지스터를 사용하지 않아도됩니다. 모든 세그먼트 레지스터를 사용하여 메모리 공간의 모든 지점을 해결할 수 있습니다. 그것은 프로그래머에게 큰 도움이됩니다. 이것이 Win32 어셈블리 프로그래밍을 C만큼 쉽게 만드는 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top