어셈블러 구문. 태그. 기계 코드 및 어셈블리 언어로 프로그래밍. NOLIST - 목록 생성 비활성화

조립 지침

컴파일러는 여러 지시문을 지원합니다. 지시문은 코드로 직접 변환되지 않습니다. 대신 위치를 나타내는 데 사용됩니다. 프로그램 메모리, 매크로 정의, 메모리 초기화 등 모든 지시문 앞에는 점이 있습니다.

지시문 목록은 다음 표에 나와 있습니다.

지령 설명
바이트 RAM에 바이트 예약
CSEG 프로그램 세그먼트
DB 플래시 또는 eeprom에서 바이트 정의
데프 레지스터에 기호 이름 지정
장치 프로그램이 컴파일되는 장치 결정
DSEG 데이터 세그먼트
DW 플래시 또는 eeprom에서 단어 정의
엔드엠, 엔드마크로 매크로 끝
EQU 상수 표현식 설정
ESEG EEPROM 세그먼트
출구 종료 파일
포함하다 다른 파일 첨부
목록 목록 생성 활성화
리스트맥 목록에서 매크로 확장 사용
매크로 매크로 시작
놀리스트 목록 생성 끄기
조직 세그먼트에서 위치 설정
세트 표현식과 동등한 변수 설정

BYTE - RAM에 바이트를 예약합니다. BYTE 지시문은 RAM에 바이트를 예약합니다. 할당된 메모리 영역을 참조할 수 있으려면 BYTE 지시문 앞에 레이블이 있어야 합니다. 지시문은 할당할 바이트 수를 지정하는 하나의 필수 매개변수를 사용합니다. 이 지시어는 데이터 세그먼트에서만 사용할 수 있습니다(CSEG 및 DSEG 지시어 참조). 할당된 바이트는 초기화되지 않습니다.

통사론:

태그: .BYTE 식

DSEG var1: .BYTE 1 ; var1에 대해 1바이트 예약

테이블: .BYTE tab_size ; tab_size 바이트 예약

Ldi r30,low(var1) ; 레지스터 Z의 하위 바이트를 로드합니다.

Ldi r31,high(var1) ; 레지스터 Z의 상위 바이트 로드

Ldr1,Z ; var1을 레지스터 1에 로드합니다.

DB - 플래시 또는 EEPROM에서 바이트를 정의합니다. DB 지시문은 프로그램 메모리 또는 EEPROM에 매우 중요한 바이트 수를 예약합니다. 할당된 메모리 영역을 참조할 수 있으려면 DB 지시문 앞에 레이블이 있어야 합니다. DB 지시문에는 최소한 하나의 매개변수가 있어야 합니다.
ref.rf에서 호스팅됨

지시문에 전달된 매개변수는 쉼표로 구분된 일련의 표현식입니다. 각 식은 범위(-128..255)의 숫자이거나 계산 결과 같은 범위의 결과를 제공해야 합니다. 그렇지 않으면 숫자가 경고 없이 바이트로 잘립니다.

명령이 둘 이상의 매개변수를 수신하고 현재 프로그램 세그먼트가 있는 경우 매개변수는 단어로 압축됩니다(첫 번째 매개변수는 하위 바이트임). 매개변수의 수가 홀수이면 다른 DB 지시문이 뒤따르더라도 마지막 표현식은 바이트로 잘리고 상위 바이트가 0인 워드로 작성됩니다.

통사론:

태그: .DB 식_목록

CSEG 상수: .DB 0, 255, 0b01010101, -128, 0xaa

const2: .DB 1,2,3

DW - 플래시 또는 eeprom에서 단어를 정의합니다. DW 지시문은 프로그램 메모리 또는 EEPROM에 매우 중요한 수의 단어를 예약합니다. 할당된 메모리 영역을 참조할 수 있으려면 DW 지시문 앞에 레이블이 있어야 합니다. DW 지시문에는 최소한 하나의 매개변수가 있어야 합니다.
ref.rf에서 호스팅됨
이 지시문은 프로그램 세그먼트(CSEG) 또는 EEPROM 세그먼트(ESEG)에만 있어야 합니다.

지시문에 전달된 매개변수는 쉼표로 구분된 일련의 표현식입니다. 각 식은 범위(-32768..65535)의 숫자이거나 계산 결과 같은 범위의 결과를 제공해야 합니다. 그렇지 않으면 숫자가 경고 없이 단어로 잘립니다.

통사론:

TAG: .DW 표현 목록

varlist:= .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

eevarlst: .DW 0.0xffff,10

세그먼트

DSEG - 데이터 세그먼트. DSEG 지시어는 데이터 세그먼트의 시작을 정의합니다. 소스 파일은 컴파일 시 하나의 세그먼트로 결합되는 여러 데이터 세그먼트로 구성될 수 있습니다. 데이터 세그먼트는 일반적으로 BYTE 지시문과 레이블로만 구성됩니다. 데이터 세그먼트에는 자체 바이트 위치 카운터가 있습니다. ORG 지시문은 RAM의 매우 중요한 위치에 변수를 할당하는 데 사용되어야 합니다. 지시문에는 매개변수가 없습니다.

통사론:

ldi r30,low(var1) ; 레지스터 Z의 하위 바이트 로드

ldi r31,high(var1) ; 레지스터 Z의 상위 바이트 로드

ld r1,Z ; var1을 레지스터 r1에 로드

CSEG - 프로그램 세그먼트. CSEG 지시문은 프로그램 세그먼트의 시작을 정의합니다. 소스 파일은 컴파일 시 하나의 프로그램 세그먼트로 결합되는 여러 프로그램 세그먼트로 구성될 수 있습니다. 프로그램 세그먼트는 기본 세그먼트입니다. 프로그램 세그먼트에는 바이트 단위가 아니라 워드 단위로 계산되는 자체 위치 카운터가 있습니다. ORG 지시문은 세그먼트의 중요한 위치에 코드와 상수를 배치하는 데 사용해야 합니다. CSEG 지시문에는 매개변수가 없습니다.

통사론:

DSG; 데이터 세그먼트의 시작

vartab: .BYTE 4 ; RAM에 4바이트 예약

CSEG; 코드 세그먼트 시작

상수: .DW 2 ; 프로그램 메모리에 상수 0x0002 배치

이동 r1,r0 ; 작업 실행

ESEG - EEPROM 세그먼트. ESEG 지시문은 EEPROM 세그먼트의 시작을 정의합니다. 소스 파일은 컴파일 중에 하나의 세그먼트로 결합되는 여러 EEPROM 세그먼트로 구성될 수 있습니다. EEPROM 세그먼트는 일반적으로 DB, DW 지시문 및 레이블로만 구성됩니다. EEPROM 세그먼트에는 자체 바이트 위치 카운터가 있습니다. EEPROM의 매우 중요한 위치에 변수를 배치하려면 ORG 지시문을 사용해야 합니다. 지시문에는 매개변수가 없습니다.

통사론:

DSG; 데이터 세그먼트의 시작

var1: .BYTE 1 ; var1에 1바이트 예약

테이블: .BYTE tab_size ; tab_size 바이트를 예약합니다.

eevar1: .DW 0xffff ; EEPROM에서 1워드 초기화

