어셈블리어 및 실습 금 1,2 (314) / 금 3,4 (307) RTDCS. 422. 이 종 태 010-4116-1516 dksakclsk@naver.com
레지스터 CPU 안에 있는 고속 저장 장소 일반 메모리보다 훨씬 빠른 속도로 접근 종류 범용 레지스터 세그먼트 레지스터 플래그 레지스터 명령어 포인터
범용 레지스터 계산과 데이터 전송에 주로 사용 각 레지스터는 32bits 값이나 16bits 값 또는 2개의 8bits 값으로 사용 될 수 있음 구조
범용 레지스터의 크기 8bit 단위까지 세분화 가능한 레지스터 16bit로 세분화 가능한 레지스터
범용 레지스터의 용도 레지스터마다 기본적으로 가지고 있는 용도가 있음. 레지스터명 용도 EAX 곱셈과 나눗셈 연산에 사용 됨 EBX 베이스 주소를 저장 ECX 루프 카운터로 사용 됨 EDX 데이터를 저장 ESI 고속 메모리 전송에 사용 됨(Source Index) EDI 고속 메모리 전송에 사용 됨(Destination Index) EBP 스택의 베이스 포인터 저장 ESP 스택 포인터 저장
그 외 레지스터 세그먼트 레지스터 플래그 레지스터 명령어 포인터(EIP) 미리 할당된 메모리 영역의 시작 주소를 가리킴 CS – Code Segment DS – Data Segment SS – Stack Segment ES – Extra Segment 플래그 레지스터 CPU 동작을 제어하거나 연산 결과를 반영함 1일 때 설정되고, 0일 때 해제 됨 (2진수 비트로 구성) 명령어 포인터(EIP) 다음에 실행할 명령어의 주소를 가짐 새 위치로 분기할 때도 쓰임
정수의 표현 2/8/10/16 진수가 쓰임 각 진수는 문자로 표시가 가능 진수 생략 시 10진수로 간주 표현 형식 진수의 종류 [{+, –}] 숫자 [진수] 진수의 종류 예시 26, 42o, 11010011b, 0A3h … 16진수 h 10진수 d / t 8진수 q / o 2진수 b, y
식별자 프로그래머가 선택한 이름. 식별자는 변수, 상수, 프로시저 또는 코드 레이블 등에 사용된다 1~247개 사이의 문자를 사용할 수 있다 대문자와 소문자를 구분하지 않는다 첫 번째 문자는 알파벳(a~z,A~Z), _ ,@,?,$등을 사용가능 @기호는 어셈블러 기호접두사에 사용되므로 피한다 예시 Ex) VAR1, COUNT, $name, _main, open_file …
디렉티브(directive) 어셈블러가 인식하여 동작하는 소스코드에 포함된 명령(command) 명령어(instruction)는 실행시간에 실행되는 반면 디렉티브는 그렇지 않음 디렉티브는 변수, 매크로, 프로시저를 정의할 수 있음 메모리 세그먼트에 이름을 부여 대소문자 구별하지 않음 ex) .data = .DATA = .Data
디렉티브(directive) 세그먼트 정의 어셈블러 디렉티브의 가장 중요한 기능은 프로그램 섹션,즉 세그먼트(segment)를 정의하는 것 .DATA : 변수를 포함하는 프로그램 영역을 표시 .CODE : 명령어를 포함하는 영역을 표시 .STACK : 스택 크기 결정, 실행 스택이 가진 프로그램 영역 표시
명령어 프로그램이 어셈블되었을 때에 실행가능하게 되는 문장 어셈블러에 의해서 기계어 바이트들로 변환 됨. 실행시간에 CPU에 의해서 적재되어 실행 명령어의 기본 요소 레이블 명령어 니모닉 피연산자 주석 표현 형식 [레이블:] 니모닉 피연산자 [;comment]
레이블(label) 레이블은 명령어 또는 데이터의 위치를 표시하는 식별자이다. 명령어 바로 앞에 있는 레이블은 그 명령어의 주소를 의미한다. 마찬가지로 변수 바로 앞에 있는 레이블은 변수의 주소를 의미한다 데이터 레이블 변수의 위치에 대한 식별자 데이터 레이블은 콜론으로 끝날 수 없음 Ex) count DWORD 100 arrary DWORD 1024, 2048 DWORD 4096, 8192
레이블(label) 코드 레이블 target: mov ax,bx … … jmp target 프로그램의 코드 영역에 있는 레이블 같은 프로시저 내에서 유일해야 함 분기나 루프 명령어의 목적지로 사용 됨 예시 target: mov ax,bx … … jmp target
명령어 니모닉(mnemonic) 명령어를 식별하기 위한 짧은 단어 옵션 사용설명 MOV 한 값을 다른 곳으로 이동함 (MOVE) ADD 두 값을 더함 (ADDITION) SUB 한 값에서 다른 값을 뺌 (SUBSTRACT) MUL 두 값을 곱함 (MULTIPLY) DIV 한 값을 다른 값으로 나눔 (DIVISION) CALL 프로시저를 호출함
피연산자(operand) 명령어는 0~3개의 피연산자를 가질 수 있음 레지스터, 메모리, 상수 등을 피연산자로 가짐 메모리는 변수 이름 또는 변수의 주소를 포함하는 한 개 이상의 레지스터로 지정 된다 피연산자 예시 98 : 상수 2+6 : 상수 수식 eax : 레지스터 count : 메모리
피연산자(operand) 명령어에 따라 갖는 피연산자수가 다름 일반적으로 명령어는 레지스터 내용을 수정 함 STC : 0개 INC eax : 1개 MOV count, ebx : 2개 일반적으로 명령어는 레지스터 내용을 수정 함 두 개의 피연산자를 갖는 명령어의 경우 두 번째 피연산자를 첫 번째 피연산자에 반영 ex) MOV count, ebx - ebx에 있는 값을 count로 복사
주석(comment) 프로그램을 설명하는 역할 작성자, 작성일, 소스에 대한 설명 등의 기록에 쓰임 주석의 표현 한줄 주석 : 세미콜론(;)으로 시작하며 같은줄의 ; 뒤 내용은 무시 블록 주석 : comment 디렉티브와 사용자 정의 기호로 시작되며 같은 사용자 정의기호가 나타날 때 까지 모든 내용 무시 사용 예 COMMENT ! This line is a comment. This line is also a commnet ! ! 대신 다른 문자 올 수 있음(사용자 정의)
어셈블리?어셈블러? 어셈블리 = 언어 / 어셈블러 = compiler 어셈블러에는 다양한 종류가 존재 각각 문법이 다름 MASM(Microsoft Macro Assembler), NASM(Netwide Assembler), FASM(Flat Assembler), GAS(GNU Assembler), YASM 각각 문법이 다름 Assembler마다 지원하는 platform 이 다르고(인텔의 IA-32 Assembly,IA-64 Assembly 등등) syntax형태에도 차이(Intel 방식과 At&T) 가 있기 때문 수업에는 IA-32 기반 MASM (Microsoft Macro Assembler) 을 사용
MASM(Microsoft Macro Assembler) 가장 많이 쓰는 어셈블러 중 하나 64비트까지 지원 Syntax 는 Intel 방식을 따름 Visual Studio 2005 이하 버전에는 무료로 다운 후 설치 Visual Studio 2008 이후 버전에는 MASM v9.0 기본포함
MASM 설치하기 VS2005 이하 버전이라면 홈페이지에서 별도 다운로드 VS2008 이상 버전이라면 설치확인 http://www.masm32.com / http://www.movsd.com VS2008 이상 버전이라면 설치확인 C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\ml.exe VS2008 버전에 MASM 이 있지만 .inc 와 .lib 파일은 포함되어 있지 않는다. (추후 설치) 첨부된 파일을 설치 (Irvine.zip)
Include파일과 lib파일 경로 지정 포함된 [Irvine.zip]파일 압출 풀기 압축 푼 폴더 복사 Ex) C:\Irvine 아래 파일들이 보이면 성공
프로젝트 생성 VS 2008 실행 [파일][새로 만들기] [프로젝트] ※주의 : 이후 모든 설정 및 실험은 Visual Studio 2008을 기준
프로젝트 생성
소스파일 생성 [소스파일]마우스우클릭 [추가]->[새항목]
소스파일 생성 이름에 확장자(.asm)을 꼭 붙일 것 Ex) 파일명.asm
빌드 규칙 지정하기 [프로젝트] [사용자 지정 빌드 규칙] ※ 어느 방법으로 하든 상관없음
빌드 규칙 지정하기 [Microsoft Macro Assembler]체크 [확인]
Project Properties Settings [프로젝트][속성][구성속성][링커][일반][추가 라이브러리 디렉터리]경로 입력
Project Properties Settings [프로젝트][속성][구성속성][링커][입력][추가종속성]
Project Properties Settings [프로젝트][속성][구성속성][링커][디버깅][디버그 정보 생성] 예(/DEBUG) 선택
Project Properties Settings [프로젝트][속성][구성속성][링커][시스템][하위 시스템] 콘솔 선택
Project Properties Settings [프로젝트][속성][구성속성][Microsoft Macro Assembler][general]
Project Properties Settings [프로젝트][속성][구성속성][Microsoft Macro Assembler][Listing File]
실습 코드
실행 화면
과제 앞으로 실습과제를 수행할 컴퓨터에 MASM을 사용하기 위한 설정을 하고 그 화면을 캡쳐해서 이메일로 제출
과제 메일 및 파일 제목 예시 report 형식(문제정의 등) 갖출 필요 없음 제출 [어셈] 금12_201212345_홍길동_과제02 [어셈] 금34_201212345_홍길동_과제02 report 형식(문제정의 등) 갖출 필요 없음 단, 표지는 있어야 함 제출 10 / 4 실습 수업시간 전까지 하루 delay 할 때마다 -1 일주일 지나면 0점