컴퓨터 지식 네트워크 - 컴퓨터 설치 - 어셈블리 언어에서 cs.ds.es.ss를 어떻게 사용합니까?

어셈블리 언어에서 cs.ds.es.ss를 어떻게 사용합니까?

사용 방법을 알고 싶다면 그 목적, 다른 레지스터와 어떻게 협력하는지, 레지스터 주소 지정 및 메모리 주소 지정이 어떻게 수행되는지 이해해야 합니까? 다른 레지스터를 포함하지 않고 이러한 세그먼트 레지스터에 대해 이야기하는 것만으로는 이를 진정으로 이해하고 마스터할 수 없습니다. 학습은 단계별로 이루어져야 합니다. "모래 위에 높은 플랫폼을 쌓지 마십시오."

---------------

레지스터는 중앙 처리 장치 공유의 필수적인 부분입니다. 레지스터는 제한된 저장 용량을 가진 고속 저장 구성 요소로 명령, 데이터 및 주소를 임시로 저장하는 데 사용할 수 있습니다. 중앙 프로세서의 제어 장치에는 명령 레지스터(IR)와 프로그램 카운터(PC)가 포함됩니다. 중앙 처리 장치의 산술 및 논리 구성 요소에 포함된 레지스터는 누산기(ACC)입니다.

레지스터는 메모리 계층 구조의 최상위이며 시스템이 작동 데이터를 얻는 가장 빠른 방법입니다. 레지스터는 일반적으로 보유할 수 있는 비트 수로 측정됩니다(예: "8비트 레지스터" 또는 "32비트 레지스터"). 레지스터는 현재 레지스터 파일로 구현되지만 여러 시스템에서 별도의 플립플롭, 고속 코어 메모리, 박막 메모리 및 기타 수단을 사용하여 구현될 수도 있습니다.

레지스터는 일반적으로 명령어의 출력이나 입력에 의해 직접 인덱싱될 수 있는 레지스터 그룹을 참조하는 데 사용됩니다. 이를 "건축 등록부"라고 부르는 것이 더 적절합니다.

예를 들어 x86 명령어는 8개의 32비트 레지스터 세트를 정의하지만 x86 명령어 세트를 구현하는 CPU에는 8개가 넘는 레지스터가 포함될 수 있습니다.

레지스터는 CPU 내부의 구성 요소로, 읽기 및 쓰기 속도가 매우 빠르므로 레지스터 간 데이터 전송이 매우 빠릅니다.

[이 단락 편집] 레지스터의 목적

1. 레지스터의 데이터는 산술 및 논리 연산을 수행하는 데 사용될 수 있습니다.

2. 주소; 레지스터에 저장 메모리의 특정 위치, 즉 주소 지정을 가리키는 데 사용할 수 있습니다.

3. 컴퓨터 주변 장치에 데이터를 읽고 쓰는 데 사용할 수 있습니다.

[이 단락 편집] 데이터 레지스터

8086에는 14개의 16비트 레지스터가 있습니다. 이 14개의 레지스터는 (1) 범용 레지스터와 (2) 명령 포인터로 나눌 수 있습니다. , (3) 플래그 레지스터 및 (4) 세그먼트 레지스터 등 4가지 범주를 사용합니다.

(1) 8개의 범용 레지스터가 있으며 2개의 그룹으로 나눌 수 있습니다. 한 그룹은 데이터 레지스터(4)이고 다른 그룹은 포인터 레지스터와 인덱스 레지스터(4)입니다.

p >

데이터 레지스터는 다음과 같이 구분됩니다.

AH&AL=AX(누산기): 연산에 자주 사용되는 누적 레지스터입니다. 또한 곱셈 및 나눗셈과 같은 명령어에서 피연산자를 저장하도록 지정됩니다. 모든 I/O 명령 이 레지스터는 외부 장치와 데이터를 전송하는 데 사용됩니다.

BH&BL=BX(base): 기본 주소 레지스터, 주소 인덱스에 자주 사용됩니다.

CH&CL=CX (count): 계산 레지스터, 계산에 자주 사용됩니다. 시프트 명령, 루프 및 문자열 처리 명령에서 암시적 카운터로 사용되는 것과 같이 계산된 값을 저장하는 데 자주 사용됩니다.

DH&DL=DX(data): 데이터 레지스터, 데이터 전송에 자주 사용됩니다.

이들 4개의 16비트 레지스터는 상위 8비트(AH, BH, CH, DH)와 하위 8비트(AL, BL, CL, DL)로 나눌 수 있다는 것이 특징입니다. 이 두 세트의 8비트 레지스터는 개별적으로 주소를 지정하고 독립적으로 사용할 수 있습니다.

다른 그룹은 다음을 포함하는 포인터 레지스터와 인덱스 레지스터입니다.

