어셈블리 언어 명령 구조에는 다음이 포함됩니다. 어셈블리어 명령어(강의)

어셈블리어 명령어(강의)

강의 계획

1. 주요 운영 그룹.

펜티엄.

1. 주요 업무그룹

마이크로프로세서는 다음과 같은 주요 작업 그룹을 구현하는 일련의 명령을 실행합니다.

전달 작업

산술 연산,

논리 연산

교대근무

비교 및 테스트 작업

비트 연산

프로그램 관리 운영

프로세서 제어 작업.

2. 프로세서 명령의 니모닉 코드 펜티엄

명령을 설명할 때 일반적으로 해당 니모닉 지정(니모닉 코드)이 사용되며, 이는 어셈블리 언어로 프로그래밍할 때 명령을 지정하는 데 사용됩니다. 을 위한 다른 버전일부 명령의 어셈블러 니모닉 코드는 다를 수 있습니다. 예를 들어, 서브루틴을 호출하는 명령의 경우 니모닉 코드가 사용됩니다.부르다 또는 JSR (“다음으로 점프하세요. 서브루틴"). 그러나 주요 유형의 마이크로프로세서에 대한 대부분의 명령에 대한 니모닉 코드는 수행되는 작업을 정의하는 해당 영어 단어의 약어이기 때문에 동일하거나 약간 다릅니다. 프로세서에 채택된 명령 니모닉 코드를 살펴보겠습니다.펜티엄.

명령을 전달합니다. 이 그룹의 주요 팀은 팀입니다.MOV , 두 레지스터 간 또는 레지스터와 메모리 셀 간 데이터 전송을 제공합니다. 일부 마이크로프로세서는 메모리에서 여러 레지스터 내용의 대량 전송뿐만 아니라 두 메모리 셀 간의 전송을 구현합니다. 예를 들어, 68 제품군의 마이크로프로세서모토로라 xxx 명령을 실행하다이동하다 , 한 메모리 셀에서 다른 메모리 셀로의 전송을 제공하고 명령무브엠 , 지정된 레지스터 세트(최대 16개 레지스터)의 내용을 메모리에 쓰거나 메모리에서 로드합니다. 팀XCHG 두 개의 프로세서 레지스터 또는 레지스터와 메모리 셀의 내용을 상호 교환합니다.

입력 명령 안에 그리고 출력 밖으로 프로세서 레지스터에서 외부 장치로 데이터를 전송하거나 외부 장치에서 레지스터로 데이터를 수신하는 것을 구현합니다. 데이터가 전송되는 인터페이스 장치(입/출력 포트)의 번호를 지정하는 명령입니다. 많은 마이크로프로세서에는 액세스에 대한 특별한 지침이 없습니다. 외부 장치. 이 경우 시스템 내 데이터의 입출력은 다음과 같은 명령어를 이용하여 수행된다.MOV , 필요한 인터페이스 장치의 주소를 지정합니다. 따라서 외부 장치는 메모리 셀로 어드레싱되며, 시스템에 연결된 인터페이스 장치(포트)의 주소가 위치하는 주소 공간에는 특정 섹션이 할당된다.

산술 연산 명령. 이 그룹의 주요 명령은 덧셈, 뺄셈, 곱셈, 나눗셈이며 다양한 옵션이 있습니다. 추가 명령 추가하다 그리고 빼기 보결 해당 작업을 수행하십시오.두 개의 레지스터, 즉 레지스터와 메모리 위치에 의해 소유되거나 직접 피연산자를 사용하여 소유됩니다. 팀 기원 후 , S.B. 속성 값을 고려하여 덧셈과 뺄셈을 수행합니다., 이전 작업 수행 중 전송을 구성할 때 설정합니다. 이러한 명령을 사용하면 비트 수가 프로세서 용량을 초과하는 피연산자의 순차적 추가가 구현됩니다. 팀 N.E.G. 피연산자의 부호를 변경하여 2의 보수로 변환합니다.

곱셈과 나눗셈 연산은 부호 있는 숫자(명령어)에 대해 수행될 수 있습니다. 멀, DIV ) 또는 서명되지 않은 (명령 MUL, DIV ). 피연산자 중 하나는 항상 레지스터에 있고, 두 번째 피연산자는 레지스터, 메모리 셀에 있거나 직접 피연산자일 수 있습니다. 작업 결과는 레지스터에 있습니다. 곱할 때 (명령 , 이물 ) 결과는 두 개의 레지스터가 사용되는 더블 비트입니다. 나눌 때 (명령DIV , IDIV ) 피제수로 이중 비트 피연산자가 사용되어 두 개의 레지스터에 배치되고 결과적으로 몫과 나머지가 두 개의 레지스터에 기록됩니다.

논리 연산 명령 . 거의 모든 마이크로프로세서는 명령을 사용하여 동일한 피연산자 비트에 대해 수행되는 논리 연산 AND, OR, Exclusive OR을 수행합니다. 그리고, 또는, 엑스 또는 . 연산은 두 레지스터, 즉 레지스터와 메모리 위치의 내용에 대해 수행되거나 직접 피연산자를 사용하여 수행됩니다. 팀 아니다 피연산자의 각 비트 값을 반전시킵니다.

시프트 명령. 마이크로프로세서는 주소가 지정된 피연산자의 산술, 논리 및 순환 시프트를 하나 이상의 비트로 수행합니다. 이동될 피연산자는 레지스터나 메모리 위치에 있을 수 있으며, 이동 비트 수는 명령어에 포함된 직접 피연산자에 의해 지정되거나 지정된 레지스터의 내용에 의해 결정됩니다. 환승 표시는 일반적으로 교대 구현에 포함됩니다.상태 레지스터(S.R.또는 이플래그)에는 레지스터나 메모리 셀에서 제거된 피연산자의 마지막 비트가 포함되어 있습니다.