ORG - 세그먼트의 위치를 ​​설정합니다. ORG 지시문은 매개변수로 전달되는 주어진 값으로 위치 카운터를 설정합니다.
ref.rf에서 호스팅됨
데이터 세그먼트의 경우 SRAM(RAM)의 위치 카운터를 설정하고, 프로그램 세그먼트의 경우 프로그램 카운터이며, EEPROM 세그먼트의 경우 EEPROM의 위치를 ​​설정한다는 점에 유의해야 합니다. 지시문 앞에 레이블(같은 줄)이 있으면 레이블은 지시문 매개변수에 지정된 주소에 배치됩니다. 컴파일이 시작되기 전에 프로그램 카운터와 EEPROM 카운터는 0이고 RAM 카운터는 32입니다(어드레스 0-31이 레지스터에 의해 점유되기 때문). RAM 및 EEPROM 카운터는 바이트 카운터이고 프로그램 세그먼트 카운터는 워드 카운터입니다.

통사론:

ORG 표현식

DSG; 데이터 세그먼트의 시작

조직 0x37 ; SRAM 주소를 0x37로 설정

변수: .BYTE 1 ; 주소 0x37H에 예약 바이트

CSEG.ORG 0x10 ; 프로그램 카운터를 0x10으로 설정

이동 r0,r1 ; 이 명령주소 0x10에 배치됩니다.

통사론:

매크로

MACRO - 매크로의 시작.매크로 정의는 MACRO 지시문으로 시작합니다. 매크로의 이름은 지시문에 매개변수로 전달됩니다. 매크로 이름이 프로그램 텍스트에서 나중에 발견되면 컴파일러는 이 이름을 매크로 본문으로 바꿉니다. 매크로는 최대 10개의 매개변수를 가질 수 있으며 본문의 @0-@9를 통해 액세스할 수 있습니다. 호출되면 매개변수가 쉼표로 구분되어 나열됩니다. 매크로 정의는 ENDMACRO 지시문으로 끝납니다.

기본적으로 매크로 호출만 목록에 포함되며 LISTMAC 지시문을 사용하여 매크로를 확장하는 것이 매우 중요합니다. 목록의 매크로는 + 기호로 표시됩니다.

통사론:

MACRO 매크로 이름

매크로수비16 ; 매크로 정의 시작

subi @1,low(@0) ; 매개변수 1에서 매개변수 0의 하위 바이트를 뺍니다.

sbci @2,high(@0) ; 매개변수 2에서 매개변수 0의 상위 바이트를 뺍니다.

CSEG; 프로그램 세그먼트 시작

SUBI16 0x1234,r16,r17 ; r17:r16 쌍에서 0x1234 빼기

ENDMACRO - 매크로의 끝.지시문은 매크로의 끝을 정의하고 매개변수를 사용하지 않습니다. 매크로 정의에 대한 자세한 내용은 MACRO 지시문을 참조하십시오.

통사론:

매크로수비16 ; 매크로 정의 시작

subi r16,low(@0) ; 첫 번째 매개변수의 하위 바이트를 뺍니다.

sbci r17,high(@0) ; 첫 번째 매개변수의 상위 바이트를 뺍니다.

LISTMAC - 목록에서 매크로 확장을 활성화합니다. LISTMAC 지시문 다음에 컴파일러는 목록에 매크로의 내용을 표시합니다. 기본적으로 목록에는 매크로 호출과 전달된 매개변수만 표시됩니다.

통사론:

매크로 MACX ; 매크로 정의

추가 r0,@0 ; 매크로 본문

엔드마크로 ; 매크로 정의 끝

리스트맥 ; 매크로 확장 사용

MACX r2,r1 ; 매크로 호출(매크로 본문이 목록에 표시됨)

· 표현

EQU - 상수 표현식을 설정합니다. EQU 지시문은 레이블에 값을 할당합니다. 이 레이블은 나중에 식에서 사용할 수 있습니다. 이 지시어에 의해 할당된 레이블은 재할당되지 않아야 하며 해당 값을 변경해서는 안 됩니다.

통사론:

EQU 레이블 = 표현

동등 io_offset = 0x23

EQU 포트 = io_offset + 2

CSEG; 데이터 세그먼트의 시작

clr2 ; 레지스터 r2 지우기

SET - 표현식에 해당하는 변수 기호를 설정합니다. SET 지시문은 이름에 non-ĸᴏᴛᴏᴩᴏᴇ 값을 할당합니다. 이 이름은 나중에 식에서 사용해야 합니다. 또한 EQU 지시어와 달리 이름의 값은 다른 SET 지시어에 의해 변경되어야 합니다.

통사론:

SET 이름 = 표현식

세트 io_offset = 0x23

SET 포트 = io_offset + 2

CSE ; 코드 세그먼트 시작

clr2 ; 레지스터 2 지우기

아웃포타,r2 ; 포트 A에 쓰기

DEF - 레지스터에 기호 이름을 할당합니다. DEF 지시문을 사용하면 ĸᴏᴛᴏᴩᴏᴇ 기호 이름이 아닌 레지스터를 참조할 수 있습니다. 할당된 이름은 프로그램의 다음 부분 전체에서 이 레지스터에 액세스하는 데 사용할 수 있습니다. 레지스터는 여러 다른 이름을 가질 수 있습니다. 기호 이름은 나중에 프로그램에서 다시 지정해야 합니다.

통사론:

DEF Symbolic_name = 케이스

ldi temp,0xf0 ; 임시 레지스터(R16)에 0xf0 로드

eortemp,ior ; 레지스터 temp 및 ior는 배타적이거나 추가됩니다.

DEVICE - 장치를 정의합니다. DEVICE 지시문을 사용하면 프로그램이 컴파일되는 장치를 지정할 수 있습니다. 이 지시문을 사용할 때 이 마이크로컨트롤러에서 지원하지 않는 명령어가 발견되면 컴파일러는 경고를 발행합니다.
ref.rf에서 호스팅됨
프로그램 세그먼트 또는 EEPROM 세그먼트가 장치에서 허용하는 크기를 초과하는 경우에도 경고가 발행됩니다. 지시어를 사용하지 않으면 모든 명령어가 유효한 것으로 간주되며 세그먼트 크기에 대한 제한이 없습니다.

통사론:

장치 AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

장치 AT90S1200 ; AT90S1200에서 사용

푸시 r30 ; 이 명령은 경고를 발생시킵니다. AT90S1200에는 경고가 없습니다.

종료 - 파일을 종료합니다.만난 EXIT 지시어, 컴파일러가 컴파일을 중지합니다. 주어진 파일. 지시문이 첨부 파일에서 사용되는 경우(INCLUDE 지시문 참조) 컴파일은 INCLUDE 지시문 다음 줄부터 계속됩니다. 파일이 중첩되지 않으면 컴파일이 중지됩니다.

통사론:

출구 ; 이 파일 종료

포함 - 다른 파일을 첨부합니다. INCLUDE 지시문을 만나면 컴파일러는 그 안에 지정된 파일을 열고 파일이 끝나거나 EXIT 지시문이 나타날 때까지 컴파일한 다음 INCLUDE 지시문 다음 줄에서 초기 파일을 계속 컴파일합니다. 첨부 파일에는 INCLUDE 지시어가 포함될 수도 있습니다.

통사론:

"파일 이름" 포함

; iodefs.asm 파일:

EQU sreg = 0x3f ; 상태 레지스터

EQU sphigh = 0x3e ; 스택 포인터 상위 바이트

EQU 스플로 = 0x3d ; 스택 포인터 하위 바이트

; incdemo.asm 파일

포함 iodefs.asm ; Nest 포트 정의

목록