SP(스택 포인터): SS와 함께 사용되는 스택 포인터는 현재 스택 위치를 가리킬 수 있습니다.

p>

BP(Base Pointer): SS의 상대 기본 주소 위치로 사용할 수 있는 베이스 포인터 레지스터,

SI(Source Index): 소스 인덱스 레지스터는 DS 세그먼트 소스 인덱스 포인터를 기준으로 저장하는 데 사용할 수 있습니다.

DI(대상 인덱스): ES 세그먼트와 관련된 대상 인덱스 포인터를 저장하는 데 사용할 수 있는 대상 인덱스 레지스터입니다.

이 4개의 16비트 레지스터는 16비트에서만 액세스 작업을 수행할 수 있으며 주로 피연산자의 주소를 구성하는 데 사용되며 스택 연산 및 인덱스 연산에서 피연산자의 유효 주소를 계산하는 데 사용됩니다. .

(2) 명령어 포인터 IP(Instruction Pointer)

명령어 포인터 IP는 16비트 특수 레지스터로, 현재 가져와야 하는 명령어 바이트를 가리킵니다. BIU는 명령어 바이트 이후에 메모리에서 이를 가져옵니다. IP는 자동으로 1씩 증가하고 다음 명령어 바이트를 가리킵니다. IP는 오프셋 주소(오프셋 주소) 또는 유효 주소(EA, Effective Address)라고도 알려진 명령어 주소의 세그먼트 내 주소 오프셋을 가리킵니다.

(3) 플래그 레지스터 FR(플래그 레지스터)

8086에는 18비트 플래그 레지스터 FR이 있습니다. FR에는 9개의 의미 있는 비트가 있으며 그 중 6개는 상태 비트입니다. 3비트는 제어 비트이다.

OF: 오버플로 플래그 비트 OF는 부호 있는 덧셈과 뺄셈 연산의 결과가 오버플로되는지 여부를 반영하는 데 사용됩니다. 연산 결과가 현재 피연산자 개수로 표현할 수 있는 범위를 초과하는 경우를 오버플로(overflow)라고 하며, OF의 값은 1로 설정되고, 그렇지 않은 경우 OF의 값은 0으로 지워진다.

DF: 방향 플래그 DF 비트는 문자열 연산 명령이 실행될 때 포인터 레지스터가 조정되는 방향을 결정하는 데 사용됩니다.

IF: 인터럽트 활성화 플래그 IF 비트는 CPU 외부의 마스크 가능한 인터럽트에 의해 발행된 인터럽트 요청에 CPU가 응답하는지 여부를 결정하는 데 사용됩니다. 그러나 이 플래그의 값에 관계없이 CPU는 CPU 외부에서 마스크할 수 없는 인터럽트에 의해 발생한 인터럽트 요청과 CPU 내부에서 생성된 인터럽트 요청에 응답해야 합니다. 구체적인 규정은 다음과 같습니다:

(1) IF=1일 때, CPU는 CPU 외부의 마스크 가능한 인터럽트에 의해 발행된 인터럽트 요청에 응답할 수 있습니다.

(2) IF일 때; =0이면 CPU는 CPU 외부의 마스크 가능한 인터럽트에 의해 발행된 인터럽트 요청에 응답하지 않습니다.

TF: 추적 플래그 TF. 이 플래그는 프로그램 디버깅에 사용될 수 있습니다. TF 플래그에는 설정하거나 지우는 전용 명령이 없습니다.

(1) TF=1이면 CPU는 명령어의 단일 단계 실행 모드입니다. 이때 각 명령어가 실행된 후 CPU에 있는 각 레지스터의 현재 값과 다음 명령어가 실행됩니다. CPU가 실행할 명령이 표시됩니다.

(2) TF=0이면 연속 작업 모드입니다.

SF: 부호 플래그 SF는 연산 결과의 부호 비트를 반영하는 데 사용되며, 이는 연산 결과의 최상위 비트와 동일합니다. 마이크로 컴퓨터 시스템에서 부호 있는 숫자는 보수 표현을 사용하므로 SF도 연산 결과의 부호를 반영합니다. 연산 결과가 양수인 경우 SF 값은 0이고, 그렇지 않은 경우 값은 1입니다.

ZF: 제로 플래그 ZF는 연산 결과가 0인지 여부를 반영하는 데 사용됩니다. 연산 결과가 0이면 값은 1이고, 그렇지 않으면 값은 0입니다. 이 플래그는 연산 결과가 0인지 판단할 때 사용할 수 있습니다.

AF: 다음 상황에서 보조 캐리 플래그 AF의 값은 1로 설정되고, 그렇지 않으면 그 값은 0입니다.

(1) 워드 연산 중에 하위 바이트