비교 및 테스트 명령 . 피연산자 비교는 일반적으로 다음 명령을 사용하여 수행됩니다.CMP , 피연산자를 빼고 특성 값을 설정합니다. N, Z, V, C얻은 결과에 따라 상태 레지스터에 기록됩니다. 이 경우 뺄셈 결과는 저장되지 않으며 피연산자의 값도 변경되지 않습니다. 획득된 특징값에 대한 후속 분석을 통해 상대값(>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

일부 마이크로프로세서는 테스트 명령을 실행합니다. TST , 이는 비교 명령어의 단일 피연산자 버전입니다. 이 명령이 실행되면 부호가 설정됩니다. 엔,지주소가 지정된 피연산자의 부호와 값(0이 아니거나 같음)에 따라 결정됩니다.

비트 연산 지침 . 이 명령은 속성의 값을 설정합니다.테스트 중인 비트 값에 따라 상태 레지스터에 주소가 지정된 피연산자에서. 일부 마이크로프로세서에서는 비트 테스트 결과에 따라 속성이 설정됩니다.. 테스트 비트 수N명령에 지정된 레지스터의 내용이나 직접 피연산자에 의해 지정됩니다.

이 그룹의 명령은 테스트 중인 비트를 변경하기 위한 다양한 옵션을 구현합니다. 비티 이 비트의 값을 변경하지 않고 유지합니다.명령 에스 사후 테스트에서 값을 설정합니다. =1 및 명령 - 의미 =0.팀 테스트 후 비트 bn의 값을 반전시킵니다.

프로그램 관리 운영. 프로그램을 제어하기 위해 다음과 같은 많은 명령이 사용됩니다.

- 무조건적인 제어 전송 명령;

- 조건부 점프 명령;

- 프로그램 주기를 구성하는 팀;

- 인터럽트 명령;

- 속성을 변경하는 명령입니다.

무조건적인 제어권 이전은 명령에 의해 수행됩니다.JMP , 프로그램 카운터에 로드됩니다.PC실행할 다음 명령의 주소인 새 콘텐츠입니다. 이 주소는 명령에 직접 지정되거나JMP (직접 주소 지정) 또는 현재 내용의 합으로 계산됩니다.PC부호 있는 숫자(상대 주소 지정)인 명령에 지정된 오프셋입니다. 왜냐하면PC다음 프로그램 명령의 주소를 포함하며, 후자의 방법은 점프 주소, 지정된 바이트 수만큼 다음 주소에 대한 오프셋을 지정합니다. 양수 오프셋을 사용하면 프로그램의 후속 명령으로 전환되고 음수 오프셋을 사용하면 이전 명령으로 전환됩니다.

서브루틴은 명령을 사용하여 무조건적으로 제어를 전송함으로써 호출되기도 합니다.부르다 (또는 JSR ). 그러나 이 경우에는 로드하기 전에PC 서브루틴의 첫 번째 명령 주소를 지정하는 새 내용이 있는 경우, 서브루틴 실행 후 메인 프로그램(또는 이전 명령)으로 복귀하려면 현재 값(다음 명령의 주소)을 저장해야 합니다. 서브루틴을 중첩할 때 서브루틴). 조건부 점프 명령(프로그램 분기)이 로드됩니다.PC일반적으로 상태 레지스터의 다양한 속성의 현재 값에 따라 설정되는 특정 조건이 충족되면 새로운 콘텐츠가 생성됩니다. 조건이 충족되지 않으면 다음 프로그램 명령이 실행됩니다.

기능 제어 명령은 기능이 저장된 상태 레지스터의 내용을 읽고 개별 기능의 값을 변경하는 쓰기 기능을 제공합니다. 예를 들어 펜티엄 프로세서는 다음 명령을 구현합니다. LAHF 그리고 SAHF , 상태 레지스터에서 부호가 포함된 하위 바이트를 로드합니다. EFLAG레지스터의 하위 바이트로 EAX그리고 낮은 바이트를 패딩 이플래그등록부에서 EA엑스.. 팀 CLC, STC전송 기호 CF=0, CF=1의 값 설정을 수행하고 명령을 수행합니다. CMC이 속성의 값이 반전됩니다.속성은 조건부 전환 중 프로그램 실행 흐름을 결정하므로 속성 변경 명령은 일반적으로 프로그램을 제어하는 ​​데 사용됩니다.

프로세서 제어 명령 . 이 그룹에는 중지 명령, 작동 안 함 명령 및 프로세서나 개별 블록의 작동 모드를 결정하는 여러 명령이 포함됩니다. 팀HLT 프로그램 실행을 중지하고 프로세서를 중지 상태로 전환합니다. 이 상태는 인터럽트 또는 재시작 신호가 수신되면 종료됩니다(초기화 ). 팀 안돼 (“empty” 명령)은 어떠한 작업도 수행하지 않는 명령으로, 프로그램 지연을 구현하거나 프로그램에 형성된 공백을 메우기 위해 사용됩니다.

특수팀 CLI, STI 인터럽트 요청 서비스를 금지하고 활성화합니다. 프로세서에서펜티엄 이를 위해 제어 비트(플래그)가 사용됩니다.만약에기록부에 이플래그.

많은 최신 마이크로프로세서는 사용자나 다른 장치가 특정 시스템에서 사용되는 프로세서 유형에 대한 정보를 얻을 수 있도록 식별 명령을 발행합니다. 프로세서에서 펜투임이에 대한 명령은 CPUID , 프로세서에 대한 필요한 데이터가 레지스터에 입력되는 동안 EAXEBXECXEDX그런 다음 사용자나 운영 체제에서 읽을 수 있습니다.

프로세서가 구현하는 작동 모드와 처리 중인 특정 유형의 데이터에 따라 실행되는 명령 세트가 크게 확장될 수 있습니다.

일부 프로세서는 이진수로 산술 연산을 수행하거나 이러한 숫자를 처리할 때 결과를 수정하기 위해 특수 명령을 실행합니다. 많은 고성능 프로세서에는 다음이 포함됩니다. FPU - 숫자 처리 장치"부동 소수점".

많은 최신 프로세서는 여러 정수 또는 숫자의 그룹 처리를 구현합니다.씨 원리에 따라 하나의 명령을 사용하는 "부동 소수점" SIMD(“단일 명령어 – 다중 데이터” ”) - “하나의 명령 – 많은 양의 데이터.” 여러 피연산자에 대한 연산을 동시에 실행하면 비디오 및 오디오 데이터 작업 시 프로세서 성능이 크게 향상됩니다. 이러한 작업은 이미지, 오디오 신호 및 기타 응용 프로그램을 처리하는 데 널리 사용됩니다. 이러한 작업을 수행하기 위해 다양한 유형의 프로세서에서 해당 명령 세트를 구현하는 프로세서에 특수 블록이 도입되었습니다.펜티엄, 애슬론) 이름을 얻었습니다MMX (“ 밀티- 미디어 확장 ”) – 멀티미디어 확장,SSE(“스트리밍 SIMD 확장”) – 스트리밍 SIMD - 확대, “3 확대– 3차원 확장.

회사 프로세서의 특징인텔 , 80286 모델부터 프로세서가 보호된 가상 주소 모드로 작동할 때 제공되는 메모리 액세스 우선 제어입니다.보호 모드 "(보호 모드). 이 모드를 구현하려면 채택된 우선 순위 액세스 알고리즘에 따라 메모리 보호를 구성하는 데 사용되는 특수 명령 그룹이 사용됩니다.

명령은 목적에 따라 구별될 수 있습니다(IBM PC 어셈블러 명령의 니모닉 연산 코드의 예는 괄호 안에 표시됩니다).

