어셈블리 언어로 된 프로그램. IBM-PC용 어셈블러 언어 명령 시스템의 일반적인 특성(기본 명령 세트, 피연산자 주소 지정의 기본 방법) 어셈블러 언어의 프로그램 구조. 어셈블리 언어 명령

일반 정보어셈블리 언어에 대해

기호 어셈블리 언어는 기계 언어 프로그래밍의 단점을 크게 제거할 수 있습니다.

주요 장점은 어셈블리 언어에서 모든 프로그램 요소가 기호 형식으로 표시된다는 것입니다. 기호 명령 이름을 이진 코드로 변환하는 것은 다음의 책임입니다. 특별 프로그램- 프로그래머를 노동 집약적인 작업에서 해방시키고 불가피한 오류를 제거하는 어셈블러.

어셈블리 언어로 프로그래밍할 때 입력되는 기호 이름은 일반적으로 프로그램의 의미를 반영하며 명령의 약어는 해당 주요 기능을 반영합니다. 예: PARAM - 매개변수, TABLE - 테이블, MASK - 마스크, ADD - 더하기, SUB - 빼기 등. 기타 이러한 이름은 프로그래머가 기억하기 쉽습니다.

어셈블리어로 프로그래밍하려면 기계어로 프로그래밍하는 것보다 복잡한 도구가 필요합니다. 마이크로컴퓨터 기반의 컴퓨터 시스템이나 세트가 포함된 PC가 필요합니다. 주변기기(영숫자 키보드, 문자 디스플레이, 플로트 드라이브 및 인쇄 장치)뿐만 아니라 필요한 유형의 마이크로프로세서를 위한 상주 또는 교차 프로그래밍 시스템도 있습니다. 어셈블리 언어를 사용하면 기계어(최대 1~4KB)보다 훨씬 더 복잡한 프로그램을 효과적으로 작성하고 디버그할 수 있습니다.

어셈블리 언어는 기계 지향적입니다. 즉, 각 마이크로프로세서 명령어에는 특정 기호 이름이 할당되기 때문에 해당 마이크로프로세서의 기계 언어 및 구조에 따라 달라집니다.

어셈블리 언어는 기계 언어에 비해 프로그래머 생산성이 크게 향상되는 동시에 마이크로프로세서의 모든 소프트웨어에서 사용 가능한 하드웨어 리소스를 사용할 수 있는 기능을 유지합니다. 이는 자격을 갖춘 프로그래머가 보다 짧은 시간 내에 실행될 수 있는 프로그램을 작성하는 것을 가능하게 합니다. 짧은 시간고급 언어로 작성된 프로그램에 비해 메모리를 덜 차지합니다.

이런 점에서 입/출력 장치(드라이버)를 제어하는 ​​거의 모든 프로그램은 상당히 다양한 고급 언어가 있음에도 불구하고 어셈블리 언어로 작성됩니다.

프로그래머는 어셈블리 언어를 사용하여 다음 매개변수를 설정할 수 있습니다.

각 마이크로프로세서 기계어 명령의 니모닉(기호 이름);

어셈블리 언어로 작성된 프로그램 라인의 표준 형식입니다.

나타내는 형식 다양한 방법으로주소 지정 및 명령 변형;

다양한 숫자 시스템에서 문자 상수와 정수 상수를 지정하기 위한 형식입니다.

프로그램을 조립(번역)하는 과정을 제어하는 ​​의사 명령입니다.

어셈블리 언어에서 프로그램은 한 줄씩 작성됩니다. 즉, 각 명령에 한 줄이 할당됩니다.

가장 일반적인 유형의 마이크로프로세서를 기반으로 구축된 마이크로컴퓨터의 경우 어셈블리 언어의 여러 변형이 있을 수 있지만 일반적으로 실제로는 하나가 널리 사용됩니다. 이것이 소위 표준 어셈블리 언어입니다.

기계 명령 수준의 프로그래밍은 프로그램을 작성할 수 있는 최소 수준입니다. 기계 명령 시스템은 컴퓨터 하드웨어에 명령을 내려 필요한 작업을 구현하기에 충분해야 합니다.

각 기계 명령은 두 부분으로 구성됩니다.

· 수술실 - "무엇을 해야 할지"를 결정합니다.

· 피연산자 - 처리 개체 정의, "무엇을 할 것인가".

어셈블리 언어로 작성된 마이크로프로세서 기계 명령은 다음 구문 형식을 갖는 한 줄입니다.

레이블 명령/지시문 피연산자 ;주석

이 경우 해당 줄의 필수 필드는 명령 또는 지시문입니다.

레이블, 명령/지시문 및 피연산자(있는 경우)는 하나 이상의 공백이나 탭 문자로 구분됩니다.

명령이나 지시문이 다음 줄에서 계속되어야 하는 경우 백슬래시 문자(\)가 사용됩니다.

기본적으로 어셈블리 언어는 명령이나 지시문을 작성할 때 대문자와 소문자를 구분하지 않습니다.

직접 주소 지정: 유효 주소는 크기가 8, 16 또는 32비트일 수 있는 기계 명령어의 오프셋 필드에 의해 직접 결정됩니다.

mov eax, 합계 ; eax = 합계

어셈블러는 sum을 데이터 세그먼트에 저장된 해당 주소(기본적으로 ds 레지스터에 의해 주소 지정됨)로 대체하고 sum에 저장된 값을 eax 레지스터에 배치합니다.

간접 주소 지정차례로 다음과 같은 유형이 있습니다.

· 간접 기본(레지스터) 주소 지정;

· 오프셋을 사용한 간접 기본(레지스터) 주소 지정;

· 간접 인덱스 주소 지정;

· 간접 기본 인덱스 주소 지정.

간접 기본(레지스터) 주소 지정.이 주소 지정을 사용하면 피연산자의 유효 주소를 sp/esp 및 bp/ebp(스택 세그먼트 작업을 위한 특정 레지스터)를 제외한 모든 범용 레지스터에서 찾을 수 있습니다. 명령에서 구문적으로 이 주소 지정 모드는 레지스터 이름을 대괄호로 묶어 표현됩니다.

이동 eax, ; eax = *esi; *주소 esi의 esi 값

소개.

소스 프로그램이 작성된 언어를 호출합니다. 입구언어이며 프로세서가 실행하기 위해 번역되는 언어는 다음과 같습니다. 쉬는 날에는혀. 입력언어를 출력언어로 변환하는 과정을 방송.프로세서는 프로그래밍에 사용되지 않는 바이너리 기계어로 프로그램을 실행할 수 있기 때문에 모든 소스 프로그램의 번역이 필요합니다. 모두 다 아는 두 가지 방법방송: 편집 및 해석.