LIST - 목록 생성을 활성화합니다. LIST 지시문은 컴파일러에게 목록을 만드는 것이 매우 중요하다고 알려줍니다. 목록은 어셈블리 코드, 주소 및 opcode의 조합입니다. 기본적으로 목록 생성이 활성화되어 있지만 이 지시문은 개별 부품 목록을 가져오기 위해 NOLIST 지시문과 함께 사용됩니다. 소스 파일.

구문: .LIST

NOLIST - 목록 생성을 끕니다. NOLIST 지시문은 목록 생성을 중지하도록 컴파일러에 지시합니다. 목록은 어셈블리 코드, 주소 및 opcode의 조합입니다. 목록 생성은 기본적으로 활성화되어 있지만 이 지시어로 비활성화해야 합니다. 또한 이 지시문은 소스 파일의 개별 부분 목록을 얻기 위해 LIST 지시문과 함께 사용해야 합니다.

통사론:.NOLIST

예: .NOLIST ; 목록 생성 비활성화

포함 "macro.inc" ; 첨부파일은 안됩니다

포함 "const.def" ; 목록에 표시된

목록 ; 목록 생성 활성화

어셈블러 지시문 - 개념 및 유형. "조립 지침" 2017, 2018 범주의 분류 및 기능.

다음은 전체 AVR 시리즈의 어셈블러에 대한 정보입니다. 이 시리즈의 모든 마이크로컨트롤러는 소프트웨어와 호환됩니다.
어셈블러는 마이크로 컨트롤러용 프로그램을 만드는 데 사용되는 도구입니다. 어셈블러는 어셈블러를 번역합니다. 원천시뮬레이터 또는 AVR 에뮬레이터에서 사용할 수 있는 개체 코드로 프로그램합니다. 어셈블러는 또한 마이크로컨트롤러의 프로그램 메모리에 직접 입력할 수 있는 코드를 생성합니다.
어셈블러로 작업할 때 마이크로컨트롤러에 직접 연결할 필요가 없습니다.

어셈블러가 작업하는 소스 파일에는 니모닉, 지시문 및 레이블이 포함되어야 합니다.
각 프로그램 행 앞에 콜론으로 끝나는 영숫자 문자열인 레이블이 올 수 있습니다. 레이블은 무조건 점프 및 조건부 점프 명령에 대한 지침으로 사용됩니다.

프로그램 문자열은 다음 네 가지 형식 중 하나일 수 있습니다.

[ 레이블:] 지시문 [피연산자] [설명]
[ 레이블:] 명령 [피연산자] [설명]
코멘트
빈 줄

주석의 형식은 다음과 같습니다.

따라서 문자 “ ; ”는 어셈블러에서 무시되며 사용자에게만 의미가 있습니다.

피연산자는 다양한 형식으로 지정할 수 있습니다.

십진수(기본값): 10.255
- 16진수(두 가지 방법): 0x0a, $0a
- 바이너리: 0b00001010, 0b11111111
- 8진수(앞에 0): 010, 077

2 명령 시스템

AVR 제품군의 ATMEL 마이크로컨트롤러의 명령어 세트는 매우 크고 동시에 효과적입니다. 중 하나 고유 한 특징 AVR 마이크로컨트롤러는 거의 모든 명령이 1클럭 주기로 실행된다는 것입니다. 예외는 점프 명령입니다. 이는 상대적으로 낮은 클록 주파수에서도 마이크로컨트롤러의 성능을 크게 향상시킵니다.

모든 명령은 5가지 유형으로 분류할 수 있습니다.
1. 산술 명령
2. 논리적 명령;
3. 전환 명령;

  • 데이터 전송 명령;
  • 비트 명령 및 비트 테스트 명령.

3 어셈블리 언어 지시문

어셈블러는 많은 지시문을 지원합니다. 지시문은 opcode로 직접 변환되지 않습니다. 반대로 메모리에서 프로그램의 위치를 ​​조정하고, 매크로를 정의하고, 메모리를 초기화하는 등의 작업에 사용됩니다. 즉, 이것은 마이크로컨트롤러 명령이 아니라 어셈블러 자체에 대한 명령입니다.
모든 어셈블러 지시문은 표에 나와 있습니다. 1.2.

표 1.2.
조립 지침


지령

설명

변수에 대한 바이트 예약

코드 세그먼트

메모리에 영구 바이트 설정

기호 이름을 레지스터로 설정

컴파일할 마이크로컨트롤러 유형 설정

데이터 세그먼트

메모리에 영구 단어 설정

EEPROM 세그먼트

파일 종료

다른 파일의 소스 코드 포함

.lst 파일 생성 활성화

.lst 생성 해제 - 파일

프로그램 시작 주소

문자를 표현식과 동일하게 설정

모든 지시문의 구문은 다음과 같습니다.
.[지령]
즉, 지시문 앞에는 점이 있어야 합니다. 그렇지 않으면 어셈블러에서 레이블로 취급합니다.
가장 중요한 어셈블러 지시문에 대해 몇 가지 설명하겠습니다.

CSEG 코드 세그먼트

CSEG 지시문은 코드 세그먼트의 시작을 나타냅니다. 어셈블 중인 파일에는 여러 코드 세그먼트가 있을 수 있으며, 이 세그먼트는 어셈블하는 동안 하나로 결합됩니다.
통사론:

CSEG
예:
vartab: .BYTE 4 ; SRAM에 4바이트 예약됨
상수: .DW 2 ; 프로그램 메모리에 0x0002 쓰기
이동 r1,r0 ; 할 일

DSEG - 데이터 세그먼트

DSEG 지시문은 데이터 세그먼트의 시작을 나타냅니다. 어셈블 중인 파일에는 여러 데이터 세그먼트가 포함될 수 있으며, 이 세그먼트는 어셈블하는 동안 하나로 어셈블됩니다. 일반적으로 데이터 세그먼트는 BYTE 지시문과 레이블로만 구성됩니다.

통사론:

DSEG
예:

테이블: .BYTE tab_size ; tab_size 바이트를 예약합니다.
.CSEG
ldi r30, 낮음(var1)
ldi r31, 높음(var1)
ld r1, Z

ESEG - EEPROM 세그먼트

ESEG 지시문은 EEPROM 메모리 세그먼트의 시작 부분을 가리킵니다. 어셈블되는 파일에는 여러 EEPROM 세그먼트가 포함될 수 있으며, 이는 어셈블리 중에 하나의 세그먼트로 어셈블됩니다. 일반적으로 EEPROM 세그먼트는 DB 및 DW 지시문(및 레이블)으로 구성됩니다. EEPROM 메모리 세그먼트에는 자체 카운터가 있습니다. ORG 지시문을 사용하여 EEPROM의 원하는 영역에 변수를 배치할 수 있습니다.
통사론:

DSG; 데이터 세그먼트의 시작
var1: .BYTE 1 ; var1 변수용으로 1바이트 예약
테이블: .BYTE tab_size ; tab_size 바이트를 예약합니다.
.ESEG
eevar1: .DW 0xffff ; EEPROM에 1워드 쓰기

ORG - 프로그램 시작 주소 설정

ORG 지시문은 로컬 카운터에 값을 할당합니다. .CSEG, .DSEG, .ESEG 지시문과 함께만 사용됩니다.
통사론:

DSG; 데이터 세그먼트의 시작
.ORG 0x37 ; SRAM 주소를 37h로 설정
변수: .BYTE 1 ; 주소 37h에 SRAM 바이트 예약
.CSEG
.ORG 0x10 ; 프로그램 카운터를 주소 10h로 설정
이동 r0,r1 ; 할 일