l 산술 연산 수행(ADD 및 ADC - 캐리를 사용한 덧셈 및 덧셈, SUB 및 SBB - 빌림을 사용한 뺄셈 및 뺄셈, MUL 및 IMUL - 무부호 및 부호 있는 곱셈, DIV 및 IDIV - 무부호 및 부호 있는 나누기, CMP - 비교 등)

l 논리 연산(OR, AND, NOT, XOR, TEST 등)을 수행합니다.

l 데이터 전송(MOV - 전달, XCHG - 교환, IN - 마이크로프로세서에 입력, OUT - 마이크로프로세서에서 출력 등)

l 제어 이전(프로그램 분기: JMP - 무조건 점프, CALL - 프로시저 호출, RET - 프로시저에서 복귀, J* - 조건부 점프, LOOP - 루프 제어 등)

l 문자열 처리(MOVS - 전송, CMPS - 비교, LODS - 로드, SCAS - 스캔. 이러한 명령은 일반적으로 접두사(반복 수정자) ​​REP와 함께 사용됩니다.

l 프로그램 중단(INT - 소프트웨어 인터럽트, INTO - 오버플로 시 조건부 인터럽트, IRET - 인터럽트에서 복귀);

l 마이크로프로세서 제어(ST* 및 CL* - 플래그 설정 및 재설정, HLT - 중지, WAIT - 대기, NOP - 유휴 등).

전체 어셈블러 명령 목록은 해당 작업에서 찾을 수 있습니다.

데이터 전송 명령

l MOV dst, src - 데이터 전송(이동 - src에서 dst로 보내기).

전송: 레지스터 간 또는 레지스터와 메모리 간 1바이트(src 및 dst가 바이트 형식인 경우) 또는 1워드(src 및 dst가 워드 형식인 경우)를 전송하고 레지스터 또는 메모리에 직접 값을 씁니다.

피연산자 dst와 src는 동일한 형식(바이트 또는 워드)을 가져야 합니다.

Src는 r(레지스터) - 레지스터, m(메모리) - 메모리, i(임피던스) - 즉치값 유형일 수 있습니다. Dst는 r, m 유형일 수 있습니다. 하나의 명령에 다음 피연산자를 사용할 수 없습니다: rsegm과 i; m 유형의 피연산자 두 개와 rsegm 유형의 피연산자 두 개). i 피연산자는 간단한 표현식일 수도 있습니다.

이동 도끼, (152 + 101B) / 15

식 평가는 번역 중에만 수행됩니다. 플래그를 변경하지 않습니다.

l PUSH src - 단어를 스택에 푸시합니다(push - 밀어붙이다; src에서 스택으로 푸시). src의 내용(16비트 레지스터(세그먼트 레지스터 포함) 또는 16비트 워드를 포함하는 두 개의 메모리 셀)을 스택 맨 위에 배치합니다. 플래그는 변경되지 않습니다.

l POP dst - 스택에서 단어를 팝합니다(pop - pop; 스택에서 dst까지 계산). 스택 상단에서 워드를 제거하고 이를 dst(모든 16비트 레지스터(세그먼트 레지스터 포함)) 또는 두 개의 메모리 셀에 배치합니다. 플래그는 변경되지 않습니다.

기계가 하드웨어 수준에서 인간의 명령을 실행하려면 "0과 1"이라는 언어로 특정 동작 순서를 지정해야 합니다. 어셈블러는 이 문제에 대한 조수가 될 것입니다. 이것은 명령을 기계어로 번역하는 데 사용되는 유틸리티입니다. 그러나 프로그램을 작성하는 것은 매우 노동집약적이고 복잡한 과정입니다. 이 언어는 쉽고 간단한 액션을 만들기 위한 것이 아닙니다. 현재 사용되는 모든 프로그래밍 언어(어셈블러는 훌륭하게 작동함)를 사용하면 하드웨어 작동에 큰 영향을 미치는 특별하고 효율적인 작업을 작성할 수 있습니다. 주요 목적은 마이크로 명령어와 작은 코드를 만드는 것입니다. 이 언어는 Pascal이나 C보다 더 많은 가능성을 제공합니다.

어셈블리 언어에 대한 간략한 설명

모든 프로그래밍 언어는 낮음과 높음 수준으로 구분됩니다. 어셈블러 "계열"의 모든 구문 시스템은 가장 일반적이고 현대적인 언어의 장점 중 일부를 즉시 결합한다는 점에서 구별됩니다. 다른 사람들과 공통점은 컴퓨터 시스템을 완벽하게 사용할 수 있다는 것입니다.

컴파일러의 특징은 사용이 쉽다는 것입니다. 이는 높은 수준에서만 작동하는 것과 구별됩니다. 그러한 프로그래밍 언어를 고려한다면 Assembler는 두 배 더 빠르고 더 효과적으로 작동합니다. 그 안에 가벼운 프로그램을 작성하는 데는 많은 시간이 걸리지 않습니다.

언어의 구조에 대해 간략히 설명합니다.

언어의 작업과 구조에 대해 일반적으로 이야기하면 해당 명령이 프로세서 명령과 완전히 일치한다고 말할 수 있습니다. 즉, 어셈블러는 사람이 작성하기 가장 편리한 니모닉 코드를 사용합니다.

다른 프로그래밍 언어와 달리 Assembly는 주소 대신 특정 레이블을 사용하여 메모리 셀을 씁니다. 코드 실행 프로세스와 함께 소위 지시문으로 변환됩니다. 이는 프로세서의 작동에 영향을 미치지 않지만(기계어로 번역되지 않음) 프로그래밍 환경 자체에서 인식하는 데 필요한 상대 주소입니다.

프로세서의 각 라인에는 고유한 프로세스가 있으며, 이 상황에서는 번역된 프로세스를 포함한 모든 프로세스가 정확합니다.

어셈블리 언어에는 이 기사에서 설명할 여러 구문이 있습니다.

언어의 장점

어셈블리 언어의 가장 중요하고 편리한 장치는 매우 컴팩트한 프로세서용 프로그램을 작성할 수 있다는 것입니다. 코드가 큰 것으로 판명되면 일부 프로세스가 RAM으로 리디렉션됩니다. 또한 자격을 갖춘 프로그래머가 관리하지 않는 한 모든 작업을 매우 신속하고 실패 없이 수행합니다.

드라이버, 운영 체제, BIOS, 컴파일러, 인터프리터 등은 모두 어셈블리 언어로 된 프로그램입니다.

기계 간 변환을 수행하는 디스어셈블러를 사용하면 설명이 없더라도 특정 시스템 작업이 어떻게 작동하는지 쉽게 이해할 수 있습니다. 그러나 이것은 프로그램이 쉬운 경우에만 가능합니다. 불행히도, 사소하지 않은 코드는 이해하기가 매우 어렵습니다.

언어의 단점

