임베디드 시스템-어셈블리 언어
어셈블리 언어는 다음을 제공하기 위해 개발되었습니다. mnemonics또는 기계 레벨 코드 명령에 대한 기호. 어셈블리 언어 프로그램은 니모닉으로 구성되어 있으므로 기계 코드로 변환해야합니다. 이 변환을 담당하는 프로그램은assembler. 어셈블리 언어는 CPU의 내부 구조와 직접적으로 작동하기 때문에 종종 저수준 언어로 불립니다. 어셈블리 언어로 프로그래밍하려면 프로그래머는 CPU의 모든 레지스터를 알아야합니다.
C, C ++, Java 및 기타 다양한 언어와 같은 다른 프로그래밍 언어는 CPU의 내부 세부 사항을 처리하지 않기 때문에 고급 언어라고합니다. 반대로 어셈블러는 어셈블리 언어 프로그램을 기계어 코드로 변환하는 데 사용됩니다 (때로는object code 또는 opcode). 마찬가지로 컴파일러는 고급 언어를 기계어 코드로 변환합니다. 예를 들어, C 언어로 프로그램을 작성하려면 C 컴파일러를 사용하여 프로그램을 기계어로 번역해야합니다.
어셈블리 언어의 구조
어셈블리 언어 프로그램은 ADD 및 MOV와 같은 어셈블리 언어 명령어이거나 호출 된 문인 일련의 문입니다. directives.
안 instruction CPU에 무엇을해야하는지 알려주고 directive (또는 pseudo-instructions)는 어셈블러에 지침을 제공합니다. 예를 들어 ADD 및 MOV 명령어는 CPU가 실행하는 명령이고 ORG 및 END는 어셈블러 지시문입니다. 어셈블러는 ORG 지시문이 사용될 때 메모리 위치 0에 opcode를 배치하고 END는 소스 코드의 끝을 나타냅니다. 프로그램 언어 명령어는 다음 네 개의 필드로 구성됩니다.
[ label: ] mnemonics [ operands ] [;comment ]
대괄호 ([])는 필드가 선택 사항임을 나타냅니다.
그만큼 label field프로그램이 이름으로 코드 줄을 참조 할 수 있습니다. 레이블 필드는 특정 문자 수를 초과 할 수 없습니다.
그만큼 mnemonics 과 operands fields함께 프로그램의 실제 작업을 수행하고 작업을 수행합니다. ADD A, C & MOV C, # 68과 같은 문 여기서 ADD 및 MOV는 opcode를 생성하는 니모닉입니다. "A, C"및 "C, # 68"은 피연산자입니다. 이 두 필드에는 지시문이 포함될 수 있습니다. 지시문은 기계어 코드를 생성하지 않고 어셈블러에서만 사용되는 반면 명령은 CPU가 실행할 기계어 코드로 변환됩니다.
1.0000 ORG 0H ;start (origin) at location 0
2 0000 7D25 MOV R5,#25H ;load 25H into R5
3.0002 7F34 MOV R7,#34H ;load 34H into R7
4.0004 7400 MOV A,#0 ;load 0 into A
5.0006 2D ADD A,R5 ;add contents of R5 to A
6.0007 2F ADD A,R7 ;add contents of R7 to A
7.0008 2412 ADD A,#12H ;add to A value 12 H
8.000A 80FE HERE: SJMP HERE ;stay in this loop
9.000C END ;end of asm source file
그만큼 comment field 주석 표시기 인 세미콜론으로 시작합니다.
프로그램에서 "HERE"레이블을 확인하십시오. 명령을 참조하는 모든 레이블 뒤에는 콜론이 와야합니다.
8051 프로그램 조립 및 실행
여기서 우리는 어셈블리 언어의 기본 형태에 대해 논의 할 것입니다. 어셈블리 언어 프로그램을 만들고, 조립하고, 실행하는 단계는 다음과 같습니다.
먼저 편집기를 사용하여 위 프로그램과 유사한 프로그램을 입력합니다. 모든 Microsoft 운영 체제와 함께 제공되는 MS-DOS EDIT 프로그램과 같은 편집기를 사용하여 프로그램을 만들거나 편집 할 수 있습니다. 편집기는 ASCII 파일을 생성 할 수 있어야합니다. 소스 파일의 "asm"확장자는 다음 단계에서 어셈블러에서 사용됩니다.
"asm"소스 파일에는 1 단계에서 만든 프로그램 코드가 포함되어 있습니다.이 코드는 8051 어셈블러에 공급됩니다. 그런 다음 어셈블러는 어셈블리 언어 명령어를 기계어 코드 명령어로 변환하고.obj file (개체 파일) 및 .lst file(목록 파일). 그것은 또한source file그래서 일부 어셈블러에서는이 파일에 "src"확장자가 있어야합니다. "lst"파일은 선택 사항입니다. 어셈블러가 감지 한 오류뿐만 아니라 모든 opcode와 주소를 나열하기 때문에 프로그램에 매우 유용합니다.
어셈블러에는 다음과 같은 세 번째 단계가 필요합니다. linking. 링크 프로그램은 하나 이상의 오브젝트 파일을 가져 와서 "abs"확장자를 가진 절대 오브젝트 파일을 생성합니다.
다음으로 "abs"파일은 "OH"(object to hex converter)라는 프로그램에 공급되어 ROM에 구울 준비가 된 "hex"확장자를 가진 파일을 만듭니다.
데이터 형식
8051 마이크로 컨트롤러에는 8 비트의 단일 데이터 유형이 포함되어 있으며 각 레지스터도 8 비트 크기입니다. 프로그래머는 CPU에서 처리 할 수 있도록 8 비트 (00 ~ FFH 또는 10 진수 255)보다 큰 데이터를 분해해야합니다.
DB (바이트 정의)
DB 지시문은 어셈블러에서 가장 널리 사용되는 데이터 지시문입니다. 8 비트 데이터를 정의하는 데 사용됩니다. 10 진수, 2 진, 16 진 또는 ASCII 형식 데이터를 정의하는데도 사용할 수 있습니다. 10 진수의 경우 10 진수 뒤의 "D"는 선택 사항이지만 "B"(이진) 및 "Hl"(16 진수)에는 필수입니다.
ASCII를 나타내려면 문자를 따옴표로 묶으십시오 ( 'like this'). 어셈블러는 숫자 / 문자에 대한 ASCII 코드를 자동으로 생성합니다. DB 지시문은 두 문자보다 큰 ASCII 문자열을 정의하는 데 사용할 수있는 유일한 지시문입니다. 따라서 모든 ASCII 데이터 정의에 사용해야합니다. DB의 몇 가지 예가 아래에 나와 있습니다.
ORG 500H
DATA1: DB 28 ;DECIMAL (1C in hex)
DATA2: DB 00110101B ;BINARY (35 in hex)
DATA3: DB 39H ;HEX
ORG 510H
DATA4: DB "2591" ;ASCII NUMBERS
ORG 520H
DATA6: DA "MY NAME IS Michael" ;ASCII CHARACTERS
ASCII 문자열 주위에 작은 따옴표 또는 큰 따옴표를 사용할 수 있습니다. DB는 또한 바이트 크기의 청크로 메모리를 할당하는 데 사용됩니다.
어셈블러 지시어
8051의 일부 지침은 다음과 같습니다.
ORG (origin)− origin 지시문은 주소의 시작을 나타내는 데 사용됩니다. 16 진수 또는 10 진수 형식의 숫자를 사용합니다. 숫자 뒤에 H가 제공되면 숫자는 16 진수로 처리되고 그렇지 않으면 10 진수로 처리됩니다. 어셈블러는 십진수를 헥사로 변환합니다.
EQU (equate)− 메모리 위치를 차지하지 않고 상수를 정의하는 데 사용됩니다. EQU는 레이블이 프로그램에 나타나도록 상수 값을 데이터 레이블과 연결하고 해당 상수 값이 레이블을 대체합니다. "MOV R3, #COUNT"명령을 실행하는 동안 레지스터 R3은 값 25로로드됩니다 (# 기호에 유의). EQU 사용의 장점은 프로그래머가 한 번 변경할 수 있고 어셈블러가 모든 발생을 변경할 수 있다는 것입니다. 프로그래머는 전체 프로그램을 검색 할 필요가 없습니다.
END directive− 소스 (asm) 파일의 끝을 나타냅니다. END 지시문은 프로그램의 마지막 줄입니다. END 지시문 이후의 모든 것은 어셈블러에서 무시됩니다.
어셈블리 언어의 레이블
어셈블리 언어의 모든 라벨은 아래에 주어진 규칙을 따라야합니다.
각 레이블 이름은 고유해야합니다. 어셈블리 언어 프로그래밍에서 레이블에 사용되는 이름은 대문자와 소문자, 숫자 0에서 9까지의 알파벳 문자와 @, 밑줄 (_) 비율의 물음표 (?), 마침표 (.)와 같은 특수 문자로 구성됩니다. 및 달러 ($).
첫 번째 문자는 알파벳 문자 여야합니다. 숫자 일 수 없습니다.
예약어는 프로그램에서 라벨로 사용할 수 없습니다. 예를 들어 ADD 및 MOV 단어는 명령어 니모닉이므로 예약어입니다.