DB - 프로그램 메모리 또는 EEPROM에서 바이트 정의

DB 지시문은 프로그램 메모리 또는 EEPROM에 메모리 리소스를 예약합니다. 지시문 앞에 레이블이 와야 합니다. DB는 표현식 목록을 지정하며 최소한 하나의 표현식을 포함해야 합니다. 지시문은 코드 세그먼트 또는 EEPROM 세그먼트에 배치해야 합니다.

식 목록은 쉼표로 구분된 일련의 식입니다. 각 식은 -128에서 255 사이의 값이어야 합니다.

지시문이 코드 세그먼트에 지정되고 표현식 목록에 세 개 이상의 값이 포함된 경우 플래시 메모리의 각 단어에 2바이트가 배치되도록 표현식이 작성됩니다.

통사론:

LABEL: .DB 표현식 목록

CSEG
상수: .DB 0, 255, 0b01010101, -128, 0xaa
.ESEG
const2: .DB 1,2,3

DW - 프로그램 메모리 또는 EEPROM에서 단어 정의

DW 지시문은 프로그램 메모리 또는 EEPROM에 메모리 리소스를 예약합니다. 지시문 앞에 레이블이 와야 합니다. DW는 표현식 목록을 지정하고 하나 이상의 표현식을 포함해야 합니다. 지시문은 코드 세그먼트 또는 EEPROM 세그먼트에 배치해야 합니다.

식 목록은 쉼표로 구분된 일련의 식입니다. 각 식은 -32768에서 65535 사이의 값이어야 합니다.

통사론:

LABEL: .DW 표현식 목록

CSEG
변수 목록: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535
.ESEG
eevarlst: .DW 0.0xffff,10

DEF - 레지스터에 이름 부여

DEF 지시문을 사용하면 레지스터에 기호 이름을 할당할 수 있습니다. 레지스터는 여러 기호 이름을 가질 수 있습니다.
통사론:

DEF 이름=등록

방어 온도=R16
.DEF ior=R0
.CSEG
ldi temp,0xf0 ; 임시 레지스터에 0xf0 로드
in ior,0x3f ; ior 레지스터로 SREG 읽기
온도,

EQU - 표현식에 이름 지정

EQU 지시문은 레이블에 값을 할당합니다. 이 레이블은 다른 표현식에서 사용할 수 있습니다. 이 레이블의 값은 변경하거나 재정의할 수 없습니다.

통사론:

EQU 레이블=식

동등 io_offset = 0x23
.EQU 포트 = io_offset + 2
.CSEG ; 코드 세그먼트 시작
clr2 ; 레지스터 r2 지우기
아웃포타,r2 ; 포트 A에 쓰기

INCLUDE - 다른 파일 삽입

INCLUDE 지시문은 어셈블러에게 다른 파일에서 읽기를 시작하도록 지시합니다. 어셈블러는 파일의 끝까지 또는 EXIT 지시어까지 이 파일을 어셈블합니다. 포함 파일 자체에 INCLUDE 지시문이 포함될 수 있습니다.
통사론:

"파일 이름" 포함

; iodefs.asm:
.EQU sreg = 0x3f ; 상태 레지스터
.EQU sphigh = 0x3e ; 스택 포인터의 상위 바이트입니다.
.EQU 스플로 = 0x3d; ; 스택 포인터의 하위 바이트입니다.
; incdemo.asm
.INCLUDE iodefs.asm ; "iodefs.asm" 파일 포함
r0에서,sreg ; 상태 레지스터 읽기

출구- 종료 파일

EXIT 지시문을 사용하면 어셈블러가 현재 파일 어셈블을 중지할 수 있습니다. 일반적으로 어셈블러는 파일이 끝날 때까지 작동합니다. EXIT 지시문을 만나면 INCLUDE 지시문 다음 줄에서 계속 어셈블합니다.
통사론:

출구 ; 이 파일을 종료

장치- 조립할 마이크로컨트롤러 지정
이 지시문을 통해 사용자는 어셈블러에게 프로그램이 작성되는 장치 유형을 알릴 수 있습니다. 어셈블러가 지정된 유형의 마이크로컨트롤러에서 지원하지 않는 명령을 발견하면 메시지가 발행됩니다. 프로그램 크기가 이 장치에서 사용 가능한 메모리 양을 초과하는 경우에도 메시지가 나타납니다.
통사론:

장치 AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

장치 AT90S8535 ; AT90S8535 사용
.CSEG
.ORG0000
jmp-label1; 조립시 AT90S8535는 jmp 명령을 지원하지 않는다는 메시지가 나타납니다.
1.5.2.4 프로그래밍의 일부 기능

데이터 메모리는 거의 전적으로 사용자 프로그램에서 사용할 수 있으며 대부분의 어셈블러 명령어는 데이터를 교환하도록 설계되었습니다. 데이터 전송 명령은 SRAM 셀, I/O 레지스터 및 범용 레지스터의 직접 주소 지정을 직간접적으로 처리하는 기능을 제공합니다. 각 레지스터는 메모리 셀과 연결되어 있기 때문에 레지스터 주소 지정 명령뿐만 아니라 SRAM 셀 주소 지정 명령으로도 액세스할 수 있습니다.

예를 들어 다음 명령은 다음과 같습니다.

MOV R10,R15 - 레지스터 R15를 레지스터 R10에 복사
다음 명령과 정확히 동일합니다.
LDS R10,$0015 - 주소가 $0015인 셀의 내용을 레지스터 R10에 로드합니다.
I/O 레지스터에도 동일하게 적용됩니다. 그들에 대한 특별한 명령이 있습니다:
IN Rd,P - I/O 포트 번호 P에서 레지스터 Rd로 데이터 로드
OUT P,Rd - Rd 레지스터의 데이터를 숫자 P로 I/O 포트에 씁니다.
이 명령을 사용할 때 포트 번호는 0 범위에서 지정됩니다. 다른 명령을 사용하는 예:

LDI R16,$FF
OUT $12,R16 - PORTD에 숫자 255를 씁니다.
STS $0032,R16 - 숫자 255를 $0032 셀에 직접 씁니다.
SRAM의 I/O 레지스터 주소는 포트 번호에 $20를 더하여 얻습니다.
프로그램 메모리는 ROM이며 칩이 프로그래밍될 때만 변경됩니다. 상수는 프로그램 메모리에 단어로 저장할 수 있습니다.

예를 들어: .dw $033f,$676d,$7653,$237e,$777f
프로그램 메모리에 있는 데이터로 작업하기 위해 명령이 제공됩니다.
엘피엠- 레지스터 Z가 가리키는 프로그램 메모리 바이트를 레지스터 R0에 로드합니다.
상수의 바이트 주소는 Z 레지스터의 내용에 의해 결정됩니다.상위 15비트는 주소 워드(0에서 4k까지)를 결정하고, 최하위 비트의 상태는 최하위 바이트(0) 또는 최상위 바이트(1).
I/O 포트로 작업할 때 다음과 같은 기능을 고려해야 합니다. 포트 핀이 출력으로 설정되면 데이터 레지스터(PORTA, PORTB, PORTC, PORTD)를 통해 스위칭되고, 핀이 입력으로 설정되면 포트 입력 핀 레지스터(PINA)를 통해 폴링되어야 합니다. , PINB, PINC, PIND).
산술 및 논리 명령을 사용하는 기능 중 일부는 레지스터 R16-R31에서만 작동한다는 것입니다.