불행하게도 초보 프로그래머(그리고 종종 전문가)는 언어를 이해하는 데 어려움을 겪습니다. 어셈블러에는 필수 명령에 대한 자세한 설명이 필요합니다. 기계 명령을 사용해야 하기 때문에 잘못된 동작이 발생할 가능성과 실행 복잡성이 증가합니다.

가장 간단한 프로그램이라도 작성하려면 프로그래머는 자격을 갖추고 있어야 하며, 그의 지식 수준도 충분히 높아야 합니다. 불행히도 일반 전문가는 종종 잘못된 코드를 작성합니다.

프로그램이 생성된 플랫폼이 업데이트되면 모든 명령을 수동으로 다시 작성해야 합니다. 이는 언어 자체에서 필요합니다. 어셈블러는 프로세스 성능을 자동으로 조정하고 요소를 교체하는 기능을 지원하지 않습니다.

언어 명령

위에서 언급했듯이 각 프로세서에는 고유한 명령 세트가 있습니다. 모든 유형에서 인식되는 가장 간단한 요소는 다음 코드입니다.


지시문 사용

대부분의 경우 가장 낮은 수준의 언어(어셈블러가 이를 허용하고 기능에 잘 대처함)로 마이크로 컨트롤러를 프로그래밍하면 성공적으로 끝납니다. 리소스가 제한된 프로세서를 사용하는 것이 가장 좋습니다. 이 언어는 32비트 기술에 적합합니다. 코드에서 지시문을 자주 볼 수 있습니다. 이게 뭔가요? 그리고 그것은 무엇을 위해 사용됩니까?

첫째, 지시어는 기계어로 번역되지 않는다는 점을 강조할 필요가 있다. 컴파일러가 작업을 수행하는 방법을 규제합니다. 명령과 달리 기능이 다른 이러한 매개변수는 프로세서가 아니라 변환기가 다르기 때문에 다릅니다. 주요 지시문은 다음과 같습니다.


이름의 유래

이 언어는 어떻게 "Assembler"라는 이름을 얻었습니까? 우리는 데이터를 암호화하는 변환기와 컴파일러에 대해 이야기하고 있습니다. 영어에서 Assembler는 어셈블러에 지나지 않습니다. 프로그램은 수동으로 조립되지 않고 자동 구조가 사용되었습니다. 더욱이 현재 사용자와 전문가는 이미 용어 간의 차이를 잃었습니다. 프로그래밍 언어는 단지 유틸리티일 뿐이지만 종종 어셈블러라고 불립니다.

공통적인 집합 이름 때문에 어떤 사람들은 하나의 저급 언어(또는 그에 대한 표준 규범)가 있다고 잘못 생각합니다. 프로그래머가 우리가 말하는 구조를 이해하려면 특정 어셈블리 언어가 어떤 플랫폼에 사용되는지 명확히 해야 합니다.

거시적 의미

상대적으로 새로운 어셈블리 언어에는 매크로 기능이 있습니다. 프로그램을 작성하고 실행하는 것이 더 쉬워집니다. 그 존재 덕분에 번역자는 작성된 코드를 몇 배 더 빠르게 실행합니다. 조건부 선택을 만들 때 거대한 명령 블록을 작성할 수 있지만 매크로 도구를 사용하는 것이 더 쉽습니다. 조건이 충족되는지 여부에 따라 작업 간에 빠르게 전환할 수 있습니다.

매크로 언어 지시문을 사용할 때 프로그래머는 어셈블러 매크로를 받습니다. 때로는 널리 사용될 수도 있고, 때로는 그 기능이 단일 명령으로 축소되는 경우도 있습니다. 코드에 이러한 요소가 있으면 작업하기가 더 쉬워지고 이해하기 쉽고 시각적으로 향상됩니다. 그러나 여전히 조심해야 합니다. 어떤 경우에는 매크로가 상황을 악화시키는 경우도 있습니다.

코스 작업

"시스템 프로그래밍" 분야에서

주제 4: "절차 문제 해결"

옵션 2

동시베리아 주립대학교

기술 및 관리

____________________________________________________________________

기술대학

운동

코스 작업을 위해

규율:
주제: 절차상의 문제 해결
출연자: 아리나 알렉산드로브나 글라빈스카야
머리: 담바예바 세세그마 빅토로브나
작업 요약: 어셈블리 언어의 서브루틴 연구,
서브루틴을 사용하여 문제 해결
1. 이론적인 부분: 어셈블리 언어에 대한 기본 정보(설정
명령 등), 서브루틴 구성, 매개변수 전달 방법
서브루틴에서
2. 실용적인 부분: 두 개의 서브루틴을 개발합니다. 그 중 하나는 주어진 문자를 대문자(러시아 문자 포함)로 변환하고, 다른 하나는 문자를 소문자로 변환합니다.
주어진 문자를 대문자로 변환하고, 다른 하나는 주어진 문자를 소문자로 변환합니다.
문자를 소문자로 변환합니다.
일정에 따른 프로젝트 마감일:
1. 이론적인 부분 - 7주차까지 30%.
2. 실습 부분 - 11주차까지 70%.
3. 보호 - 14주차까지 100%.
디자인 요구 사항:
1. 과정 프로젝트의 계산 및 설명 메모는
전자 및 하드 카피.
2. 보고서 분량은 첨부파일을 제외하고 타자기 20쪽 이상이어야 합니다.
3. RPP는 GOST 7.32-91에 따라 작성되고 관리자가 서명합니다.

작업 관리자 __________________

출연자 __________________

발행일 " 26 " 구월 2017 G.


소개. 2

1.1 어셈블리 언어에 대한 기본 정보. 삼

1.1.1 명령 세트. 4

1.2 어셈블리 언어로 서브루틴 구성. 4

1.3 서브루틴에 매개변수를 전달하는 방법. 6

1.3.1 레지스터를 통해 매개변수 전달.. 6

1.3.2 스택을 통해 매개변수 전달. 7

2 실습 섹션...9

2.1 문제 설명. 9

2.2 문제 해결 방법에 대한 설명입니다. 9

2.3 프로그램 테스트...7

결론. 8

참고자료..9


소개

어셈블리 언어는 프로그래밍하기가 매우 어렵습니다. 아시다시피 현재는 다양한 언어가 있습니다 높은 레벨, 프로그램을 작성할 때 훨씬 적은 노력을 기울일 수 있습니다. 당연히 프로그래머가 프로그램을 작성할 때 어셈블러를 사용해야 할 경우 문제가 발생합니다. 현재 어셈블리 언어 사용이 정당화되고 종종 필요한 두 가지 영역을 지적할 수 있습니다.

