HyeM

[컴퓨터구조]2주차(2)_어셈블리 프로그램 예제 본문

Study/Computer Architecture

[컴퓨터구조]2주차(2)_어셈블리 프로그램 예제

Hailey_HyeM207 2020. 4. 18. 02:32

컴퓨터 프로그래밍 언어

상위,하위 프로그래밍 언어

  • 상위 프로그래밍 언어 _ 컴파일러 or 인터프리터에 의해 기계어로 번역됨 => C, C++
  • 하위 프로그래밍 언어 _ 기계어, 어셈블리어 

어셈블리 언어

기계어를 사람이 사용하는 언어에 가깝게 문자로 기호화 함

cpu에 따라 어셈블리 언어의 형식이 다르다.

 

+ 어셈블러 : 어셈블리 언어를 번역하여 오브젝트 코드를 생성하는 프로그램

 

어셈블리 프로그램 ---------어셈블러------> 기계어 프로그램

 

 

어셈블리 명령어 

어셈블리 명령어

명령어 동작
ADD 덧셈
SUB 뺄셈
MUL 곱셈
DIV 나눗셈
MOV 데이터 이동
LOAD 기억장치로부터 데이터 적재
STOR 기억장치로 데이터 저장

 

어셈블리 명령어 형식 - intel cpu 8086버전

레이블 부 : 연산부    오퍼랜드 부(피연산자)        ;  주석문 부

레이블 부 (Lablel)

 JUMP, LOOP 와 같은 순환/반복 명령에서 CPU실행을 해당 레이블로 이동시킬 때 사용. 

레이블(Label) 생성할 때는 8문자 이내의 영문자/숫자를 사용함. + 이름에 공백 x

 

연산 부 (Operation)

명령어 또는 지시어

 

피연산자 부 (Operand) 

레지스터 이름, 정수, 라벨, 연산자, 주소 등으로 구성


주석문 부 (Comment) 

세미콜론으로 시작함. 주석임

 

 

어셈블리 프로그램 예제 

주소 100번지에는 명령어 LOAD 250을 기계 코드로 바꾼 1250이 들어있다.

여기서 LOAD 250 에서 LOAD는 1로 바뀐 것을 확인 할 수있다.

LOAD -> 1

ADD -> 5

STOR -> 2

JUMP -> 8

 

 

 

 

그러면 이제, 단계 별로 어떻게 진행되는지 알아보자.

(사진에서 참고)

PC : 프로그램 카운터 (다음에 실행할 명령어들의 주소 저장 )  

AC : 누산기(산술과 논리연산의 중간 값을 임시적으로 보관하기 위한 레지스터)   

IR : 명령어 레지스터 (현재 실행중인 명령어 보관)

 

100 LOAD 250  //1250 

101 ADD 251   //5251 

102 STOR 251  // 2251 

103 JUMP 170  //8170

 

 

 

 

 

 

[ 단계 1 ] 

메모리의 100번지에 1250명령어가 CPU의 IR(명령어레지스터)에 FETCH된다.

[ 단계2 ]

IR에 저장된 명령을 실행하므로, 메모리 250번지의 값(0004)를 AC(누산기)로 적재한다. 이때,  PC(프로그램카운터)에는 다음 실행할 명령어의 주소 101이 저장된다.

 

 

100 LOAD 250  //1250 

101 ADD 251   //5251 

102 STOR 251  // 2251 

103 JUMP 170  //8170

 

 

 

 

 

 

 

[ 단계 3 ]

IR에 저장된 명령을 실행한 후인 [단계3]에선, PC의 값을 보고 101번지 명령을 실행해야 됨을 알고, 101번지의 명령어 5251을 IR에 FETCH 한다.

[ 단계 4 ]

더하라는 명령어를 받았기 때문에, AC(누산기)의 값과 251번지의 값(0003)을 ALU로 가져와 덧셈을 수행한다. 수행 결과는 AC(누산기)에 다시 저장된다. 이때, PC(프로그램카운터)에는 다음 실행할 명령어의 주소 102가 저장된다.

 

 

 

100 LOAD 250  //1250 

101 ADD 251   //5251 

102 STOR 251  // 2251 

103 JUMP 170  //8170

 

 

 

 

 

 

 

[  단계5  ]

단계4에서 IR명령어가 다 실행되었으니, PC의 값을 보고 102번지 명령을 IR에 FETCH한다.

[ 단계 6 ] 

현재 IR의 명령은 위에서 수행한 연산결과를 메모리 251번지에 저장하는 것이므로, 누산기인 AC의 값을 251번지에 저장하게 된다. 이때, PC(프로그램카운터)에는 다음 실행할 명령어의 주소 103이 저장된다.

 

 

100 LOAD 250  //1250 

101 ADD 251   //5251 

102 STOR 251  // 2251 

103 JUMP 170  //8170

 

 

 

 

 

 

 

* jump 명령어 : 해당 위치로 점프한다. 

 

[ 단계 7 ]

명령이 끝났으니, CPU는 PC값을 보고  메모리의 103번지의  명령어를 IR에 FETCH한다. 

[ 단계 8 ]

IR에 저장된 명령어는 170번지로 jump 한다는 거니까, 이 이후에는 170 번지의 명령을 실행하게 된다. 

 

 

 

 

 

명령어

명령어 집합

 CPU가 수행할 동작을 정의하는, 2진수 코드로 된 명령어들의 집합 

일반적으로 어셈블리 코드 형태로 표현되고, CPU 사용목적, 특성에 따라 결정된다.

 

++ 명령어 집합 설계시 결정할 것 ++

  1. 연산종류  _ 연산들의 수, 종류, 복잡도

  2. 데이터 형태  _ 연산 수행할 데이터 형태, 데이터 길이(비트수), 수의 표현방식

  3. 명령어 형식 _ 명령어 길이, 오퍼랜드 필드 수와 길이

  4. 주조지정 방식 _ 피연산자의 주소 지정하는 방식

 

 