CPI Rd,K - 레지스터 Rd를 상수 K와 비교합니다. 16 CBI 및 SBI 명령어는 하위 32개 I/O 레지스터에서만 작동합니다.
서브루틴을 사용할 때 스택을 정의해야 합니다! 이렇게 하려면 SPH 및 SPL 레지스터에 스택 맨 위의 주소 값을 입력해야 합니다.

지시문(의사 연산자)은 어셈블러에 대한 지침이며 프로그램을 어셈블(변환)할 때만 처리됩니다. 다음은 일반적으로 사용되는 지시문 중 일부입니다.

식별자 지시어

주어진 이름을 가진 식별자에는 일부 텍스트 또는 숫자 값(표현식)이 할당됩니다. 지시문 형식:

이름 EQU 텍스트

이름 = 숫자 값(표현식)

EQU와 = 의사 연산자의 차이점:

l EQU - 영구적으로 값을 할당합니다(변경할 수 없음). 텍스트는 상수, 주소, 기타 기호 이름, 레이블 등을 정의하는 기호, 숫자 또는 혼합 표현식이 될 수 있습니다.

l = - 현재 할당을 수행합니다(값을 재할당할 수 있지만 물론 변환 중에만 가능). 변환 중에 수행될 간단한 수학적 변환을 포함하는 숫자 표현식만 지정합니다(예: const + 1, 15H*4, 3*12/4 등).

데이터 정의 지시문

변수 및 메모리 필드를 식별하는 데 사용됩니다. 지시문 형식

[이름] D* 식 [, 식] [,...].

D* 키워드는 다음과 같습니다.

l DB - 정의 바이트(1바이트);

l DW - 정의 단어(2바이트);

l DD - 더블 워드(4바이트)를 정의합니다.

l DQ - 8바이트를 정의합니다.

l DT- 10바이트를 정의합니다.

문제의 지시문은 변수(이름)를 선언하거나 메모리의 필드(셀)에 초기 값을 할당합니다. 메모리에 예약(나중에 값 할당 포함) 하나 이상의 바이트 - DB, 단어 - DW, 이중 단어 - DD 등

식은 할당해야 하는 메모리 요소 수와 거기에 포함해야 하는 데이터를 보여줍니다. 표현식은 다음과 같을 수 있습니다.

리터 상수:
const DB 56; const DW 1936; const DD 3FFH.
바이트, 워드 등의 범위와 용량을 반드시 고려하십시오. 따라서 DB의 경우 상수는 255를 초과할 수 없으며 DW의 경우 - 65535, DD의 경우 -



l 65535 2 - 1 = 4 294 967 295;

l 벡터 또는 테이블:
table1 DB 30, 4, -15, 0, 0, 0, 56; 표2 DW 1936, 3004, 56, 15.
하나의 의사 연산자에서 최대 132개의 문자열을 배치할 수 있으며 동일한 값을 여러 번 반복하는 대신(table1의 0) DUP(중복) 의사 연산자를 사용할 수 있습니다.
table1 DB 30, 4, -15, 3 dup(0), 56);

l 문자열 포함:
str1 DB "너무 큰 숫자를 입력하셨습니다";
str2 DB "잘못된 명령";
DB 의사 연산자에서 문자열은 255자를 포함할 수 있으며 다른 모든 문자열(DW, DD, DQ, DT)에는 2자만 포함될 수 있습니다.

빈 필드가 있는 l:
field1DB?; pole2 DW 12dup(?),
동시에 프로그램이 로드될 때 예약된 메모리 요소에 아무것도 기록되지 않습니다(예를 들어 pole3 DW 5 dup(0) 지시문에서와 같이 0이 입력되지 않지만 메모리 셀은 단순히 예약됨).

l 기호 변수 이름:
var1 DW 디스플레이; var2 DD 벡터
(한 변수는 다른 변수의 주소로 정의되며, 변수 이름이 주소로 인식되기 때문에 지시문에 오프셋을 지정할 필요가 없습니다.) 이 옵션은 예를 들어 메모리 셀의 주소, 프로그램에서 참조할 수 있는 레이블(var1 DW disp)을 저장하는 데 적합하며 변수가 참조 명령과 동일한 세그먼트에 있는 경우에만 지정하는 것으로 충분합니다. 오프셋을 주소(2바이트)로, 즉 DW를 생략합니다. 변수가 다른 세그먼트에 있으면 세그먼트와 오프셋(총 4바이트)을 모두 지정해야 합니다. 즉, DD(var2 DD 벡터)를 사용해야 합니다.

l 간단한 표현:
fn1DB 80*3; fn2 DW(disp) + 256, 물론 프로그램이 번역될 때만 계산됩니다.

세그먼트 및 프로시저 정의 지시문

세그먼트는 의사문으로 정의됩니다.

segment_name 세그먼트

끝 이름 끝

프로그램에서 4개의 세그먼트(세그먼트 레지스터 수에 따라)를 사용할 수 있으며 각각에 대해 의사 연산자 ASSUME(가정 - 할당)를 사용하여 해당 세그먼트 레지스터를 지정할 수 있습니다. 예를 들면 다음과 같습니다.

CS:codeseg, DS:dataseg, SS:stackseg로 가정

ASSUME 지시어 seg_name [,..], 특히 ASSUME cs:codeseg는 seg_name 세그먼트(codeseg)가 레지스터 seg(CS)로 설정되도록 지정합니다.

ASSUME 지시문 다음에 데이터 세그먼트의 시작 주소를 명시적으로 DS 레지스터에 로드해야 합니다.

절차는 의사 진술로 정의됩니다.

procedure_name 프로시저 ...

procedure_name 종료

절차를 정의할 때 proc 키워드 뒤에 근거리 또는 원거리 속성을 지정해야 합니다. 이 속성이 없으면 기본적으로 near로 간주됩니다. 일반적으로 프로시저는 ret(return) 명령으로 끝나야 합니다. 프로시저가 가깝다고 선언되면 동일한 세그먼트에서 호출해야 합니다. procfar인 경우 모든 세그먼트에서(이 경우 ret 명령은 반환 시 스택에서 두 단어를 검색합니다: for IP 및 for CS).

브로드캐스트 제어 지시문

그 중 몇 가지가 있으며 가장 일반적으로 사용되는 것은 END입니다. END 지시문은 프로그램의 끝을 표시하고 어셈블러에게 변환을 끝낼 위치를 알려줍니다. 형식: END [프로그램 이름].

I/O 장치 작업을 위한 프로그래밍 절차

PC에서 I/O 절차는 일반적으로 인터럽트에 의해 수행됩니다. DOS 인터럽트 21H의 주요 인터럽트 유형 및 유틸리티 기능의 구성 및 사용은 작업에서 논의됩니다. 아래에서는 디스플레이에 정보를 표시하고 키보드에서 입력하기 위한 I/O 전용 인터럽트 프로그래밍 문제에 대해 간략하게 설명합니다. 정보를 프린터로 출력하는 문제와 파일로 작업하는 문제가 작품에서 고려됩니다.

디스플레이 프로그래밍

작동 모드 설정 및 디스플레이와의 데이터 교환은 BIOS 유형 10H 인터럽트로 수행할 수 있으며 디스플레이로의 데이터 출력은 DOS 유형 21H 인터럽트로 수행할 수도 있습니다.

인터럽트 비디오 작업 21H DOS

문자 출력화면 표시: AH=2 또는 AH=6 및 DL<>0FFh. DL 레지스터는 문자의 ASCII 코드를 포함해야 합니다. 프로그램 조각의 예(문자 "C"의 출력):