첫째, 이들은 소위 기계 종속 시스템 프로그램으로, 일반적으로 다양한 컴퓨터 장치(이러한 프로그램을 드라이버라고 함)를 제어합니다. 이러한 시스템 프로그램은 일반적으로 사용할 필요가 없는 특수한 기계 명령어를 사용합니다. 적용된) 프로그램들. 이러한 명령은 고급 언어로 정의하는 것이 불가능하거나 매우 어렵습니다.

Assembler의 두 번째 응용 분야는 프로그램 실행 최적화와 관련이 있습니다. 고급 언어의 번역기 프로그램(컴파일러)은 매우 비효율적인 기계어 프로그램을 생성하는 경우가 많습니다. 이는 일반적으로 프로그램의 매우 작은(약 3-5%) 섹션(메인 루프)이 대부분의 시간 동안 실행되는 계산 프로그램에 적용됩니다. 이 문제를 해결하기 위해 프로그램의 일부를 다른 언어로 작성할 수 있는 소위 다중 언어 프로그래밍 시스템을 사용할 수 있습니다. 일반적으로 프로그램의 주요 부분은 고급 프로그래밍 언어(Fortran, Pascal, C 등)로 작성되고, 프로그램에서 시간이 중요한 부분은 어셈블리로 작성됩니다. 전체 프로그램의 속도가 크게 향상될 수 있습니다. 종종 이는 프로그램이 허용 가능한 시간에 결과를 생성하도록 하는 유일한 방법입니다.

이 과정의 목적은 어셈블리 언어에 대한 실용적인 프로그래밍 기술을 습득하는 것입니다.

직무 목표:

1. 어셈블리 언어에 대한 기본 정보(어셈블리 프로그램의 구조 및 구성 요소, 명령 형식, 서브루틴 구성 등)를 연구합니다.

2. 비트 연산의 유형, 어셈블러 논리 명령어의 작동 형식 및 논리를 연구합니다.

3. 어셈블리 언어의 서브루틴 사용에 관한 개별 문제를 해결합니다.

4.. 완료된 작업에 대한 결론을 공식화하십시오.

1 이론 섹션

어셈블리 언어 기본 사항

어셈블러(Assembler)는 인간의 인지에 편리한 기계 명령을 기록하는 형식인 저수준 프로그래밍 언어입니다.

어셈블리 언어 명령은 프로세서 명령에 일대일 대응하며 실제로 명령과 해당 인수를 기록하는 편리한 기호 형식(니모닉 코드)을 나타냅니다. 어셈블리 언어는 또한 기본적인 프로그래밍 추상화를 제공합니다. 즉, 기호로 명명된 레이블과 지시어를 통해 프로그램 부분과 데이터를 연결합니다.

Assembly 지시문을 사용하면 데이터 블록(명시적으로 설명되거나 파일에서 읽음)을 프로그램에 포함할 수 있습니다. 특정 조각을 지정된 횟수만큼 반복합니다. 조건에 따라 조각을 컴파일합니다. 조각의 실행 주소를 설정하고, 컴파일 과정에서 레이블 값을 변경합니다. 매개변수 등과 함께 매크로 정의를 사용합니다.

장점과 단점

· 중복 코드의 최소량(더 적은 수의 명령 및 메모리 액세스 사용). 그 결과 속도는 빨라지고 프로그램 크기는 작아졌습니다.

· 많은 양의 코드, 다수의 추가적인 소규모 작업;

· 코드 가독성이 낮고 지원이 어렵습니다(디버깅, 기능 추가).

· 프로그래밍 패러다임 및 기타 다소 복잡한 관례 구현의 어려움, 공동 개발의 복잡성;

· 사용 가능한 라이브러리 수가 적고 호환성이 낮습니다.

· 하드웨어에 직접 액세스: 입력/출력 포트, 특수 프로세서 레지스터;

· 원하는 플랫폼에 대한 최대 "적합"(특별 지침 사용, 하드웨어의 기술적 기능)

· 다른 플랫폼으로의 이식 불가능(바이너리 호환 플랫폼 제외).

명령어 외에도 프로그램에는 지시문이 포함될 수 있습니다. 즉, 기계 명령어로 직접 변환되지는 않지만 컴파일러의 작동을 제어하는 ​​명령입니다. 해당 집합과 구문은 크게 다르며 하드웨어 플랫폼이 아니라 사용된 컴파일러(동일한 아키텍처 제품군 내에서 언어 방언 생성)에 따라 다릅니다. 지시문 세트에는 다음이 포함됩니다.

· 데이터 정의(상수 및 변수);

· 메모리 및 출력 파일 매개변수의 프로그램 구성 관리;

· 컴파일러 작동 모드 설정;

· 모든 종류의 추상화(즉, 고급 언어의 요소) - 프로시저 및 함수 설계(절차적 프로그래밍 패러다임의 구현을 단순화하기 위한)부터 조건부 구문 및 루프(구조화된 프로그래밍 패러다임의 경우)까지;

· 매크로.

명령 세트

일반적인 어셈블리 언어 명령은 다음과 같습니다.

· 데이터 전송 명령(mov 등)

산술 명령(add, sub, imul 등)

논리 및 비트 연산(or, and, xor, shr 등)

· 프로그램 실행 제어 명령(jmp, loop, ret 등)

· 인터럽트 명령(때때로 제어 명령이라고도 함): int

· 포트에 대한 I/O 명령(입력, 출력)

마이크로컨트롤러와 마이크로컴퓨터는 조건에 따라 검사 및 전환을 수행하는 명령을 특징으로 합니다. 예를 들면 다음과 같습니다.

· jne - 같지 않으면 점프합니다.

· jge - .보다 크거나 같으면 점프합니다.

1. PC 아키텍처..........................................................................................................5

    1.1. 레지스터.

    1.1.1 범용 레지스터.

1.1.2. 세그먼트 레지스터

1.1.3 플래그 레지스터

1.2. 기억의 조직.

1.3. 데이터 프레젠테이션.

1.3.1 데이터 유형

1.3.2 문자와 문자열의 표현

2. 어셈블러의 프로그램 명령문 .............................................

    1. 어셈블리 언어 명령

2.2. 주소 지정 모드 및 기계 명령어 형식

3. 의사 연산자 ..............................................................

3.1 데이터 정의 지시어

3.2 어셈블러 프로그램의 구조

3.2.1 프로그램 세그먼트. 지시를 취하다

3.2.3 단순화된 분할 지시어

4. 프로그램 조립 및 구성 ..............

5. 데이터 전송 명령..........................................................

    5.1 일반 명령

    5.2 스택 명령

5.3 I/O 명령

5.4 주소 전달 명령

5.5 플래그 전달 명령

6. 산술 명령어 ..............................................................

    6.1 이진 정수에 대한 산술 연산

6.1.1 덧셈과 뺄셈

6.1.2 수신자를 1씩 증가, 감소시키는 명령

6.2 곱셈과 나눗셈