(2) 바이트 연산 중 하위 4비트를 상위 4비트로 옮기거나 빌릴 때 발생합니다.

PF: 패리티 플래그 PF는 연산 결과에서 "1" 개수의 패리티를 반영하는 데 사용됩니다. "1"의 개수가 짝수이면 PF 값은 1이고, 그렇지 않으면 값은 0입니다.

CF: 캐리 플래그 CF는 주로 작업이 캐리 또는 빌림을 생성하는지 여부를 반영하는 데 사용됩니다. 연산 결과의 가장 높은 비트가 캐리 또는 차용을 생성하는 경우 해당 값은 1이고, 그렇지 않은 경우 해당 값은 0입니다. )

4) 세그먼트 레지스터(Segment Register)

모든 메모리 공간을 사용하기 위해 8086은 세그먼트 주소를 저장하는 데 특별히 사용되는 4개의 세그먼트 레지스터를 설정합니다.

CS(코드 세그먼트): 코드 세그먼트 레지스터;

DS(데이터 세그먼트): 데이터 세그먼트 레지스터;

SS(스택 세그먼트): 스택 세그먼트 레지스터;

p >

ES(Extra Segment): 추가 세그먼트 레지스터.

프로그램을 실행하려면 프로그램 코드, 데이터, 스택이 어떤 메모리 위치를 사용할지 결정하고 세그먼트 레지스터 CS, DS, SS가 이를 가리키도록 설정해야 합니다. 이 시작 위치. 일반적으로 DS는 고정되어 있고 CS는 필요에 따라 수정됩니다. 따라서 주소 지정 가능한 공간이 64K 미만인 경우 프로그램을 어떤 크기로든 작성할 수 있습니다. 따라서 프로그램과 해당 데이터의 결합된 크기는 DS에 표시된 대로 64K로 제한됩니다. 이것이 바로 COM 파일이 64K보다 커서는 안 되는 이유입니다. 8086은 메모리를 전장으로 활용하고 군사기지로 등록해 작업 속도를 높인다.

위는 8086 레지스터의 전체 개요이다. 80386 이후 PC는 32비트 시대에 진입하면서 주소 지정 모드, 레지스터 크기, 기능 등이 모두 변경되었다.

==============================다음은 80386의 레지스터에 대한 정보입니다==== == ===============================

레지스터는 모두 32비트 너비입니다.

A. 범용 레지스터

다음은 범용 레지스터와 그 일반적인 사용법을 소개합니다. 이름에서 알 수 있듯이 범용 레지스터는 원하는 대로 사용할 수 있는 레지스터입니다. 해당 값을 수정해도 일반적으로 컴퓨터 작동에 큰 영향을 미치지 않습니다. 범용 레지스터의 가장 일반적인 용도는 계산입니다.

EAX: 범용 레지스터. 다른 레지스터와 비교하여 작업 수행에 더 일반적으로 사용됩니다. 보호 모드에서는 메모리 오프셋 포인터로도 사용할 수 있습니다. (이때 DS는 세그먼트 레지스터 또는 선택기 역할을 합니다.)

EBX: 범용 레지스터. 일반적으로 EAX, ECX, EDX와 관련된 메모리 오프셋 포인터로 사용되는 DS는 기본 세그먼트 레지스터 또는 선택기입니다. 보호 모드에서는 이 역할도 수행할 수 있습니다.

ECX: 범용 레지스터. 일반적으로 특정 명령어를 계산하는 데 사용됩니다. 보호 모드에서는 메모리 오프셋 포인터로도 사용할 수 있습니다(이 경우 DS는 레지스터 또는 세그먼트 선택기 역할을 합니다).

EDX: 범용 레지스터. 특정 연산(예: 곱셈 및 나눗셈)에서 EAX의 오버플로 레지스터로 사용됩니다. 보호 모드에서는 메모리 오프셋 포인터로도 사용할 수 있습니다(이 경우 DS는 세그먼트 레지스터 또는 선택기 역할을 합니다).

AX가 AH&AL로 나누어지듯이 위의 레지스터에는 해당하는 16비트 그룹과 8비트 그룹이 포함되어 있습니다.

B. 메모리 포인터로 사용되는 특수 레지스터

ESI: 일반적으로 메모리 작업 명령어에서 "소스 주소 포인터"로 사용됩니다. 물론 ESI에는 어떤 값이라도 로드할 수 있지만 일반적으로 이를 범용 레지스터로 사용하는 사람은 없습니다. DS는 기본 세그먼트 레지스터 또는 선택기입니다.

EDI: 일반적으로 메모리 작업 명령어에서 "대상 주소 포인터"로 사용됩니다. 물론 EDI에는 어떤 값이라도 로드할 수 있지만 일반적으로 이를 범용 레지스터로 사용하는 사람은 없습니다. DS는 기본 세그먼트 레지스터 또는 선택기입니다.