이동 DL, 43H ; 43H는 문자 C의 ASCII 코드입니다.

문자열 출력: AH = 9(가장 일반적으로 사용되는 기능). DS:DX 레지스터에는 $ 문자로 끝나야 하는 문자열의 시작 주소가 포함되어야 합니다. 프로그램 조각의 예("출력 문자열 $" 텍스트 표시):

Text db "문자열 출력$"

mov DX, 오프셋 텍스트 ; 출력 문자열의 주소입니다.

파일 입출력논리 번호를 통해. 표준 파일 논리 번호는 I/O의 유형과 장치를 결정합니다.

l 0 - 키보드에서 입력;

l 1 - 디스플레이 화면으로 출력;

l 2- 오류 메시지 표시;

l 3- 외부 장치에 대한 입출력;

내가 4 - 인쇄물.

입력의 경우 인터럽트 21H의 AH = 3Fh 기능이 사용되며, 출력의 경우 인터럽트 21H의 AH = 40h 기능이 사용됩니다. CX 레지스터는 입/출력 바이트 수로 사전 로드되고 DX 레지스터는 I/O 메모리 필드의 시작 주소로 사전 로드됩니다. I/O 절차가 성공적으로 완료되면 CF 전송 플래그가 0으로 재설정되고 실제로 전송된 바이트 수가 AX 레지스터에 반환됩니다. 작업이 실패하면 CF 플래그가 1로 설정되고 AX 레지스터에 오류 코드가 입력됩니다.

다음 예제에는 50바이트가 포함된 텍스트 파일을 표시하기 위한 프로그램 스니펫이 포함되어 있습니다.

텍스트 db 50 dup(" ")

이동 BX, 1 ; 출력 장치 지정

mov CX, 50 ; 출력할 바이트 수 지정

mov DX, 오프셋 텍스트 ; 시작 주소

; 텍스트를 포함하는 메모리 필드

컴파일 대상 장치 결정

지시문에 전달된 매개변수는 쉼표로 구분된 일련의 표현식입니다. 각 표현식은 범위(-128..255) 또는

계산 결과는 동일한 범위의 결과를 제공해야 합니다. 그렇지 않으면 숫자가 경고 없이 바이트로 잘립니다.

명령이 하나 이상의 매개변수를 수신하고 현재 프로그램 세그먼트가 있는 경우 매개변수는 워드로 압축됩니다(첫 번째 매개변수는 하위 바이트임).

매개변수의 수가 홀수이면 마지막 표현식은 바이트로 잘리고 상위 바이트가 0인 워드로 작성됩니다.

db 지시어.

통사론:
태그: .DB 식_목록

예:
.CSEG
상수: .DB 0, 255, 0b01010101, -128, 0xaa

지시문에 전달된 매개변수는 쉼표로 구분된 일련의 표현식입니다. 각 식은 범위(-32768..65535)의 숫자이거나

계산 결과는 동일한 범위의 결과를 제공해야 합니다. 그렇지 않으면 숫자가 경고 없이 단어로 잘립니다.

통사론:
TAG: .DW 표현 목록

예:
.CSEG
변수 목록: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

통사론:
.ENDMACRO

예:
.MACRO SUBI16 ; 매크로 정의 시작
subi r16,low(@0) ; 첫 번째 매개변수의 하위 바이트를 뺍니다.
sbci r17,high(@0) ; 첫 번째 매개변수의 상위 바이트를 뺍니다.
.ENDMACRO

EQU - 상수 표현식 설정

EQU 지시문은 레이블에 값을 할당합니다. 이 레이블은 나중에 식에서 사용할 수 있습니다. 이 지시어에 의해 값이 할당된 레이블은

재할당되며 해당 값은 변경할 수 없습니다.

통사론:
.EQU 레이블 = 표현식

예:
.EQU io_offset = 0x23
.EQU 포트 = io_offset + 2

CSEG; 데이터 세그먼트의 시작
clr2 ; 레지스터 r2 지우기
아웃포타,r2 ; 포트 A에 쓰기

ESEG - EEPROM 세그먼트

ESEG 지시문은 EEPROM 세그먼트의 시작을 정의합니다. 소스 파일은 컴파일 중에 하나의 세그먼트로 결합되는 여러 EEPROM 세그먼트로 구성될 수 있습니다.

EEPROM 세그먼트는 일반적으로 지시문으로만 구성됩니다.

href="#DW - 프로그램 메모리 및 EEPROM에 상수 단어 정의">DW

그리고 라벨. EEPROM 세그먼트에는 자체

바이트 위치 카운터. 지시문을 사용하여 배치할 수 있습니다.

EEPROM의 원하는 위치에 있는 변수. 지시문에는 매개변수가 없습니다.

통사론:
.ESEG

예:
var1: .BYTE 1 ; var1에 1바이트 예약
테이블: .BYTE tab_size ; tab_size 바이트를 예약합니다.

ESEG
eevar1: .DW 0xffff ; EEPROM에서 1워드 초기화

EXIT - 파일 종료

EXIT 지시문을 만나면 컴파일러는 지정된 파일의 컴파일을 중지합니다. 지시어가 첨부파일에 사용된 경우(지시어 참조

href="#INCLUDE - 다른 파일 포함">INCLUDE

), 그런 다음 INCLUDE 지시문 다음 줄부터 컴파일이 계속됩니다.

파일이 중첩되지 않은 경우 컴파일이 중지됩니다.

통사론:
.출구

예:
.출구 ; 이 파일 종료

포함 - 다른 파일 첨부

INCLUDE 지시문을 만나면 컴파일러는 지정된 파일을 열고 파일이 끝나거나 지시문을 만날 때까지 컴파일합니다.

href="#EXIT - 이 파일 종료">EXIT

그런 다음 지시문 다음 줄에서 초기 파일의 컴파일을 계속합니다.

포함하다. 첨부 파일에는 INCLUDE 지시어가 포함될 수도 있습니다.

통사론:
.INCLUDE "파일 이름"

예:
; iodefs.asm 파일:
.EQU sreg = 0x3f ; 상태 레지스터
.EQU sphigh = 0x3e ; 스택 포인터 상위 바이트
.EQU 스플로 = 0x3d ; 스택 포인터 하위 바이트

; incdemo.asm 파일
.INCLUDE iodefs.asm ; Nest 포트 정의
r0에서,sreg ; 상태 레지스터 읽기

LIST - 목록 생성 활성화

LIST 지시문은 컴파일러에게 목록을 만들도록 지시합니다. 목록은 어셈블리 코드, 주소 및 opcode의 조합입니다. 에 의해

목록 생성은 기본적으로 활성화되지만 이 지시문은 소스 파일의 개별 부분 목록을 가져오는 지시문과 함께 사용됩니다.

통사론:
.목록

예:

LISTMAC - 목록에서 매크로 확장 사용

LISTMAC 지시문 다음에 컴파일러는 목록에 매크로의 내용을 표시합니다. 기본적으로 목록에는 매크로 호출과 전달된

옵션.

통사론:
.LISTMAC

예:
.MACRO MACX ; 매크로 정의
추가 r0,@0 ; 매크로 본문
또는 r1,@1

리스트맥 ; 매크로 확장 사용
MACX r2,r1 ; 매크로 호출(목록에 본문 매크로가 표시됨)

매크로 - 매크로 시작

매크로 정의는 MACRO 지시문으로 시작합니다. 매크로의 이름은 지시문에 매개변수로 전달됩니다. 매크로 이름이 프로그램 텍스트에서 나중에 발견되면

