[Pep/8] 기계어, 어셈블리어 프로그래밍 기초
IT/Computer Science

[Pep/8] 기계어, 어셈블리어 프로그래밍 기초

728x90
반응형

기계어로 "Hi" 출력하기

1. 기계어 코드 작성

아래와 같이 Hi를 출력하는 코드를 작성한다

 

Hex code

Binary Code

Explain

51 00 07

01010001 00000000 00000111

7번지, 8번지의 값을 출력
- opcode : 01010
(char output)
- addrmode : 001 (direct mode)

51 00 08

01010001 00000000 00001000

00

00000000

Stop

48 69

01001000 01101001

7번지, 8번지에 'H', 'i'를 ASCII Code(72, 105) 값으로 입력

 

2. Load

메모리에 code를 load 한다 (Ctrl+Shift+L)

 

0번지 ~ 8번지에 데이터가 정확히 들어간 것을 확인할 수 있다.

 

3. Debug

명령어를 한줄씩 디버깅해보자.

 

1) 시작

PC가 0이므로 0번지에 있는 Instruction을 수행할 준비를 한다.

 

2) 51 00 07

7번지에 있는 '72' 값을 문자로 출력

- Instruction Specifier : Direct 모드로 문자 출력 (문자로 출력하기 때문에 피연산자 '72'가 ASCII Code 'H'로 출력)
- Operand Specifier : Address mode가 Direct 모드임으로 메모리의 data를 주소 값으로 인지

- (Operand) : 7번지에 있는 data '72'를 가져옴

Program Counter는 3으로 다음 Instruction을 수행할 준비를 한다.

 

3) 51 00 08

8번지에 있는 '105' 값을 문자로 출력

(ASCII Code : 'i')

 

4) 00

STOP 명령어를 만나 프로세스 종료

'00'이 없다면 7, 8번지에 있는 data를 Instruction으로 인지하여 수행하게 된다.

 

어셈블리어로 "Hi" 출력하기

어셈블리어 코드 작성

위에서 작성한 기계어와 동일한 기능을 하는 어셈블리어 코드를 작성해보자

Code

Explain

CHARO  0x0007,d

7번지, 8번지의 값을 문자로 출력 (direct mode)

CHARO  0x0008,d

STOP

Stop

.ASCII  "Hi"

7번지, 8번지에 'H', 'i'를 ASCII Code(72, 105) 값으로 입력

.END

종료

.ASCII와 .END는 Pseudo Instruction이며 어셈블러가 해당 Instruction은 어셈블 하지 않고 정해진 규칙대로 수행한다.

 

아래와 같이 실행 결과를 보면 어셈블리어 코드를 위에서 작성한 기계어와 똑같이 번역한 것을 알 수 있다.

 

변수 선언

우리가 지금까지 코딩한 방법에는 한 가지 문제점이 있다.

코드에서 data가 들어있는 메모리의 주소 번지를 일일이 직접 참조하고 있다.

 

어셈블리어에서는 변수 개념을 도입하여 이를 해결할 수 있다.

BR       0x0007        ;7번지부터 수행
.BLOCK 2               ;2Byte 크기의 공간 생성
.BLOCK 2               ;2Byte 크기의 공간 생성
CHARI    0x0003,d
CHARI    0x0005,d
CHARO    0x0003,d
CHARO    0x0005,d
STOP
.END

BR이라는 Branch Instruction을 이용하여 7번지의 Instruction부터 수행되도록 한다.

.BLOCK 2를 사용하여 "H"와 "i" 데이터가 담길 2Byte의 공간을 만든다.

(Pep/8 가상머신에서 default data size가 2Byte이기 때문)

CHARI 명령으로 3번지와 5번지 공간에 문자를 입력받고, CHARO 명령으로 해당 데이터를 다시 출력한다.

 

BR과 .BLOCK을 활용하는 예를 보여주기 위한 코드이며, 3번지와 5번지를 직접 입력하였지만 Symbol을 사용하여 변수명을 지정할 수 있다.

728x90
반응형