~에 편집소스 프로그램은 먼저 출력 언어의 동등한 프로그램으로 완전히 번역됩니다. 물체프로그램을 실행한 후 실행합니다. 이 프로세스는 특수한 방법을 사용하여 구현됩니다. 프로그램들,~라고 불리는 컴파일러.입력언어가 이진코드의 기계어(출력)언어를 표현하는 기호형태인 컴파일러를 컴파일러라 한다. 어셈블러.

~에 해석소스 프로그램의 텍스트 각 줄을 분석(해석)하고 여기에 지정된 명령이 즉시 실행됩니다. 이 방법의 구현은 다음과 같습니다. 통역사 프로그램.해석이 오래 걸립니다. 효율성을 높이기 위해 통역사는 각 줄을 처리하는 대신 먼저 모든 줄을 변환합니다. 문자열을 문자로(

). 생성된 기호 시퀀스는 원본 프로그램에 할당된 기능을 수행하는 데 사용됩니다.

아래에서 설명하는 어셈블리 언어는 컴파일을 사용하여 구현됩니다.

언어의 특징.

어셈블러의 주요 기능:

● 바이너리 코드 대신에 상징적인 이름을 사용하는 언어 - 기억술.예를 들어 추가 명령의 경우(

) 니모닉이 사용됩니다

빼기(

곱셈 (

부문 (

등. 기호 이름은 메모리 셀의 주소를 지정하는 데에도 사용됩니다. 어셈블리 언어로 프로그래밍하려면 바이너리 코드와 주소 대신 어셈블러가 바이너리 코드로 변환하는 기호 이름만 알면 됩니다.

각 진술에 해당 하나의 기계 명령(코드), 즉 어셈블리 언어 프로그램의 기계 명령과 연산자 사이에는 일대일 대응이 있습니다.

● 언어로 접근 가능 모든 객체에그리고 팀. 고급 언어에는 이러한 기능이 없습니다. 예를 들어, 어셈블리 언어를 사용하면 플래그 레지스터의 비트와 고급 언어(예:

)에는 이 기능이 없습니다. 시스템 프로그래밍 언어(예: C)는 종종 중간 위치를 차지합니다. 접근성 측면에서는 어셈블리 언어에 더 가깝지만 고급 언어의 구문을 가지고 있습니다.

● 어셈블리 언어 보편적인 언어는 아니다.각각의 특정 마이크로프로세서 그룹에는 자체 어셈블러가 있습니다. 고급 언어에는 이러한 단점이 없습니다.

고급 언어와 달리 어셈블리 언어로 프로그램을 작성하고 디버깅하는 데는 많은 시간이 걸립니다. 그럼에도 불구하고 어셈블리 언어는 폭넓은 사용다음과 같은 상황으로 인해:

● 어셈블리 언어로 작성된 프로그램은 고급 언어로 작성된 프로그램보다 크기가 훨씬 작고 실행 속도가 훨씬 빠릅니다. 일부 응용 프로그램의 경우 이러한 표시기는 많은 시스템 프로그램(컴파일러 포함), 신용 카드 프로그램, 휴대폰, 장치 드라이버 등;

● 일부 절차에는 전체 권한일반적으로 고급 언어에서는 불가능한 하드웨어에 대한 작업입니다. 이 사례에는 운영 체제의 인터럽트 및 인터럽트 핸들러는 물론 임베디드 실시간 시스템의 장치 컨트롤러도 포함됩니다.

대부분의 프로그램에서는 전체 코드 중 극히 일부만이 프로그램 실행 시간의 큰 부분을 차지합니다. 일반적으로 프로그램의 1%가 실행 시간의 50%를 담당하고, 프로그램의 10%가 실행 시간의 90%를 담당합니다. 따라서 실제 상황에서 특정 프로그램을 작성하려면 어셈블러와 고급 언어 중 하나가 모두 사용됩니다.

어셈블리 언어의 연산자 형식입니다.

어셈블리 언어 프로그램은 명령(명령문, 문장)의 목록으로, 각 명령은 별도의 줄을 차지하고 레이블 필드, 작업 필드, 피연산자 필드 및 주석 필드의 네 가지 필드를 포함합니다. 각 필드에는 별도의 열이 있습니다.

라벨 필드.

열 1은 레이블 필드에 할당되며 레이블은 기호 이름 또는 식별자입니다. 구애메모리. 다음을 수행하는 데 필요합니다.

● 명령에 대한 조건부 또는 무조건 전환을 수행합니다.

● 데이터가 저장된 위치에 액세스합니다.

이러한 진술에는 라벨이 제공됩니다. 이름을 표시하기 위해 영문자(대문자)와 숫자를 사용합니다. 이름의 시작 부분에는 문자가 있어야 하고 끝에는 콜론 구분 기호가 있어야 합니다. 콜론 레이블은 별도의 줄에 작성할 수 있고 opcode는 열 2의 다음 줄에 작성할 수 있으므로 컴파일러 작업이 단순화됩니다. 콜론이 없으면 레이블이 별도의 줄에 있는 경우 작업 코드와 구별할 수 없습니다.

일부 어셈블리 언어 버전에서는 콜론이 데이터 레이블 뒤가 아닌 명령 레이블 뒤에만 배치되며 레이블 길이는 6자 또는 8자로 제한될 수 있습니다.

레이블은 명령 주소와 연관되어 있으므로 레이블 필드에 동일한 이름이 있으면 안 됩니다. 프로그램 실행 중에 메모리에서 명령이나 데이터를 호출할 필요가 없으면 레이블 필드는 비어 있습니다.

작업 코드 필드입니다.

이 필드에는 명령 또는 의사 명령에 대한 니모닉 코드가 포함됩니다(아래 참조). 명령 니모닉 코드는 언어 개발자가 선택합니다. 어셈블리 언어로

메모리에서 레지스터를 로드하기 위해 니모닉이 선택되었습니다.

), 레지스터의 내용을 메모리에 저장하기 위해 - 니모닉

). 어셈블리 언어에서

두 작업 모두에 대해 각각 동일한 이름을 사용할 수 있습니다.

니모닉 이름을 임의로 선택할 수 있는 경우 두 개의 기계 명령어를 사용해야 하는지 여부는 프로세서 아키텍처에 따라 결정됩니다.

레지스터의 니모닉도 어셈블러 버전에 따라 다릅니다(표 5.2.1).

피연산자 필드.

여기에 위치해있습니다 추가 정보, 작업을 수행하는 데 필요합니다. 점프 명령의 피연산자 필드에는 점프해야 하는 주소와 기계 명령의 피연산자인 주소 및 레지스터가 표시됩니다. 예를 들어, 8비트 프로세서에 사용할 수 있는 피연산자를 제공합니다.

● 수치 데이터,

다른 숫자 체계로 표시됩니다. 사용된 숫자 체계를 나타내기 위해 상수 뒤에는 다음 중 하나가 옵니다. 라틴 문자: 안에,

따라서 2진수, 8진수, 16진수, 10진수 체계(

꼭 적을 필요는 없습니다.) 16진수 첫 자리가 A, B, C인 경우

그런 다음 중요하지 않은 0(영)이 앞에 추가됩니다.

● 내부 마이크로프로세서 레지스터 및 메모리 셀의 코드

M(정보 출처 또는 수신자) 문자 A, B, C,

M 또는 숫자 체계의 주소(예: 10B - 레지스터 주소)

바이너리 시스템에서);