EBP: 이것은 포인터 역할을 하는 레지스터이기도 합니다. 일반적으로 이는 고급 언어 컴파일러에서 함수나 프로시저의 지역 변수를 보유하는 '스택 프레임'을 구축하는 데 사용되지만, 원하는 데이터를 담을 수도 있습니다. SS는 기본 세그먼트 레지스터 또는 선택기입니다.

이 세 레지스터에는 해당하는 8비트 그룹이 없습니다. 즉, SI, DI, BP를 별칭으로 통해 하위 16비트에 액세스할 수 있지만 하위 8비트에 직접 액세스할 수 있는 방법은 없습니다.

C. 세그먼트 선택기:

리얼 모드의 세그먼트 레지스터는 보호 모드에서 선택기가 됩니다. 차이점은 리얼 모드의 "세그먼트 레지스터"가 16비트인 반면 보호 모드의 선택기는 32비트라는 것입니다.

CS 스니펫 또는 코드 선택기. IP 레지스터(나중에 설명)와 함께 현재 실행 중인 주소를 가리킵니다. 프로세서가 실행되면 이 레지스터가 가리키는 세그먼트(리얼 모드) 또는 메모리(보호 모드)에서 명령을 가져옵니다. 점프나 기타 분기 명령어를 제외하고는 이 레지스터의 내용을 수정할 수 없습니다.

DS 데이터 세그먼트 또는 데이터 선택기.

ESI와 함께 이 레지스터의 하위 16비트는 명령어에 의해 처리될 메모리를 가리킵니다. 또한 모든 메모리 조작 명령어는 기본적으로 이를 사용하여 작동 세그먼트(리얼 모드) 또는 메모리(선택기, 보호 모드)를 지정합니다. 이 레지스터는 어떤 값으로도 로드할 수 있지만 그렇게 할 때는 주의가 필요합니다. .방법은 먼저 데이터를 AX로 보낸 다음 AX에서 DS로 전송하는 것입니다(물론 스택을 통해서도 가능합니다).

ES 추가 세그먼트 또는 추가 선택기. EDI가 포함된 16비트는 처리할 메모리를 가리킵니다. 마찬가지로 이 레지스터는 DS와 유사한 방식으로 어떤 값으로도 로드될 수 있습니다.

FS F 세그먼트 또는 F 선택기(F는 그럴 수 있다고 추측됩니다.) ?) 이 레지스터를 기본 세그먼트 레지스터 또는 선택기 대신 사용할 수 있습니다.

GS G 세그먼트 또는 G 선택기( G의 의미. F와 마찬가지로 Intel 문서에는 설명되어 있지 않습니다.

SS 스택 세그먼트 또는 스택 선택기의 하위 16비트는 다음 스택 작업을 가리킵니다. (푸시 및 팝에서 사용할 스택 주소) 이 레지스터는 어떤 값으로도 로드할 수 있습니다. 푸시 및 팝 작업을 통해 값을 할당할 수 있습니다. 그러나 스택은 많은 작업에 매우 중요합니다. 수정하면 스택이 손상될 수 있습니다.

* 초기 조립 단계에서 이러한 레지스터를 혼동하지 않도록 주의하십시오. . 지정되지 않은 경우 세그먼트 레지스터 또는 선택기가 사용됩니다. 이 문장은 지금은 다소 혼란스러워 보일 수 있지만 나중에 이를 수행하는 방법을 알게 될 것입니다.

이 레지스터. 이것은 매우 중요합니다. 이것은 CS와 함께 실행될 명령어의 주소를 가리키며 직접 수정할 수 없는 32비트 레지스터입니다. 레지스터 값을 수정하는 유일한 방법은 점프 또는 분기입니다. 명령(CS는 기본 세그먼트 또는 선택기입니다)

위에는 가장 기본적인 레지스터가 있으며, 아래에는 들어본 적도 없는 다른 레지스터가 있습니다(모두 32비트 너비입니다). p>

CR0, CR2, CR3(제어 레지스터) 예를 들어 CR0은 리얼 모드와 보호 모드 사이를 전환하는 데 사용됩니다.

다른 레지스터인 D0, D1, D2, D3이 있습니다. , D6 및 D7(디버그 레지스터)은 조건부 중단점을 설정하기 위해 디버거에 대한 하드웨어 지원으로 사용할 수 있습니다.

TR3, TR4, TR5, TR6 및 TR? 레지스터는 특정 용도로 사용됩니다. 상태 테스트

上篇: 기계를 꿈꾸는 것은 무슨 뜻입니까? 下篇: i7 7700K와 잘 어울리는 ITX 마더보드는 무엇입니까?
관련 내용