6.3 표시 변경

7. 논리연산 ..........................................................

8. 교대 및 순환 교대..................................................................................

9. 문자열 연산..........................................................................

10. 프로그램의 논리와 구성..........................................

10.1 무조건 점프

10.2 조건부 점프

10.4 어셈블리 언어의 절차

10.5 INT 인터럽트

10.6 시스템 소프트웨어

10.6.1.1 키보드 읽기.

10.6.1.2 화면에 문자 표시하기

10.6.1.3 프로그램 종료.

10.6.2.1 디스플레이 모드 선택

11. 디스크 메모리..........................................................................

11.2 파일 배포 테이블

11.3 디스크 I/O 작업

11.3.1 디스크에 파일 쓰기

11.3.1.1 ASCIIZ 데이터

11.3.1.2 파일번호

11.3.1.3 디스크 파일 생성

11.3.2 디스크 파일 읽기

소개

어셈블리어는 기계어를 상징적으로 표현한 것입니다. 가장 낮은 하드웨어 수준의 개인용 컴퓨터(PC)의 모든 프로세스는 기계어 명령(명령어)에 의해서만 구동됩니다. 어셈블러에 대한 지식 없이는 하드웨어와 관련된 문제(또는 프로그램 속도를 높이는 등 하드웨어에 따른 문제)를 실제로 해결하는 것은 불가능합니다.

어셈블러는 PC 구성 요소에 대한 직접 명령의 편리한 형태이며 이러한 구성 요소를 포함하는 집적 회로, 즉 PC 마이크로프로세서의 속성과 기능에 대한 지식이 필요합니다. 따라서 어셈블리 언어는 PC의 내부 구성과 직접적인 관련이 있습니다. 그리고 거의 모든 고급 언어 컴파일러가 프로그래밍의 어셈블리 수준에 대한 액세스를 지원하는 것은 우연이 아닙니다.

전문 프로그래머 교육의 한 요소는 반드시 어셈블러에 대한 연구입니다. 어셈블리 언어 프로그래밍에는 PC 아키텍처에 대한 지식이 필요하기 때문에 다른 언어로 보다 효율적인 프로그램을 만들고 이를 어셈블리 언어 프로그램과 결합할 수 있기 때문입니다.

이 매뉴얼에서는 Intel 마이크로프로세서 기반 컴퓨터의 어셈블리 언어 프로그래밍에 대해 설명합니다.

이 튜토리얼은 프로세서 아키텍처와 어셈블리 언어 프로그래밍의 기본 사항, 주로 소프트웨어 제품 개발자에 관심이 있는 모든 사람을 대상으로 합니다.

    PC 아키텍처.

컴퓨터 아키텍처는 컴퓨터의 구조적, 회로적, 논리적 구성을 반영하는 추상적인 표현입니다.

모든 최신 컴퓨터에는 공통적이고 개별적인 아키텍처 속성이 있습니다. 개별 속성은 특정 컴퓨터 모델마다 고유합니다.

컴퓨터 아키텍처의 개념은 다음과 같습니다.

    컴퓨터 블록 다이어그램;

    컴퓨터 블록 다이어그램의 요소에 액세스하는 수단 및 방법;

    레지스터의 설정 및 가용성;

    조직 및 주소 지정 방법;

    컴퓨터 데이터의 표현 방법 및 형식;

    컴퓨터 기계 명령어 세트;

    기계 명령어 형식;

    인터럽트 처리.

컴퓨터 하드웨어의 주요 요소: 시스템 장치, 키보드, 디스플레이 장치, 디스크 드라이브, 인쇄 장치(프린터) 및 다양한 통신 장비. 시스템 장치는 마더보드, 전원 공급 장치 및 추가 카드용 확장 셀로 구성됩니다. 마더보드에는 마이크로프로세서, ROM(읽기 전용 메모리), RAM(Random Access Memory) 및 보조 프로세서가 포함되어 있습니다.

      레지스터.

마이크로프로세서 내부의 정보는 어느 정도 프로그래머가 사용할 수 있는 32개의 레지스터(사용자 16개, 시스템 16개) 그룹에 포함되어 있습니다. 매뉴얼은 8088-i486 마이크로프로세서 프로그래밍에 전념하고 있으므로 사용자가 액세스할 수 있는 마이크로프로세서의 내부 레지스터에 대한 논의로 이 주제를 시작하는 것이 가장 논리적입니다.

사용자 레지스터는 프로그래머가 프로그램을 작성하는 데 사용됩니다. 이러한 레지스터에는 다음이 포함됩니다.

    8개의 32비트 레지스터(범용 레지스터) EAX/AX/AH/AL, EBX/BX/BH/BL, ECX/CX/CH/CL, EDX/DX/DLH/DL, EBP/BP, ESI/SI, EDI/DI, ESP/SP;

    6개의 16비트 세그먼트 레지스터: CS, DS, SS, ES, FS, GS;

    상태 및 제어 레지스터: EFLAGS/FLAGS 플래그 레지스터 및 EIP/IP 명령 포인터 레지스터.

하나의 32비트 레지스터의 일부는 슬래시로 표시됩니다. 접두어 E(확장)는 32비트 레지스터의 사용을 나타냅니다. 바이트 작업을 위해 접두어 L(낮음) 및 H(높음)가 있는 레지스터가 사용됩니다(예: AL, CH - 레지스터의 16비트 부분의 낮은 바이트와 높은 바이트를 나타냄).

        범용 레지스터.

EAX/AX/AH/AL(누산기 레지스터) – 배터리. 곱셈과 나눗셈, I/O 연산, 일부 문자열 연산에 사용됩니다.

EBX/BX/BH/BL – 기본 레지스터(기본 레지스터), 메모리에서 데이터 주소를 지정할 때 자주 사용됩니다.

ECX/CX/CH/CL – 카운터(카운트 레지스터), 루프 반복 횟수에 대한 카운터로 사용됩니다.

EDX/DX/DH/DL – 데이터 레지스터(데이터 레지스터), 중간 데이터를 저장하는 데 사용됩니다. 일부 팀에서는 해당 사용이 필수입니다.

이 그룹의 모든 레지스터는 "하위" 부분에 대한 액세스를 허용합니다. 이러한 레지스터의 하위 16비트 및 8비트 부분만 자체 주소 지정에 사용될 수 있습니다. 이들 레지스터의 상위 16비트는 독립된 객체로 사용할 수 없습니다.

길이가 32, 16 또는 8비트인 요소 체인의 순차적 처리를 허용하는 문자열 처리 명령을 지원하려면 다음이 사용됩니다.

ESI/SI(소스 인덱스 레지스터) – 색인 원천. 현재 소스 요소의 주소를 포함합니다.

EDI/DI(대상 인덱스 레지스터) – 색인 수화기(받는 사람). 대상 행의 현재 주소를 포함합니다.