컴파일러는 이 이름을 매크로 본문으로 바꿉니다. 매크로는 최대 10개의 매개변수를 가질 수 있으며 본문의 @0-@9를 통해 액세스할 수 있습니다. 호출되면 매개변수가 열거됩니다.

쉼표를 통해. 매크로 정의는 지시문으로 끝납니다.

기본적으로 매크로 호출만 목록에 포함되며 매크로를 확장하려면 지시문을 사용해야 합니다. 목록의 매크로는 + 기호로 표시됩니다.

통사론:
.MACRO 매크로 이름

예:
.MACRO SUBI16 ; 매크로 정의 시작
subi @1,low(@0) ; 매개변수 1에서 매개변수 0의 하위 바이트를 뺍니다.
sbci @2,high(@0) ; 매개변수 2에서 매개변수 0의 상위 바이트를 뺍니다.
.ENDMACRO ; 매크로 정의 끝

CSEG; 프로그램 세그먼트 시작
SUBI16 0x1234,r16,r17 ; r17:r16에서 0x1234 빼기

NOLIST - 목록 생성 비활성화

NOLIST 지시문은 목록 생성을 중지하도록 컴파일러에 지시합니다. 목록은 어셈블리 코드, 주소 및

작업 코드. 목록 생성은 기본적으로 활성화되어 있지만 이 지시어로 비활성화할 수 있습니다. 또한 이 지시문을 사용할 수 있습니다.

개별 부품 목록을 가져오는 지시문과 함께

소스 파일

통사론:
.NOLIST

예:
.NOLIST ; 목록 생성 비활성화
.INCLUDE "macro.inc" ; 첨부파일은 안됩니다
.INCLUDE "const.def" ; 목록에 표시된
.목록 ; 목록 생성 활성화

ORG - 세그먼트의 위치 설정

ORG 지시문은 매개변수로 전달되는 주어진 값으로 위치 카운터를 설정합니다. 데이터 세그먼트의 경우 위치 카운터를 다음으로 설정합니다.

SRAM(RAM), 프로그램 세그먼트의 경우 프로그램 카운터이고 EEPROM 세그먼트의 경우 EEPROM의 위치입니다. 지시문 앞에 레이블(같은 줄에 있음)이 있는 경우

레이블은 지시문 매개변수에 지정된 주소에 배치됩니다. 컴파일이 시작되기 전에 프로그램 카운터와 EEPROM 카운터는 0이고 RAM 카운터는 32입니다.

(주소 0-31이 레지스터에 의해 점유되기 때문에). 바이트 카운터는 RAM 및 EEPROM에 사용되고 워드 카운터는 프로그램 세그먼트에 사용됩니다.

통사론:
.ORG 표현식

예:
.DSEG; 데이터 세그먼트의 시작

조직 0x37 ; SRAM 주소를 0x37로 설정
변수: .BYTE 1 ; 주소 0x37H에 예약 바이트

CSEG
.ORG 0x10 ; 프로그램 카운터를 0x10으로 설정
이동 r0,r1 ; 이 명령은 주소 0x10에 배치됩니다.

SET - 표현식에 해당하는 변수 기호 설정

SET 지시문은 이름에 값을 할당합니다. 이 이름은 나중에 식에서 사용할 수 있습니다. 또한 지침과 달리

href="#EQU - 표현식과 동일한 기호 설정">EQU

이름 값은 다른 SET 지시문으로 변경할 수 있습니다.

통사론:
.SET 이름 = 식

예:
.SET io_offset = 0x23
.SET 포트 = io_offset + 2

CSEG; 코드 세그먼트 시작
clr2 ; 레지스터 2 지우기

책의 이 부분에서 가장 중요한 요소 중 하나는 기계 코드그리고 어셈블리 언어로. 이 프로그램의 출력물에서 우리는

ASSEMBLY DIRECTIVES라고 불리는 지금, 아마도 가장 편리한 시간그것이 무엇인지에 대한 아이디어를 제공합니다.

다음 지시어를 살펴보겠습니다: ORG, EQU, DEFB, DEFW, DEFM 및 END. 그러나 고려를 시작하기 전에 다음을 확실히 이해해야 합니다.

1. ASSEMBER 지시문은 Z8 0 프로세서의 명령이 아니며 이러한 의미에서 Z8 0 기계 코드와 관련이 없습니다.

2. ASSEMBLER는 사용자가 니모닉 형태로 작성한 텍스트를 기계어인 오브젝트 코드로 번역(번역)해주는 프로그램입니다. 그리고 이러한 ASSEMBER 지시문은 어셈블러 프로그램에 대한 몇 가지 명령입니다. 그것들은 번역되지 않고 목적 코드에 포함되지 않을 것이지만, 그것들은 당신이 쓰기를 더 쉽게 만들어 줄 것이고, 가장 중요한 것은 니모닉으로 쓰여진 프로그램을 읽을 수 있게 해줄 것입니다.

3. 매우 다양한 ASSEMBER 프로그램이 있으며 각각 고유한 지침을 가질 수 있습니다. 지침은 동일할 수 있지만 사용에 대한 요구 사항은 서로 다릅니다. 즉, 사용하는 어셈블러 프로그램(예: EDITAS, GENS 3, GENS 4, ZEUS 등)에 대한 지침에 따라 ASSEMBER 지시문을 사용하는 구체적인 방법을 설정해야 합니다. 그럼에도 불구하고 표준은 없지만 일부 기본 개념은 여전히 ​​구별 될 수 있으며 이에 중점을 둘 것입니다.

3.1. 코멘트.

주석으로 가장 간단한 것부터 시작하겠습니다. 문자 ";" 뒤에 작성됩니다. (세미콜론) .

물론 주석인 모든 것이 ASSEMBLER에 의해 기계 코드로 컴파일되지 않는다는 것을 이해합니다. 이것은 쓸모가 없습니다. 다른 사람이나 자신이 편집했지만 오래 전에 작성한 목록을 더 쉽게 처리할 수 있도록 하는 역할만 합니다.

예를 들어:

10 60001 LD E,A 2 0

보시다시피 라인은

; 레지스터 E 콘텐츠에 로드됨. 배터리 수명. ; 하나씩 줄여보세요.

댓글만 남습니다.

태그.

레이블은 ASSEMBER 니모닉에서 프로그램 작성을 크게 단순화합니다. 점프 작업 JP, JR, DJNZ에서 CALL 서브루틴을 호출하면 점프할 주소를 지정할 수 없지만 대신 레이블로 대체할 수 있습니다. 반면에 이 주소에 대한 명령을 작성할 때 해당 주소도 레이블로 대체하십시오. 예를 들면 다음과 같습니다.

10 60001 시작 LD B.0 4

20 60003 다시 INC HL

40 60005 DJNZ, 다시

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ, 시작

보시다시피 매우 편리합니다. 레지스터 B가 0에 도달하지 않은 경우 라인 40에서 AGAIN 레이블로 반환되는 것을 즉시 확인할 수 있습니다. 270행에서 반환은 BEGIN 레이블로 돌아갑니다.

수행 중인 작업의 의미에 해당하는 레이블 이름을 선택하는 것이 확실히 의미가 있습니다. 이렇게 하면 프로그램 목록을 더 쉽게 읽고 이해할 수 있습니다.