명령어 형식 

 

연산 코드 :  함수연산 기능, 전달 기능 , 제어기능, 입출력기능 ( 아래 자세히 )

오퍼 랜드 :  연산을 수행하는데 필요한 데이터 혹은 데이터 주소

ex ) 8170 명령어에서 연산코드는 2진수로 바뀌어 1000(8), 오퍼랜드1에는 170을 2진수로 바꾼 10101010이 들어가게된다. 

 

연산 코드

1. 함수 연산 기능  : 산술,논리 연산 수행

2. 전달 기능   : (cpu와 주기억장치)사이 (cpu내 레지스터 간) 의 정보 교환, 적재, 저장기능 수행

3. 제어기능  : 프로그램 수행 흐름 제어, 분기 ,서브루틴 호출 명령어는 프로그램 명령어의 실행 순서 변경

4. 입출력 기능  : cpu와 외부 장치들 간의 데이터 이동 수행

 

 

 

분기 명령어 

명령어의 내용에 따라 혹은 조건 만족시에만, 다음에 실행할 명령어 주소(오퍼랜드)로 이동한다.

ex) if-else문, loop(for, while문), 함수 호출

 

서브루틴 호출 명령어

> 호출 (Call)명령어 : 프로그램카운터 내용을 스택에 저장하고, 서브 루틴의 시작 주소로 분기하는명령어

> 복귀 (RET) 명령어 : CPU가 원래 실행하던 프로그램으로 되돌아가도록 하는 명령어 

 

 

출처 :

디지털논리와 컴퓨터 설계, Harris et al. (조영완 외 번역), 사이텍미디어, 2007, 

컴퓨터 구조와 원리 (비주얼 컴퓨터 아키텍처), 신종홍 저, 한빛미디어, 2011


문제 출제

1.  다음 중 틀린 설명을 고르시오

1. 어셈블리 프로그램을 기계어로 바꿔주는 것을 어셈블러라고 한다.

2. LOAD 어셈블리 명령어는 메모리로부터 데이터를 저장하는 걸 의미한다. 

3. intel 8086버전 기준으로, 명령어는 '레이블 부 : 연산부  오퍼랜드부 ; 주석문' 형태를 갖는다.

4. 어셈블리 명령어 형식에서, 레이블 생성시 8문자 이내 영문자/숫자를 사용하고, 공백 가능하다. 

5. 명령어에서 연산 코드 부분은 4bit이다. 

 

2.  다음 설명에 맞는 용어를 고르시오.

(보기) 레이블부, 연산부, 오퍼랜드 부, 주석문 부

(1) 명령어 또는 지시어 부분   답 : ________

(2)레지스터 이름, 정수, 라벨, 연산자, 주소 등으로 구성되어 있다. 답 : ________ 

 

 

3. 다음 ㄱ,ㄴ,ㄷ 에 알맞는 수를 써 넣으시오.

 

4. 다음 명령어는 무슨 명령어인가?

______명령어는 프로그램카운터 내용을 스택에 저장하고, 서브 루틴의 시작 주소로 분기하는 명령어 이다. 

 

5. 단계 6에서 실행되고 있는 명령어는 무엇인가?

[보기]  stor  , add , sub, mul , jmp

 

답은 밑의 더보기 클릭 

더보기

문제 답

1.  다음 중 틀린 설명을 고르시오

1. 어셈블리 프로그램을 기계어로 바꿔주는 것을 어셈블러라고 한다.

2. LOAD 어셈블리 명령어는 메모리로부터 데이터를 저장하는 걸 의미한다. 

3. intel 8086버전 기준으로, 명령어는 '레이블 부 : 연산부  오퍼랜드부 ; 주석문' 형태를 갖는다.

4. 어셈블리 명령어 형식에서, 레이블 생성시 8문자 이내 영문자/숫자를 사용하고, 공백 가능하다.  // 공백은 불가능 하다.

5. 명령어에서 연산 코드 부분은 4bit이다. 

2.  다음 설명에 맞는 용어를 고르시오.

(보기) 레이블부, 연산부, 오퍼랜드 부, 주석문 부

(1) 명령어 또는 지시어 부분   답 : ____연산부____

(2)레지스터 이름, 정수, 라벨, 연산자, 주소 등으로 구성되어 있다. 답 : ___오퍼랜드부_____ 

 

레이블 부 : 순환 반복 명령어에서 cpu 실행을 해당 레이블로 이동시킬때 사용

주석문 : 주석부분으로 ; 로 시작함

3. 다음 ㄱ,ㄴ,ㄷ 에 알맞는 수를 써 넣으시오.

ㄱ : 103 // 프로그램 카운터는 다음 실행할 명령의 주소를 저장하므로, 103번지를 저장한다.

ㄴ: 251 // 현재 실행중인 명령어가  2251인데, 2는 stor 이므로, 251번지에 저장한다는 의미-> 그러므로  누산기 값을 저장하는 곳의 번지수는 251이다.

ㄷ:  2251 // IR은 현재 실행중인 명령어가 들어가므로, 2251이다.

 

4. 다음 명령어는 무슨 명령어인가?

___호출(CALL)___명령어는 프로그램카운터 내용을 스택에 저장하고, 서브 루틴의 시작 주소로 분기하는 명령어 이다. 

 

5. 단계 6에서 실행되고 있는 명령어는 무엇인가?

[보기]  stor  , add , sub, mul , jmp

누산기에 있던 값을 251번지에 저장하고 있으니, 기억장치로 데이터를 저장하는 stor 명령어이다. 

 

Comments