마이크로프로세서 아키텍처에서는 데이터 구조(스택)가 하드웨어 및 소프트웨어 수준에서 지원됩니다. 스택 작업을 위한 특수 명령어와 특수 레지스터가 있습니다. 스택은 더 작은 주소 쪽으로 채워집니다.

ESP/SP(스택 포인터 레지스터) – 등록하다 바늘 스택. 현재 스택 세그먼트의 스택 맨 위에 대한 포인터를 포함합니다.

EBP/BP(기본 포인터 레지스터) – 스택 베이스 포인터 레지스터. 스택 내부의 데이터에 대한 무작위 액세스를 구성하도록 설계되었습니다.

1.1.2. 세그먼트 레지스터

마이크로프로세서 소프트웨어 모델에는 6개의 세그먼트 레지스터: CS, SS, DS, ES, GS, FS. 이들의 존재는 Intel 마이크로프로세서의 특정 구성 및 RAM 사용으로 인해 발생합니다. 마이크로프로세서 하드웨어는 다음으로 구성된 프로그램의 구조적 구성을 지원합니다. 세그먼트.세그먼트 레지스터는 현재 사용 가능한 세그먼트를 나타내는 데 사용됩니다. 마이크로프로세서는 다음 세그먼트 유형을 지원합니다.

    코드 세그먼트.프로그램 명령이 포함되어 있습니다. 이 세그먼트에 액세스하려면 CS 레지스터(코드 세그먼트 레지스터)를 사용하십시오. 세그먼트 코드 레지스터. 여기에는 마이크로프로세서가 액세스할 수 있는 기계 명령 세그먼트의 주소가 포함됩니다.

    데이터 세그먼트.프로그램에서 처리한 데이터를 포함합니다. 이 세그먼트에 접근하려면 DS(데이터 세그먼트 레지스터) 레지스터를 사용하십시오. 세그먼트 데이터 레지스터, 현재 프로그램의 데이터 세그먼트 주소를 저장합니다.

    스택 세그먼트.이 세그먼트는 스택이라고 불리는 메모리 영역입니다. 마이크로프로세서는 먼저 "들어가는 것", 먼저 "나가는 것"이라는 원칙에 따라 스택을 구성합니다. 스택에 액세스하려면 SS(스택 세그먼트 레지스터) 레지스터를 사용합니다. 스택 세그먼트 레지스터, 스택 세그먼트의 주소를 포함합니다.

    추가 데이터 세그먼트.처리된 데이터는 세 개의 추가 데이터 세그먼트에 위치할 수 있습니다. 기본적으로 데이터는 데이터 세그먼트에 있는 것으로 간주됩니다. 추가 데이터 세그먼트를 사용하는 경우 해당 주소는 명령의 특수 세그먼트 재정의 접두사를 사용하여 명시적으로 지정되어야 합니다. 추가 데이터 세그먼트의 주소는 ES, GS, FS 레지스터(확장 데이터 세그먼트 레지스터)에 포함되어야 합니다.

        제어 및 상태 레지스터

마이크로프로세서에는 마이크로프로세서 자체와 명령이 현재 파이프라인에 로드된 프로그램의 상태에 대한 정보가 포함된 여러 레지스터가 포함되어 있습니다. 이것:

EIP/IP 명령어 포인터 레지스터;

    플래그 레지스터 EFLAGS/FLAGS.

이러한 레지스터를 사용하면 명령 실행 결과에 대한 정보를 얻을 수 있고 마이크로프로세서 자체의 상태에 영향을 줄 수 있습니다.

EIP/IP(명령 포인터 레지스터) – 바늘 . EIP/IP 레지스터는 32비트 또는 16비트 너비이며 현재 명령어 세그먼트에 있는 CS 세그먼트 레지스터의 내용을 기준으로 실행될 다음 명령어의 오프셋을 포함합니다. 이 레지스터는 직접 액세스할 수 없지만 점프 명령어를 사용하여 변경할 수 있습니다.

EFLAGS/FLAGS(플래그 레지스터) – 등록하다 깃발. 비트 크기는 32/16비트입니다. 이 레지스터의 개별 비트는 특정한 기능적 목적을 가지며 이를 플래그라고 합니다. 플래그는 어떤 조건이 충족되면 값 1("플래그 설정")을 취하고, 그렇지 않으면 값 0("플래그가 지워짐")을 갖는 비트입니다. 이 레지스터의 낮은 부분은 i8086의 FLAGS 레지스터와 완전히 유사합니다.

1.1.3 플래그 레지스터

플래그 레지스터는 32비트이며 이름은 EFLAGS입니다(그림 1). 레지스터의 개별 비트는 특정한 기능적 목적을 가지며 이를 플래그라고 합니다. 각각에는 특정 이름(ZF, CF 등)이 할당됩니다. EFLAGS의 하위 16비트는 i086 및 i286 마이크로프로세서용으로 작성된 프로그램을 실행할 때 사용되는 16비트 FLAGS 플래그 레지스터를 나타냅니다.

그림 1 플래그 레지스터

일부 플래그는 일반적으로 조건 플래그라고 합니다. 명령이 실행될 때 자동으로 변경되고 결과의 특정 속성(예: 0과 같은지 여부)을 기록합니다. 다른 플래그를 상태 플래그라고 합니다. 프로그램에서 변경되어 프로세서의 추가 동작에 영향을 줍니다(예: 인터럽트 차단).

조건 플래그:

CF(캐리 플래그) - 깃발을 들고. 정수를 더할 때 비트 그리드에 "맞지 않는" 캐리 단위가 나타나는 경우 또는 부호 없는 숫자를 뺄 때 첫 번째 숫자가 두 번째 숫자보다 작은 경우 값 1을 취합니다. Shift 명령에서는 비트 그리드 외부의 비트가 CF에 입력됩니다. CF는 곱셈 명령어의 기능도 포착합니다.

OF(오버플로 플래그) - 오버플로 플래그. 부호 있는 정수를 더하거나 뺄 때 결과가 절대값에서 허용 가능한 값을 초과하는 결과인 경우(가수가 오버플로되어 부호 숫자로 "등반")인 경우 1로 설정됩니다.

ZF(제로 플래그) - 제로 플래그. 명령 결과가 0이면 1로 설정됩니다.

SF(표시 플래그) - 깃발 징후. 부호 있는 숫자에 대한 연산이 음수 결과를 생성하는 경우 1로 설정됩니다.

PF(패리티 플래그) - 깃발 동등. 다음 명령의 결과에 짝수 개의 이진수가 포함되어 있으면 1과 같습니다. 일반적으로 I/O 작업에만 고려됩니다.

AF(보조 캐리 플래그) - 추가 캐리 플래그. 이진수에 대한 작업 수행 기능을 수정합니다.