● 식별자,

항공기 등록 쌍의 경우,

첫 글자는 B,

N; 누산기와 기능 레지스터 쌍의 경우 -

; 프로그램 카운터의 경우 -

;스택 포인터의 경우 -

● 조건부에서 피연산자 또는 다음 명령어의 주소를 나타내는 레이블

(조건이 충족되는 경우) 그리고 무조건적인 전환.예를 들어 명령의 피연산자 M1

이는 레이블 필드의 주소가 식별자 M1로 표시된 명령으로 무조건 전환해야 함을 의미합니다.

● 표현,

이는 위에서 설명한 데이터를 산술 및 논리 연산자를 사용하여 연결하여 구성됩니다. 데이터 공간을 예약하는 방법은 언어 버전에 따라 다릅니다. 어셈블리 언어 개발자

단어를 정의하고 나중에 입력함 대체 옵션.

처음부터 프로세서를 위한 언어로 되어 있었습니다.

언어 버전

사용된

상수를 정의합니다).

프로세서는 길이가 다른 피연산자를 처리합니다. 이를 정의하기 위해 어셈블러 개발자는 다음과 같은 다른 결정을 내렸습니다.

길이가 다른 II 레지스터는 다른 이름을 갖습니다. EAX - 32비트 피연산자 배치용(유형

); AX - 16비트용(유형

및 AN - 8비트용(유형

● 프로세서용

각 연산 코드에 접미사가 추가됩니다.

유형에 대해

; 유형에 대한 접미사 ".B"

예를 들어, 바이트, 하프워드(

) 및 opcode를 사용하여 단어를 64비트 레지스터로 변환

각기.

댓글 필드.

이 필드는 프로그램의 작업에 대한 설명을 제공합니다. 주석은 프로그램 작동에 영향을 주지 않으며 사람을 위한 것입니다. 프로그램을 수정하는 데 필요할 수도 있으며, 이러한 설명이 없으면 숙련된 프로그래머라도 완전히 이해하기 어려울 수 있습니다. 주석은 기호로 시작하며 프로그램을 설명하고 문서화하는 데 사용됩니다. 주석의 시작 문자는 다음과 같습니다:

● 회사의 처리자를 위한 언어의 세미콜론(;)

느낌표(!) 언어로

각각의 개별 주석 행 앞에는 선행 문자가 옵니다.

의사 명령(지시문).

어셈블리 언어에는 두 가지 주요 유형의 명령이 있습니다.

기초적인프로세서 기계어 코드와 동일한 명령어입니다. 이 명령은 프로그램이 의도한 모든 처리를 수행합니다.

의사 명령또는 지시문,프로그램을 코드 조합 언어로 번역하는 프로세스를 서비스하도록 설계되었습니다. 표의 예입니다. 5.2.2는 어셈블러의 일부 의사 명령을 보여줍니다.

가족을 위해

.

프로그래밍할 때 알고리즘에 따라 동일한 명령 체인을 여러 번 반복해야 하는 상황이 있습니다. 이 상황에서 벗어나려면 다음을 수행할 수 있습니다.

● 발생할 때마다 필요한 명령 시퀀스를 작성합니다. 이러한 접근 방식은 프로그램의 양을 증가시킵니다.

● 이 시퀀스를 프로시저(서브루틴)로 배열하고 필요한 경우 호출합니다. 이 출력에는 단점이 있습니다. 특별한 프로시저 호출 명령과 반환 명령을 실행해야 할 때마다 시퀀스가 ​​짧고 자주 사용되는 경우 프로그램 속도가 크게 느려질 수 있습니다.

가장 간단하고 효과적인 방법일련의 명령을 반복적으로 반복하는 것은 다음을 사용하는 것으로 구성됩니다. 매크로,이는 프로그램에서 자주 발견되는 명령 그룹을 다시 번역하도록 설계된 의사 명령으로 표시될 수 있습니다.

매크로 또는 매크로 명령은 매크로 정의, 매크로 반전 및 매크로 확장의 세 가지 측면으로 특징 지어집니다.

매크로 정의

이는 프로그램 텍스트에서 참조용으로 사용되는 반복적으로 반복되는 프로그램 명령 시퀀스에 대한 지정입니다.

매크로 정의의 구조는 다음과 같습니다.

표현 목록; 매크로 정의

주어진 매크로 정의 구조에서 세 부분으로 구분할 수 있습니다.

● 제목

이름을 포함한 매크로

의사 명령

그리고 매개변수 세트;

● 점으로 표시됨 매크로;

● 팀

눈금

매크로 정의.

매크로 정의 매개변수 세트에는 선택한 명령어 그룹에 대한 피연산자 필드에 제공된 모든 매개변수 목록이 포함되어 있습니다. 이러한 매개변수가 프로그램 초기에 제공된 경우 매크로 정의 헤더에 표시할 필요가 없습니다.

선택한 명령 그룹을 재조립하려면 이름으로 구성된 어필이 사용됩니다.

매크로 명령 및 다른 값을 가진 매개변수 목록.

어셈블러는 컴파일 프로세스 중에 매크로 정의를 발견하면 이를 매크로 정의 테이블에 저장합니다. 이후 프로그램에 이름이 등장할 때(

) 매크로의 경우 어셈블러는 이를 매크로 본문으로 대체합니다.

매크로 이름을 opcode로 사용하는 것을 호출합니다. 거시적 반전(매크로 호출)을 매크로 본문으로 대체합니다. 매크로 확장.

프로그램이 일련의 문자(문자, 숫자, 공백, 구두점 및 새 줄로 이동하기 위한 캐리지 리턴)로 표시되는 경우 매크로 확장은 이 시퀀스의 일부 체인을 다른 체인으로 대체하는 것으로 구성됩니다.

매크로 확장은 프로그램 실행 중이 아니라 조립 프로세스 중에 발생합니다. 문자열을 조작하는 방법은 다음과 같습니다. 매크로를 의미합니다.

조립과정이 진행됩니다 두 단계로:

● 첫 번째 단계에서는 모든 매크로 정의가 유지되고 매크로 호출이 확장됩니다. 이 경우 원본 프로그램을 읽어 모든 매크로 정의가 제거된 프로그램으로 변환하고 각 매크로 호출은 매크로 본문으로 대체됩니다.

● 두 번째 단계에서는 매크로 없이 결과 프로그램을 처리합니다.

매개변수가 있는 매크로.

매개변수가 다른 값을 가질 수 있는 반복되는 명령 시퀀스로 작업하기 위해 매크로 정의가 제공됩니다.

● 와 실제매크로 호출의 피연산자 필드에 배치되는 매개변수

● 와 공식적인매개변수. 매크로 확장 중에 매크로 본문에 나타나는 각 형식 매개변수는 해당 실제 매개변수로 대체됩니다.

매개변수와 함께 매크로를 사용합니다.

프로그램 1에는 두 개의 유사한 명령 시퀀스가 ​​포함되어 있지만 첫 번째 명령은 P와 명령을 바꾼다는 점에서 다릅니다.

그리고 두 번째

프로그램 2에는 두 개의 형식 매개변수 P1과 P2가 있는 매크로가 포함되어 있습니다. 매크로 확장 중에 매크로 본문 내의 각 P1 문자는 첫 번째 실제 매개변수(P,

), 기호 P2는 두 번째 실제 매개변수(

) 프로그램 번호 1에서. 매크로 호출에서

프로그램 2는 P로 표시되어 있습니다.

첫 번째 실제 매개변수,

두 번째 실제 매개변수입니다.

프로그램 1

프로그램 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

확장된 기능.

몇 가지 고급 언어 기능을 살펴보겠습니다.

조건부 점프 명령과 점프할 레이블이 포함된 매크로를 두 번 이상 호출하면 레이블이 중복되어(레이블 중복 문제) 오류가 발생합니다. 따라서 각 호출은 프로그래머에 의해 별도의 레이블을 매개변수로 할당합니다. 언어로

레이블이 로컬로 선언되었습니다(

) 고급 기능 덕분에 어셈블러는 매크로가 확장될 때마다 자동으로 다른 레이블을 생성합니다.

다른 매크로 내에 매크로를 정의할 수 있습니다. 이 고급 기능은 프로그램의 조건부 연결과 함께 사용하면 매우 유용합니다. 고려해 봅시다

단어 크기 GT 16 M2 매크로인 경우

M2 매크로는 문의 두 부분 모두에서 정의될 수 있습니다.

그러나 정의는 프로그램이 어셈블되는 프로세서(16비트 또는 32비트)에 따라 달라집니다. M1이 호출되지 않으면 매크로 M2가 전혀 정의되지 않습니다.

또 다른 고급 기능은 매크로가 자신을 포함한 다른 매크로를 호출할 수 있다는 것입니다. 재귀적부르다. 후자의 경우 무한 루프를 피하기 위해 매크로는 확장할 때마다 변경되는 매개변수를 자체에 전달해야 합니다. 확인하다이 매개변수를 지정하고 매개변수가 특정 값에 도달하면 재귀를 종료합니다.

어셈블러에서 매크로를 사용하는 방법에 대해 설명합니다.

매크로를 사용할 때 어셈블러는 다음 두 가지 기능을 수행할 수 있어야 합니다. 매크로 정의 저장그리고 거시적 과제를 확장합니다.

매크로 정의를 저장하는 중입니다.

모든 매크로 이름은 테이블에 저장됩니다. 각 이름에는 해당 매크로에 대한 포인터가 동반되므로 필요한 경우 호출할 수 있습니다. 일부 어셈블러에는 매크로 이름에 대한 별도의 테이블이 있고 다른 어셈블러에는 매크로 이름과 함께 모든 기계 명령어 및 지시어가 있는 일반 테이블이 있습니다.

조립 중 매크로가 발생하는 경우 생성됩니다:

새 테이블 요소매크로 이름, 매개변수 수, 매크로 본문이 저장될 다른 매크로 정의 테이블에 대한 포인터;

● 목록 공식적인매개변수.

그런 다음 단순히 문자열인 매크로 본문을 읽고 매크로 정의 테이블에 저장합니다. 루프 본문에서 발생하는 형식 매개변수가 표시됩니다. 특수 문자.

매크로의 내부 표현

프로그램 2(p. 244)에 대한 위의 예는 다음과 같습니다.

MOV EAX, MOV EBX, MOV MOV &

여기서 세미콜론은 캐리지 리턴 문자로 사용되고 앰퍼샌드 &는 형식 매개변수 문자로 사용됩니다.

매크로 호출 확장.

어셈블리 중에 매크로 정의가 발견될 때마다 매크로 테이블에 저장됩니다. 매크로가 호출되면 어셈블러는 입력 장치에서 입력 데이터 읽기를 일시적으로 중지하고 저장된 매크로 본문을 읽기 시작합니다. 매크로 본문에서 추출된 형식 매개변수는 실제 매개변수로 대체되어 호출에 의해 제공됩니다. 앰퍼샌드 & before 매개변수를 사용하면 어셈블러가 이를 인식할 수 있습니다.

다양한 버전의 어셈블러가 있음에도 불구하고 어셈블리 프로세스는 공통된 특징을 가지며 여러 면에서 유사합니다. 2단계 어셈블러의 작동은 아래에 설명되어 있습니다.

2단계 어셈블러.

프로그램은 여러 개의 명령문으로 구성됩니다. 따라서 조립할 때 다음과 같은 일련의 작업을 사용할 수 있는 것 같습니다.

● 기계어로 번역합니다.

● 결과 기계어 코드를 파일로 전송하고 목록의 해당 부분을 다른 파일로 전송합니다.

● 전체 프로그램이 번역될 때까지 나열된 절차를 반복합니다.

그러나 이 접근 방식은 효과적이지 않습니다. 예를 들어 소위 문제가 있습니다. 앞으로 링크.첫 번째 명령문이 프로그램 맨 끝에 있는 명령문 P로 점프하는 경우 어셈블러는 이를 변환할 수 없습니다. 그는 먼저 연산자 P의 주소를 결정해야 하며 이를 위해서는 전체 프로그램을 읽어야 합니다. 소스 프로그램을 완전히 읽을 때마다 이를 호출합니다. 통로.두 단계를 사용하여 예측 링크 문제를 해결하는 방법을 보여드리겠습니다.

첫 번째 패스에서는 모으다모든 기호 정의(레이블 포함)를 테이블에 저장하고 두 번째 패스에서 각 연산자를 읽고 어셈블합니다. 이 방법은 상대적으로 간단하지만 원본 프로그램을 두 번째로 통과하려면 I/O 작업에 추가 시간이 필요합니다.

● 첫 번째 단계에서는 다음을 수행해야 합니다. 전환하다프로그램을 중간 형태로 만들어 표에 저장하고 원래 프로그램이 아닌 표에 따라 두 번째 과정을 수행합니다. 이 조립 방법은 두 번째 패스가 I/O 작업을 수행하지 않기 때문에 시간을 절약합니다.

첫 번째 통과.

퍼스트 패스 골- 기호 테이블을 만듭니다. 위에서 언급한 것처럼 첫 번째 단계의 또 다른 목표는 모든 매크로 정의를 보존하고 나타나는 대로 호출을 확장하는 것입니다. 결과적으로 기호 정의와 매크로 확장이 모두 한 번에 발생합니다. 기호는 다음 중 하나일 수 있습니다. 상표,또는 의미,-you 지시문을 사용하여 특정 이름이 할당됩니다.

;값 - 버퍼 크기

명령 레이블 필드의 기호 이름에 의미를 할당함으로써 어셈블러는 기본적으로 프로그램 실행 중에 각 명령이 갖게 될 주소를 지정합니다. 이를 위해 어셈블러는 조립 과정 중에 저장합니다. 명령어 주소 카운터(

)를 특수 변수로 사용합니다. 첫 번째 패스가 시작될 때 특수 변수의 값은 0으로 설정되고 처리된 각 명령 후에 해당 명령의 길이만큼 증가됩니다. 표의 예입니다. 5.2.3은 명령 길이와 카운터 값을 나타내는 프로그램 조각을 보여줍니다. 첫 번째 패스에서 테이블이 생성됩니다. 상징적 이름, 지시어그리고 작동 코드,그리고 필요한 경우 오자테이블. 리터럴은 어셈블러가 자동으로 메모리를 예약하는 상수입니다. 최신 프로세서에는 즉각적인 주소가 있는 명령어가 포함되어 있으므로 해당 어셈블러는 리터럴을 지원하지 않는다는 점을 즉시 알아두십시오.

기호 명칭표

각 이름에 대해 하나의 요소를 포함합니다(표 5.2.4). 기호 이름 테이블의 각 요소에는 이름 자체(또는 이에 대한 포인터), 숫자 값, 때로는 다음과 같은 추가 정보가 포함됩니다.

● 기호와 관련된 데이터 필드의 길이;

● 메모리 재할당 비트(프로그램이 어셈블러가 의도한 주소와 다른 주소에 로드된 경우 기호 값이 변경되는지 여부를 나타냄)

● 절차 외부에서 기호에 액세스할 수 있는지 여부에 대한 정보.

상징적인 이름은 라벨입니다. 연산자를 사용하여 지정할 수 있습니다(예:

지시 테이블.

이 표에는 프로그램을 어셈블할 때 발생하는 모든 지시문 또는 의사 명령이 나열되어 있습니다.

작업 코드 테이블.

각 연산 코드에 대해 테이블에는 연산 코드 지정, 피연산자 1, 피연산자 2, 연산 코드의 16진수 값, 명령 길이 및 명령 유형 등 별도의 열이 있습니다(표 5.2.5). 연산 코드는 피연산자의 개수와 종류에 따라 그룹으로 구분됩니다. 명령 유형은 그룹 번호를 결정하고 해당 그룹의 모든 명령을 처리하기 위해 호출되는 프로시저를 지정합니다.

두 번째 패스.

두 번째 패스의 목표- 목적 프로그램 생성 및 필요한 경우 조립 프로토콜 인쇄 링커가 서로 다른 시간에 어셈블된 프로시저를 하나의 실행 파일로 연결하는 데 필요한 정보를 출력합니다.

두 번째 단계에서는(첫 번째 단계와 마찬가지로) 명령문이 포함된 행을 하나씩 읽고 처리합니다. 원래 연산자와 16진수로 파생된 출력 연산자 물체코드를 인쇄하거나 나중에 인쇄하기 위해 버퍼에 넣을 수 있습니다. 명령 주소 카운터를 재설정한 후 명령이 호출됩니다. 다음 진술.

소스 프로그램에 다음과 같은 오류가 있을 수 있습니다.

해당 기호가 정의되지 않았거나 두 번 이상 정의되었습니다.

● opcode가 잘못된 이름(오타로 인해)으로 표시되거나, 피연산자가 충분하지 않거나, 피연산자가 너무 많습니다.

● 운영자 없음

일부 어셈블러에서는 정의되지 않은 기호를 감지하여 바꿀 수 있습니다. 그러나 대부분의 경우 오류 문이 나타나면 어셈블러는 화면에 오류 메시지를 표시하고 어셈블리 프로세스를 계속하려고 시도합니다.

어셈블리 언어에 관한 기사입니다.

주제 2.5 프로세서 프로그래밍의 기초

프로그램의 길이가 길어질수록 다양한 작업의 코드를 기억하는 것이 점점 더 어려워집니다. 니모닉은 이와 관련하여 몇 가지 도움을 제공합니다.

기호 명령 코딩 언어를 호출합니다. 어셈블러.

어셈블리어각 발언이 정확히 하나의 기계 명령에 해당하는 언어입니다.

집회즉, 연산의 기호 이름을 기계어 코드로 바꾸고 기호 주소를 절대 또는 상대 숫자로 바꾸고, 라이브러리 프로그램을 통합하고 특정 매개변수를 지정하여 기호 명령 시퀀스를 생성하여 기계어로 프로그램을 준비하는 것입니다. 마이크로 팀에서. 이 프로그램일반적으로 ROM에 위치하거나 일부 외부 미디어에서 RAM으로 입력됩니다.

어셈블리 언어에는 고급 언어와 구별되는 몇 가지 기능이 있습니다.

1. 이는 어셈블리 언어 명령문과 기계 명령어 간의 일대일 대응입니다.

2. 어셈블리 언어 프로그래머는 대상 컴퓨터에 있는 모든 개체와 명령어에 액세스할 수 있습니다.

기계 지향 언어 프로그래밍의 기본을 이해하는 것은 다음과 같은 경우에 유용합니다.



PC 아키텍처에 대한 더 나은 이해와 컴퓨터의 보다 유능한 사용;

응용 문제를 해결하기 위한 프로그램을 위한 보다 합리적인 알고리즘 구조를 개발합니다.

소스 프로그램이 손실된 경우 고급 언어에서 컴파일된 .exe 및 .com 확장자를 사용하여 실행 가능한 프로그램을 보고 수정하는 기능(DEBUG 프로그램 디버거에서 지정된 프로그램을 호출하고 해당 디스플레이를 어셈블리에서 디컴파일함으로써) 언어);

가장 중요한 문제를 해결하기 위한 프로그램 컴파일(기계 지향 언어로 작성된 프로그램이 일반적으로 더 효과적입니다. 고급 언어 번역의 결과로 얻은 프로그램의 30-60%가 더 짧고 빠릅니다.)

사용되는 고급 언어나 OS 서비스 프로시저를 사용하여 구현할 수 없는 경우 기본 프로그램에 포함된 프로시저를 별도의 조각 형태로 구현합니다.

어셈블리 언어로 작성된 프로그램은 한 컴퓨터 계열에서만 실행될 수 있는 반면, 고급 언어로 작성된 프로그램은 잠재적으로 다른 컴퓨터에서 실행될 수 있습니다.

어셈블리 언어 알파벳은 ASCII 문자로 구성됩니다.

숫자는 정수일 뿐입니다. 다음이 있습니다:

이진수는 문자 B로 끝납니다.

문자 D로 끝나는 10진수

16진수는 문자 H로 끝납니다.

RAM, 레지스터, 데이터 프리젠테이션

특정 MP 시리즈의 경우 개별 프로그래밍 언어(어셈블리 언어)가 사용됩니다.

어셈블리어는 기계어와 고급언어의 중간 위치를 차지합니다. 이 언어로 프로그래밍하는 것이 더 쉽습니다. 어셈블리 언어 프로그램은 고급 언어 프로그램(프로그래머에게는 어셈블러보다 더 간단함)보다 특정 기계(좀 더 정확하게는 MP)의 기능을 더 효율적으로 사용합니다. MP KR580VM80의 ​​어셈블리 언어 예를 사용하여 기계 지향 언어 프로그래밍의 기본 원칙을 살펴 보겠습니다. 언어 프로그래밍에는 일반적인 방법론이 사용됩니다. 프로그램 녹화를 위한 특정 기술 기법은 대상 MP의 아키텍처 및 명령 시스템의 특징과 연관되어 있습니다.

소프트웨어 모델 MP KR580VM80 기반 마이크로프로세서 시스템

그림 1에 따른 MPS의 소프트웨어 모델

MP 포트 메모리

에스 A.C.

그림 1

프로그래머의 관점에서 MP KR580VM80에는 다음과 같은 프로그램 액세스 가능 레지스터가 있습니다.

– 8비트 누산기 레지스터. MP의 주요 등록부입니다. ALU에서 수행되는 모든 작업에는 처리할 피연산자 중 하나를 누산기에 배치하는 작업이 포함됩니다. ALU에서의 연산 결과도 일반적으로 A에 저장됩니다.

비, 씨, 디, 이, H, 엘– 8비트 범용 레지스터(GPR). 내부 기억 MP. 처리된 정보와 작업 결과를 저장하도록 설계되었습니다. 16비트 단어를 처리할 때 레지스터는 BC, DE, HL 쌍을 형성하며 이중 레지스터를 첫 번째 문자(B, D, H)라고 합니다. 레지스터 쌍에서 가장 높은 것이 첫 번째 레지스터입니다. 레지스터 H와 L에는 데이터 저장과 RAM 셀의 16비트 주소 저장에 사용되는 특별한 속성이 있습니다.

플로리다– 플래그 레지스터(sign Register) MP에서 산술 및 논리 연산을 수행한 결과의 5개 부호가 저장되는 8비트 레지스터입니다. 그림에 따른 FL 형식

비트 C(CY - 캐리) - 캐리, 산술 연산을 수행할 때 바이트의 상위 순서에서 캐리가 있는 경우 1로 설정됩니다.

비트 P(패리티) – 패리티, 결과 비트의 1 수가 짝수이면 1로 설정됩니다.

AC 숫자는 결과의 하위 4차원 캐리지 값을 저장하도록 설계된 추가 캐리입니다.

비트 Z(0) - 연산 결과가 0이면 1로 설정됩니다.

비트 S(부호) – 결과가 음수이면 1로 설정되고 결과가 양수이면 0으로 설정됩니다.

SP– 스택에 삽입된 마지막 바이트가 기록된 메모리 셀의 주소를 저장하도록 설계된 16비트 레지스터인 스택 포인터.

RS– 프로그램 카운터(프로그램 카운터)는 실행될 다음 명령어의 주소를 저장하도록 설계된 16비트 레지스터입니다. 프로그램 카운터의 내용은 다음 명령어 바이트를 가져온 직후 자동으로 1씩 증가합니다.

주소 0000Н – 07FF의 초기 메모리 영역에는 제어 프로그램및 시연 프로그램. ROM 영역입니다.

0800 – 0AFF - 연구 중인 프로그램을 기록하기 위한 주소 영역입니다. (램).

0В00 – 0ВВ0 - 데이터 쓰기를 위한 주소 영역입니다. (램).

0ВВ0 – 스택의 시작 주소. (램).

스택은 데이터 또는 주소의 임시 저장을 위해 특별히 구성된 RAM 영역입니다. 스택에 마지막으로 기록된 숫자가 먼저 팝됩니다. 스택 포인터는 정보가 기록되는 마지막 스택 셀의 주소를 저장합니다. 서브루틴이 호출되면 메인 프로그램으로의 복귀 주소가 자동으로 스택에 저장됩니다. 일반적으로 각 서브루틴이 시작될 때 실행과 관련된 모든 레지스터의 내용이 스택에 저장되고 서브루틴이 끝나면 스택에서 복원됩니다.

어셈블리 언어의 데이터 형식과 명령 구조

MP KR580VM80의 ​​메모리는 바이트라고 하는 8비트 단어의 배열입니다. 각 바이트는 메모리 셀 시퀀스에서 위치를 결정하는 고유한 16비트 주소를 갖습니다. MP는 ROM과 RAM 모두에 포함될 수 있는 65536바이트의 메모리 주소를 지정할 수 있습니다.

데이터 형식

데이터는 8비트 단어로 메모리에 저장됩니다.

D7 D6 D5 D4 D3 D2 D1 D0

최하위 비트는 비트 0이고 최상위 비트는 비트 7입니다.

명령은 형식, 즉 명령에 할당된 비트 수로 특징지어지며, 이는 바이트 단위로 특정 기능 필드로 나뉩니다.

명령 형식

MP KR580VM80 명령은 1바이트, 2바이트 또는 3바이트 형식을 갖습니다. 멀티바이트 명령은 인접한 언어로 배치되어야 합니다. 명령 형식은 수행되는 작업의 세부 사항에 따라 다릅니다.

명령의 첫 번째 바이트에는 니모닉 형식으로 작성된 작업 코드가 포함됩니다.

이는 실행 중에 MP가 데이터에 대해 수행해야 하는 명령 형식과 작업, 주소 지정 방법을 결정하고 데이터 위치에 대한 정보도 포함할 수 있습니다.

두 번째 및 세 번째 바이트에는 연산이 수행되는 데이터 또는 데이터의 위치를 ​​나타내는 주소가 포함될 수 있습니다. 작업이 수행되는 데이터를 피연산자라고 합니다.

그림 2에 따른 단일 바이트 명령 형식

그림 4

어셈블리어 명령에서 연산 코드는 영어 단어를 간략하게 표현한 니모닉 표기법을 사용합니다. 니모닉(그리스 니모닉 - 암기 기술)을 사용하면 기능적 목적에 따라 명령을 더 쉽게 기억할 수 있습니다.

실행 전에 소스 프로그램은 어셈블러라는 번역 프로그램을 사용하여 코드 조합 언어, 즉 기계어로 번역되며, 이 형식으로 MP의 메모리에 배치된 다음 명령을 실행할 때 사용됩니다.


주소 지정 방법

모든 피연산자 코드(입력 및 출력)는 어딘가에 위치해야 합니다. MP의 내부 레지스터에 위치할 수 있습니다(가장 편리하고 빠른 옵션). 시스템 메모리에 위치할 수 있습니다(가장 일반적인 옵션). 마지막으로 I/O 장치에 위치할 수 있습니다(가장 드문 경우). 피연산자의 위치는 명령어 코드에 따라 결정됩니다. 존재하다 다양한 방법, 명령어 코드는 입력 피연산자를 가져올 위치와 출력 피연산자를 배치할 위치를 결정할 수 있습니다. 이러한 방법을 주소 지정 방법이라고 합니다.

MP KR580VM80의 ​​경우 다음과 같은 주소 지정 방법이 있습니다.

직접;

등록하다;

간접;

쌓였습니다.

직접 주소 지정에서는 (입력) 피연산자가 메모리에서 명령어 코드 바로 뒤에 위치한다고 가정합니다. 피연산자는 일반적으로 어딘가로 전송되거나 무언가에 추가되어야 하는 상수입니다. 데이터는 명령의 두 번째 또는 두 번째 및 세 번째 바이트에 포함되며 데이터의 하위 바이트는 명령의 두 번째 바이트에 있습니다. 세 번째 명령 바이트의 상위 바이트입니다.

똑바로 (일명 절대) 주소 지정은 피연산자(입력 또는 출력)가 메모리 주소의 주소에 있다고 가정합니다. 해당 코드는 프로그램 내부에서 명령 코드 바로 뒤에 위치합니다. 3바이트 명령에 사용됩니다.

등록하다 주소 지정에서는 피연산자(입력 또는 출력)가 MP의 내부 레지스터에 있다고 가정합니다. 단일 바이트 명령에 사용됨

간접 (암시적) 주소 지정은 MP의 내부 레지스터에 피연산자 자체가 아니라 메모리의 주소가 포함되어 있다고 가정합니다.

스택 주소 지정에서는 명령에 주소가 포함되어 있지 않다고 가정합니다. 16비트 SP 레지스터(스택 포인터)의 내용을 사용하여 메모리 셀 주소 지정.

명령 시스템

MP 명령 시스템은 MP가 수행할 수 있는 기본 작업의 전체 목록입니다. 이러한 명령으로 제어되는 MP는 기본 산술 및 논리 연산, 데이터 전송, 두 값 비교 등과 같은 간단한 작업을 수행합니다. MP KR580VM80의 ​​명령 수는 78개입니다(수정 244개 고려).

다음 명령 그룹이 구별됩니다.

데이터 전송;

산수;

두뇌티저;

점프 명령;

입력/출력, 제어 및 스택 명령.


명령어를 설명하거나 프로그램을 구성할 때 사용하는 기호 및 약어

상징 절감
주소 16비트 주소
데이터 8비트 데이터
데이터 16 16비트 데이터
포트 8비트 I/O 장치 주소
바이트 2 명령의 두 번째 바이트
바이트 3 명령의 세 번째 바이트
R, R1, R2 레지스터 중 하나: A, B, C, D, E, H, L
R.P. 레지스터 쌍 중 하나: B - BC 쌍을 지정합니다. D - DE 쌍을 지정합니다. H – HL 쌍을 지정합니다.
RH 쌍의 첫 번째 등록
R.L. 쌍의 두 번째 레지스터
Λ 논리적 곱셈
V 논리적 추가
덧셈 모듈로 2
주소가 레지스터 쌍 HL의 내용을 지정하는 메모리 셀, 즉 M = (HL)

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) 및 보조 프로세서.

      레지스터.

마이크로프로세서 내부의 정보는 어느 정도 프로그래머가 사용할 수 있는 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의 특정 로딩 주소에 관계없이 독립적으로 만들 수 있습니다.

기계 명령 수준의 프로그래밍은 프로그램을 작성할 수 있는 최소 수준입니다. 기계 명령 시스템은 컴퓨터 하드웨어에 명령을 내려 필요한 작업을 구현하기에 충분해야 합니다.

각 기계 명령은 두 부분으로 구성됩니다.

  • 운영 - "무엇을 해야할지"를 결정합니다.
  • 피연산자 - 처리 개체 정의, "무엇을 해야할지".

어셈블리 언어로 작성된 마이크로프로세서 기계 명령은 다음 구문 형식을 갖는 한 줄입니다.

명령/지시어 레이블 피연산자 ;주석

이 경우 해당 줄의 필수 필드는 명령 또는 지시문입니다.

레이블, 명령/지시문 및 피연산자(있는 경우)는 하나 이상의 공백이나 탭 문자로 구분됩니다.

명령이나 지시문이 다음 줄에서 계속되어야 하는 경우 백슬래시 문자(\)가 사용됩니다.

기본적으로 어셈블리 언어는 명령이나 지시문을 작성할 때 대문자와 소문자를 구분하지 않습니다.

코드 예시:

카운트 DB 1 ;이름, 지시문, 피연산자 1개
이동 eax,0 ;명령, 두 개의 피연산자
cbw ; 팀

태그

상표 어셈블리 언어에는 다음 기호가 포함될 수 있습니다.

  • 라틴 알파벳의 모든 문자;
  • 0부터 9까지의 숫자;
  • 특수 문자: _, @, $, ?.

마침표는 레이블의 첫 번째 문자로 사용할 수 있지만 일부 컴파일러에서는 이 문자 사용을 권장하지 않습니다. 예약된 어셈블러 이름(지시문, 연산자, 명령 이름)은 레이블로 사용할 수 없습니다.

레이블의 첫 번째 문자는 문자 또는 특수 문자여야 합니다(숫자는 제외). 최대 길이태그 – 31자. 어셈블러 지시문이 포함되지 않은 줄에 작성된 모든 레이블은 콜론(:)으로 끝나야 합니다.

마이크로프로세서가 수행해야 하는 작업을 번역자에게 알려줍니다. 데이터 세그먼트에서 명령(또는 지시문)은 필드, 작업 공간 또는 상수를 정의합니다. 코드 세그먼트에서 명령은 이동(mov) 또는 추가(add)와 같은 작업을 지정합니다.

지시어

어셈블러에는 어셈블리 및 나열 프로세스를 제어할 수 있는 여러 연산자가 있습니다. 이러한 연산자를 호출합니다. 지시어 . 이는 프로그램을 조립하는 과정에서만 작동하며 명령과 달리 기계어를 생성하지 않습니다.

피연산자

피연산자 – 기계 명령이나 프로그래밍 언어 명령문이 실행되는 개체입니다.
명령어에는 하나 또는 두 개의 피연산자가 있을 수도 있고 피연산자가 전혀 없을 수도 있습니다. 피연산자 수는 명령어 코드에 의해 암시적으로 지정됩니다.
예:

  • 피연산자 없음 ret ;Return
  • 피연산자 1개 증가 ecx ;ecx 증가
  • 두 피연산자는 eax,12를 더하고, eax에 12를 더합니다.

레이블, 명령(지시문) 및 피연산자는 줄의 특정 위치에서 시작할 필요가 없습니다. 그러나 프로그램을 더 쉽게 읽을 수 있도록 열에 작성하는 것이 좋습니다.

피연산자는 다음과 같습니다.

  • 식별자;
  • 작은따옴표나 큰따옴표로 묶인 문자열;
  • 2진수, 8진수, 10진수 또는 16진수 체계의 정수입니다.
식별자

식별자 – 연산 코드, 변수 이름, 라벨 이름과 같은 프로그램 개체를 나타내는 데 사용되는 유효한 문자 시퀀스.

식별자 기록 규칙.

  • 식별자는 하나 이상의 문자로 구성될 수 있습니다.
  • 기호로는 라틴 알파벳 문자, 숫자 및 일부 특수 문자(_, ?, $, @)를 사용할 수 있습니다.
  • 식별자는 숫자 문자로 시작할 수 없습니다.
  • 식별자의 길이는 최대 255자까지 가능합니다.
  • 변환기는 식별자의 처음 32자를 허용하고 나머지는 무시합니다.
코멘트

주석은 실행 가능한 줄과 문자로 구분됩니다. . 이 경우 세미콜론 이후부터 줄 끝까지 작성된 모든 내용은 주석입니다. 프로그램에서 주석을 사용하면 특히 명령 세트의 목적이 불분명한 경우 프로그램의 명확성이 향상됩니다. 주석에는 공백을 포함하여 인쇄 가능한 모든 문자가 포함될 수 있습니다. 주석은 전체 줄에 걸쳐 있을 수도 있고 같은 줄의 명령 뒤에 올 수도 있습니다.

어셈블리 프로그램 구조

어셈블리 언어로 작성된 프로그램은 다음과 같은 여러 부분으로 구성될 수 있습니다. 모듈 . 각 모듈에는 하나 이상의 데이터, 스택 및 코드 세그먼트가 정의되어 있습니다. 완전한 어셈블러 프로그램에는 실행이 시작되는 하나의 기본 모듈이 포함되어야 합니다. 모듈에는 적절한 지시문을 사용하여 선언된 코드 세그먼트, 데이터 세그먼트 및 스택 세그먼트가 포함될 수 있습니다. 세그먼트를 선언하기 전에 .MODEL 지시문을 사용하여 메모리 모델을 지정해야 합니다.

어셈블리 언어로 된 "아무 것도 하지 않는" 프로그램의 예:

686P
.모델 플랫, STDCALL
.데이터
.암호
시작:

RET
종료 시작

이 프로그램에는 하나의 마이크로프로세서 명령만 포함되어 있습니다. 이 명령은 RET입니다. 프로그램이 올바르게 종료되는지 확인합니다. 일반적으로 이 명령은 프로시저를 종료하는 데 사용됩니다.
프로그램의 나머지 부분은 번역기 작동에 관한 것입니다.
.686P - Pentium 6(Pentium II) 보호 모드 명령이 허용됩니다. 이 지시어는 프로세서 모델을 나타내는 지원되는 어셈블러 명령어 세트를 선택합니다. 지시문 끝에 표시된 문자 P는 프로세서가 보호 모드에서 작동 중임을 번역자에게 알립니다.
.MODEL FLAT, stdcall - 플랫 메모리 모델. 이 메모리 모델은 수술실에서 사용됩니다. 윈도우 시스템. 표준 호출
.DATA는 데이터가 포함된 프로그램 세그먼트입니다.
.CODE는 코드가 포함된 프로그램 블록입니다.
시작 - 라벨. 어셈블러에서 태그는 현대 고급 언어에서는 말할 수 없는 큰 역할을 합니다.
END START - 프로그램의 끝과 프로그램 실행이 START 라벨로 시작되어야 한다는 번역자에게 보내는 메시지입니다.
각 모듈에는 끝을 표시하는 END 지시문이 포함되어야 합니다. 소스 코드프로그램들. END 지시어 뒤에 오는 모든 줄은 무시됩니다. END 지시어를 생략하면 오류가 발생합니다.
END 지시문 뒤에 지정된 레이블은 프로그램 실행이 시작되는 기본 모듈의 이름을 변환기에게 알려줍니다. 프로그램에 하나의 모듈이 포함되어 있으면 END 지시문 뒤의 레이블을 생략할 수 있습니다.




맨 위