주의!
여기서 말하는 어셈블리어는 실제 mov나 call이 나오는 것이 아닌 Mano가 작성하는 symbolic program을 말한다.
Machine Language
컴퓨터 언어 기계어에 대해 알아보자
프로그램(Program)
프로그램이란 데이터 처리 임무를 수행하기위한 명령어 또는 지시문이다.
컴퓨터는 프로그램을 해석하는데에 있어서 binary 형태의 기계어만을 읽는다.
그렇기 때문에 사람이 자바, 파이썬 등의 다른 언어로 작성을 했을 때 이것을 binary 코드로 바꿔야지만 기계가 프로그래밍을 실행할 수 있다.
프로그래밍 언어 타입
1. Binary code : 2진 코드로 이루어지는 기계 언어이다.
2. Octal or hexadeciaml code : 2진 코드와 동등하게 번역해준다. (binary 4개 = Octal, binary 8개 = Hex)
3. Symbolic code : assembly language = 저급언어
유저가 문자, 숫자 또는 특수문자를 사용하는데 있어 기호들을 가져왔다. 이 기호 명령어들은 이진코드로 바로 번역해준다.
4. High-level language : 자바, 파이썬 등이 고급언어에 속한다. 주로 사람이 사용하기 편하게 만들어졌다.
어셈블리어(Assembly Language)
어셈블리어 프로그램(Assembly language program)의 각 line은 3가지 field로 구성이 되어있다.
1. label field
label field의 경우 비어있거나 기호 주소(symbolic address)가 들어있다.
2. Instruction field
기계 명령어(machine instruction) 또는 수도명령어(pseudoinstruction)가 들어있다.
(수도명령어( pseudoinstruction) = 가짜 명령어 <- assembler에게 정보를 주기 위한 instruction)
3. comment field
주석을 작성하는 영역으로 비어있거나 주석이 달려있다. 주석을 사용할 때는 "/"를 사용한다.
Instruction field
Instruction filed를 보면 3가지가 온다.
1. Memory-Reference Instruction (MRI)
2. Register-Reference or I/O Instruction (non-MRI)
3. Pseudoinstruction with or without operand
주로 명령어 영역(Instruction filed)을 보면 메모리 참조 명령어(ex ADD, LDA...), 레지스터 참조 명령어(ex CMA, INC...) 또는 I/O 명령어(ex ION, IOF...)등이 온다.
CLA /non-MRI
ADD OPR /direct address MRI
ADD PTR I /indrect address MRI
어셈블리어 예시
☞ 두 수를 빼는 어셈블리 언어로 두 수를 빼는 프로그램을 작성해보자
다음은 어셈블리어로 작성한 것이다.
★위의 코드를 이해는 아래 포스트를 확인하자 ★
☞https://youknow301.tistory.com/123
실제 번역된 프로그램을 확인해 보면 다음과 같이 나온다.
어셈블리어의 2단계 스캔
two-pass assembler의 경우 전체 기호 프로그램(symbolic program)을 두 번 스캔한다.
첫 번째 pass assembler (first pass of assembler)
첫 번째 패스 동안에는 사용자의 정의된 주소 기호를 해당 이진 값과 연관시키는 테이블을 생성한다.
다음은 어셈블리어 첫번째 패스 플로우 차트이다.
먼저 줄에 있는 코드를 확인한 다음 Label이 있는지 확인을 한다.
만약 Label(ex ADD, STA, INC)등이 있다면(Yes) LC(Location Counter)과 함께 주소-기호 테이블에 기호를 저장한다.
그런 다음 LC ← LC+1을 진행한다.
반면에 Label이 없다면(NO) ORG를 확인한다.
있을 경우 그 위치로 가고 없다면 END가 있는지 확인하고 있다면 두 번째 pass를 실행한다.
반면에 없다면 LC ← LC+1을 진행한다.
두 번째 pass assembler (second pass of assembler)
두 번째 pass의 경우 테이블 조회 절차(table lookup procedures)를 통해 번역이 된다.
1. Pseudoinstruction table (ex ORG, END, DEC, HEX)
2. MRI table
3. non-MRI table
4. Address symbol table
=> 모든 symbol은 이들 table 중 하나에 존재해야 한다.
다음은 Flowchart for second pass of assembler이다.
코드 라인을 읽은 다음 Pseudo-instruction인지 확인을 한다.
No일 경우 MRI의 확인한다.
MRI이 yes일 경우 operation code와 비트 2-4를 설정한다.
그다음 기호 주소에 해당하는 이진수에 대해 테이블을 검색하고 5-16을 설정한다.
그다음 I에 따라 첫 번째 비트를 0 또는 1로 설정해야 한다.
마지막으로 모든 바이너리 명령어를 assembly 하고 LC가 지정한 위치에 저장해야 한다.
MRI이 no일 경우 유요한 non-MRI 명령어인지 확인을 한다.
유효하지 않는 명령어이면 error를 출력한다.
반대로 유효한 명령어라면 LC가 지정한 위치에 명령어와 동등한 2진수를 저장한다.
Yes일 경우 ORG를 확인한다.
ORG가 yes 라면 LC를 설정하고 no 라면 END부분으로 간다.
END이 yes 라면 끝 no 라면 피연산자를 이진수로 변환하고 LC가 지정한 위치에 저장한다.
I/O Programming
Program interrupt
프로그램된 I/O 방식에서의 CPU가 I/O 장치의 상태를 항상 체크해야 하므로 성능면에서 상당한 낭비가 생긴다.
이것을 해결하기 위해 I/O 장치가 CPU에게 interrupt를 걸어 I/O를 요청하게 한다(interrupt 방식)
Interrupt 처리순서
1. 프로세서 내용 저장(Save contents of processor registers)
2. 플래그가 설정되어 있는지 확인( Check with flag is set)
3. 플래그가 설정되어있는 장치를 서비스 (Service the device whose eflag is set)
4. 프로세서 레지스터의 내용 복원 (Restore contents of processor registers)
5. 인터럽트 기능 켜기 (Turn the interrupt facility on)
6. 실행 중인 프로그램으로 돌아가기 (Return to the running program)
댓글