상태 플래그:

DF(방향 플래그) - 방향 플래그. 선 명령에서 선을 보는 방향을 설정합니다. DF=0이면 선이 "앞으로"(처음부터 끝까지) 보이고, DF=1이면 반대 방향으로 보입니다.

IOPL(입력/출력 권한 수준) – I/O 권한 수준.작업 권한에 따라 I/O 명령에 대한 액세스를 제어하기 위해 마이크로프로세서 작동의 보호 모드에서 사용됩니다.

NT(중첩 작업) – 작업 중첩 플래그.한 작업이 다른 작업 내에 중첩되어 있다는 사실을 기록하기 위해 마이크로프로세서 작업의 보호 모드에서 사용됩니다.

시스템 플래그:

IF(인터럽트 플래그) - 인터럽트 플래그. IF=0이면 프로세서가 들어오는 인터럽트에 대한 응답을 중지하고, IF=1이면 인터럽트 차단이 제거됩니다.

TF(트랩 플래그) - 추적 플래그. TF=1일 때, 각 명령을 실행한 후 프로세서는 프로그램을 추적하기 위해 디버깅할 때 사용할 수 있는 인터럽트(1번)를 생성합니다.

RF(재개 플래그) - 재개 플래그. 디버그 레지스터에서 인터럽트를 처리할 때 사용됩니다.

VM(가상 8086 모드) – 가상 8086 플래그. 1-프로세서는 가상 8086 모드에서 작동하고, 0-프로세서는 실제 또는 보호 모드에서 작동합니다.

AC(정렬 확인) – 정렬 제어 플래그.메모리에 액세스할 때 정렬 제어를 허용하도록 설계되었습니다.

      기억의 조직.

마이크로프로세서가 접근할 수 있는 물리적 메모리를 램 (또는 랜덤 액세스 메모리 - 램). RAM은 고유한 주소(번호)를 갖는 바이트 체인입니다. 물리적.물리적 주소 값의 범위는 0~4GB입니다. 메모리 관리 메커니즘은 전적으로 하드웨어입니다.

마이크로프로세서 하드웨어는 RAM 사용에 대한 여러 모델을 지원합니다.

    분할된 모델. 이 모델에서 프로그램용 메모리는 연속적인 메모리 영역(세그먼트)으로 나누어지며, 프로그램 자체는 이러한 세그먼트에 있는 데이터에만 액세스할 수 있습니다.

    페이지 모델. 이 경우 RAM은 4KB의 고정 크기 블록 집합으로 간주됩니다. 이 모델의 주요 적용은 프로그램이 프로그램 실행을 위해 실제 메모리보다 더 많은 메모리 공간을 사용할 수 있도록 하는 가상 메모리 구성과 관련이 있습니다. Pentium 마이크로프로세서의 경우 가능한 가상 메모리 크기는 4TB에 달할 수 있습니다.

이러한 모델의 사용 및 구현은 마이크로프로세서의 작동 모드에 따라 다릅니다.

    실제 주소 모드(리얼 모드).모드는 i8086 프로세서의 작동과 유사합니다. 초기 프로세서 모델용으로 개발된 프로그램의 작동에 필요합니다.

    보호 모드.보호 모드에서는 멀티태스킹 정보 처리가 가능해지고, 4단계 권한 메커니즘과 페이징 구성을 사용하여 메모리를 보호할 수 있습니다.

    가상 8086 모드.이 모드에서는 i8086에 대한 여러 프로그램을 실행하는 것이 가능해집니다. 이 경우 리얼모드 프로그램이 동작할 수 있습니다.

분할은 여러 개의 독립적인 주소 공간이 존재하도록 보장하는 주소 지정 메커니즘입니다. 세그먼트는 독립적인 하드웨어 지원 메모리 블록입니다.

각 프로그램은 일반적으로 여러 세그먼트로 구성될 수 있지만 세 가지 주요 세그먼트(코드, 데이터, 스택)와 1~3개의 추가 데이터 세그먼트에 직접 액세스할 수 있습니다. 운영 체제는 RAM의 특정 물리적 주소에 프로그램 세그먼트를 배치한 다음 이러한 주소의 값을 적절한 레지스터에 배치합니다. 세그먼트 내에서 프로그램은 세그먼트의 시작 부분에 상대적인 주소에 선형적으로 액세스합니다. 즉, 주소 0에서 시작하여 세그먼트 크기와 동일한 주소로 끝납니다. 상대 주소 또는 편견,마이크로프로세서가 세그먼트 내의 데이터에 액세스하는 데 사용하는 것을 호출합니다. 효과적인.

리얼 모드에서 물리적 주소의 형성

리얼 모드에서 물리적 주소의 변경 범위는 0에서 1MB입니다. 최대 세그먼트 크기는 64KB입니다. 특정인에게 연락할 때 실제 주소 RAM은 세그먼트 시작 주소와 세그먼트 내 오프셋에 의해 결정됩니다. 세그먼트 시작 주소는 해당 세그먼트 레지스터에서 가져옵니다. 이 경우 세그먼트 레지스터에는 세그먼트 시작 부분의 물리적 주소 중 가장 중요한 16비트만 포함됩니다. 20비트 주소의 누락된 하위 4비트는 세그먼트 레지스터의 값을 4비트 왼쪽으로 이동하여 얻습니다. 시프트 작업은 하드웨어에서 수행됩니다. 결과 20비트 값은 세그먼트의 시작 부분에 해당하는 실제 물리적 주소입니다. 그건 실제 주소"세그먼트:오프셋" 쌍으로 지정됩니다. 여기서 "세그먼트"는 셀이 속한 메모리 세그먼트 시작 주소의 처음 16비트이고 "오프셋"은 이 셀의 16비트 주소입니다. 이 메모리 세그먼트의 시작(값 16 * 세그먼트 +오프셋은 셀의 절대 주소를 제공합니다). 예를 들어 CS 레지스터가 값 1234h를 저장하는 경우 주소 쌍 1234h:507h는 16*1234h+507h =12340h+507h = 12847h와 같은 절대 주소를 정의합니다. 이러한 쌍은 이중 단어로 작성되고 (숫자의 경우) "역전된" 형식으로 작성됩니다. 첫 번째 단어에는 오프셋이 포함되고 두 번째 단어에는 세그먼트가 포함되며 이러한 각 단어는 차례로 "거꾸로" 형태. 예를 들어, 1234h:5678h 쌍은 다음과 같이 작성됩니다. 78 | 56| 34 | 12|.

물리적 주소를 생성하는 이 메커니즘을 사용하면 소프트웨어를 재배치 가능하게 만들 수 있습니다. 즉, RAM의 특정 로딩 주소에 관계없이 독립적으로 만들 수 있습니다.

공유하다