컴파일할 때 어셈블러 프로그램 자체는 프로세서 명령어에서 필요한 오프셋을 계산하고 이를 레이블로 대체합니다. 예를 들어, 40행에서 DJNZ AGAIN 대신 DJNZ FCH가 객체 코드로 들어가며, 이는 동일합니다.

이전 예에서는 레이블을 매우 제한적으로 사용했습니다. 사실 레이블에 대한 참조와 레이블 자체가 동일한 절차에 있었습니다. 하지만 어제 작성하고 컴파일한 다른 프로시저에 있는 레이블을 참조하고 싶지만 ROM 프로시저로 전환해야 하는 동시에 레이블을 사용하려는 경우에는 어떻게 해야 할까요? 이 경우 EQU 지침이 도움이 될 것입니다. 레이블에 숫자 값을 할당합니다. 물론 컴파일하는 동안 이 지시문은 어떤 식으로든 기계 코드로 변환되지 않지만 프로그램 텍스트에 이 레이블에 대한 참조가 있으면 EQU 지시문에서 가져온 값으로 대체됩니다.

예를 들어 CLEAR (1EACH=7 8 52) 및 OUT-LINE (1856H=6230) 과 같이 프로그램에서 ROM 루틴을 반복적으로 호출해야 합니다. 그런 다음 프로그램 시작 부분에 지정합니다.

예를 들어 CLEAR라고 부릅니다.

지령

레이블에 대한 값, n

그리고 OUTL.

분명한

EQU 7 8 52

아웃 엘

EQU 62 3 0

상표

EQU 60016

부르다

이것들

절차 또는

라벨로.

60001

LD HL, (라벨)

60004

LD BC, 0008

60007

LD 드, (04 52)

60010

통화 취소

60013

콜 아웃 엘

60016

곧바로

너 한테 빚지다

경고하다,

관점에서

프로그램

특정 ASSEMBER 지시문이 사용되는 방법에 대한 예와 예에서 실제 의미가 필요한 경우 나중에 실용적인 프로그래밍 기술을 분석할 후속 장에서 얻을 수 있습니다.

이전 예제를 다시 살펴보겠습니다. 30행에서 우리는 LABEL 레이블이 가리키는 주소에 포함된 것을 HL 레지스터 쌍으로 보냅니다. EQU 지침에 따라 주소 60016을 가리킵니다.

따라서 셀 60016 및 60017에는 나중에 프로그램에서 사용할 수 있는 일부 데이터가 포함되어 있습니다. 컴파일하기 전에 이 데이터를 셀에 직접 보낼 수 있습니다. 그리고 이를 위해 기계 코드를 포함할 필요가 전혀 없습니다. DEFB, DEFW 및 DEFM 지시문을 사용하여 메모리 셀에 초기 값을 설정할 수 있습니다.

DEFB - DEFINE BYTE - 바이트를 설정합니다.

DEFW - DEFINE WORD - "단어"를 설정합니다("단어"는 2개의 연속된 바이트입니다. 일반적으로 이것은 주소입니다.) DEFM - DEFINE MESSAGE - 메시지를 설정합니다(여러 연속 바이트). 어셈블리 프로그램은 일반적으로 단일 DEFM 지시문으로 지정할 수 있는 바이트 수에 제한을 둡니다. 예를 들어 5바이트 ​​이하입니다. 그러나 당신은 그것에 대해 걱정할 필요가 없습니다. 긴 메시지를 전달하려면 DEFM 라인을 원하는 만큼 연속으로 입력할 수 있습니다.

따라서 DEFB는 1바이트(0...255)를 지정하고 DEFW는 2개의 연속 바이트(0...65535)를 지정하며 DEFM은 연속 바이트 그룹을 지정합니다. 문자 메세지, 숫자 테이블 등

이전 예에서 주소 60016 및 60017에 2바이트 숫자를 저장하려면 80행을 다음과 같이 작성해야 합니다.

80 60016 DEFW 5C92H

90 60018

주소 60135에서 시작하는 "Spectrum"이라는 단어를 저장한다고 가정합니다.

코드 문자 "S" 코드 문자 "p" "e" "c" "t" "r"

"우" "엠"

60135

60136

60137

60138

60139

60140

60141

60142

53시간 7 0시간 65시간 63시간 7 4시간 72시간 75시간 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

바이트 쌍으로 설정할 수 있습니다.

그러나 메시지로 설정하는 것이 더 쉽고 정확합니다.

60135 DEFM 5370656374 ; "스펙트"

60140 DEFM 72756D ; "럼 주"

ASSEMBLER에서 프로그래밍할 때 프로그램 텍스트도 DEFB 또는 DEFM을 통해 입력해야 하는 특별한 경우가 있습니다. 내장 계산기용 프로그램을 작성하는 경우입니다. 결국 어셈블러 프로그램은 ASSEMBER 니모닉을 기계 코드로 변환할 수 있지만 계산기 코드에 대해 아무것도 모르고 해당 니모닉을 알지 못합니다. 계산기 코드는 내부 "Sinclair" 사건이며 그 해석은

ROM에 있는 프로그램이 사용되며 계산기 코드는 프로세서 및 해당 명령과 관련이 없습니다. 따라서 DEFB 또는 DEFM을 통해서만 독립 바이트 시퀀스로만 어셈블리 프로그램에 계산기 명령을 입력할 수 있습니다.

책의 전반부에서 당신과 나는 add, stk_data s_lt 등과 같은 계산기 명령에 니모닉 표기법을 사용하고 프로세서 명령과 달리 소문자로 썼습니다. 하지만 녹음의 이해와 편의를 위해서만 이전에도 그랬고 앞으로도 계속 할 것입니다. ASSEMBER 프로그램은 이러한 니모닉을 알지 못하며 사전에 없습니다.

따라서 DEFB, DEFW 및 DEFM의 도움으로 프로그램 변수의 초기 값을 설정하고 테이블, 메시지 및 기타 데이터 시퀀스를 프로그램에 입력합니다.

그래픽, 어셈블러 프로그램이 ASSEMBLY 명령으로 이해하지 못하는 코드 시퀀스.

3.5. 지시어 ORG, END.

가장 사소한 두 가지 지침을 고려하는 것이 우리에게 남아 있습니다. ORG 지시문은 프로그램이 어셈블될 주소를 선언합니다. 의 첫 번째 지시문이어야 합니다. 원문, 원칙적으로 그 앞에 주석이있을 수 있습니다.

위의 예에서 왼쪽에 특정 명령이 배치될 주소 열을 작성했다는 사실에 주의를 기울였습니다. 따라서 ASSEMBLE에서 프로그래밍할 때는 필요하지 않습니다. 맨 처음에 지시를 내리는 것으로 충분합니다.

10 ORG 63000

그런 다음 어셈블러 프로그램 자체가 이 명령 또는 해당 명령이 있는 메모리 셀을 계산합니다. 이는 프로그래밍 프로세스를 크게 단순화합니다. 그리고 완성된 텍스트를 변경하면 ASSEMBLER가 자체적으로 모든 주소를 수정합니다.

END 지시문은 프로그램의 끝을 표시합니다. 그 뒤에 다른 것이 있으면 어셈블러는 컴파일 중에 이를 무시합니다.

시작하기 위해 ASM 지시문에 대해 알아야 할 전부일 것입니다. 이것들은 당신이 인생에서 만날 수 있는 모든 지침이 아니며 다른 조립기에 사용하는 규칙은 다르지만 대체로 이 최소값은 정보 요구의 90%를 충족시킬 것이며 나머지는 다음 지침에서 배워야 합니다. 작업 중인 어셈블러.