MASM 어셈블리어는 '마이크로소프트 매크로 어셈블러(Microsoft Macro Assembler)' 의 약자로 MS Visual Studio 에 포함되어 있다. Assembler의 설치는 아래 문서를 참고하여 설치할 수 있다.

 

 

MS Macro Assembler 설치하기 | Irvine32 라이브러리 | 어셈블리어

마이크로 소프트의 비주얼 스튜디오에는 MASM 어셈블러가 장착되어 있다. 예로부터 어셈블리어는 컴퓨터 대학의 전공 수업에나 들을 수 있는 것이 되버려서, 강의도 거의 없고 개발환경을 설치��

digiconfactory.tistory.com

1. 어셈블리어 (Assembly Language)

 

어셈블리어는 가장 원초적인 프로그래밍 언어이다. 어셈블리어에서는 CPU와 메모리 그리고 입출력 장치 등 컴퓨터의 하드웨어를 직접적으로 조작할 수 있다. 이런 언어를 C언어 등 고수준 언어에 비교하여 저수준 언어라고 한다. 저수준이라고 수준이 낮은 것이 아니라 추상화의 정도가 낮은 언어를 말한다. C언어도 포인터를 사용하여 메모리에 접근하는 등 하드웨어에 상당히 접근이 가능하지만 어셈블리어는 하드웨어 그 자체를 다룰 수 있다. 그러다 보니 호환성은 떨어진다.

 

추상화 계층을 지원하는 C나 자바 등은 하나의 소스코드로 여러 운영체제로 porting 이 가능한 부분이 많은데 어셈블리언어는 하드웨어 의존적이라서 그렇지 않다. 

 

MASM 은 x86 계열 프로세서에 사용할 수 있는 언어이다. x86계열이라 하면 인텔 계열 CPU를 말한다. 286,386 컴퓨터에서 말하는 x86에 해당한다. AMD 도 x86을 확장해서 만들어진 CPU기 때문에 AMD CPU에서도 동작한다. 그러나 아무래도 어떤 변수가 있을지 모르기 때문에 대부분 프로그래머들은 인텔 CPU를 선호하는 편이다.

 

* 물론 AMD를 쓰는 프로그래머도 있다. 리누스 정도 되면 어떤 CPU를 써도 상관없는 듯 하다. 하드웨어를 스스로 컨트롤 할 수 있으니까

 

리누스 토발즈 "인텔 대신 AMD 쓴다"

[디지털투데이 추현우 기자] 리눅스와 깃(Git) 창시자, 리누스 토발즈(Linus Torvalds)가 리눅스 커널 개발용으로 쓰는 PC를 최근 인텔에서 AMD 기반으로 갈아탔다고 언급했다. 리누스 토발즈는 지난 24�

www.digitaltoday.co.kr

*AMD CPU에 관한 질문(stackoverflow)

 

Will an assembly language book for intel x86 processor be compatible with amd processors?

I'm wanting to get an assembly book to learn assembly, and was wandering if i get a book for intel x86 processor will there be any problems assembling the code on an amd processor?

softwareengineering.stackexchange.com

MOV 명령어

MOV  명령어는 말 그대로 데이터를 이동하는 명령어이다. 레지스터와 레지스터간에 이동하거나, 메모리와 레지스터 간에 이동하거나, 상수값을 레지스터나 메모리에 직접 입력할 수 있다.

 

CPU구조상 메모리에서 메모리로 이동하는 것은 불가능하다. 메모리에서 메모리로 이동(복사)하려면 CPU의 레지스터를 거쳐야 한다.

 

레지스터는 CPU의 임시 작업공간으로 볼 수 있다. 레지스터의 종류는 많이 있지만 가장 기본적인 것은 범용 레지스터이다. 비주얼 스튜디오의 디버그 모드에서 아래와 같은 기본 레지스터를 볼 수 있다.

 

범용 레지스터는 값 복사, 연산 등 다용도 목적에 사용이 가능해서 범용(여기 저기 사용할 수 있다는 뜻) 레지스터라고 부른다. 16진수가 8개로 구성된 것은 32비트 레지스터이다.

 

예제 코드로 실행을 해보자.

INCLUDE Irvine32.inc

.data
	var1 dword 10h

.code

main PROC

	mov eax,10000h
	add eax,40000h
	mov var1,eax
	add var1,20000h
	mov ecx,var1

	call DumpRegs
	
exit

main ENDP
end main

맨 위의 INCLUDE는 콘솔 출력을 위한 라이브러리이다. 이 포스팅의 앞에 어셈블리를 설치할 때 라이브러리를 설치해서 사용할 수 있다. (깃허브 자료실)

 

.data : data segment 에 변수를 선언한다. data segment 는 전역변수 공간이다. 프로그램이 끝날 때 까지 메모리에 남아있다.

 

var1 dword 10h; var1은 data segment 에 생성할 변수의 이름이다. dword 는 double word 즉 32비트를 말한다. word는 16비트이다. 10h는 초기화 값이다. 10h 는 십진수 16이다.

 

.code : code segment. 어셈블리어 코드를 작성하는 곳이다. 여기서부터 순차적으로 실행된다.

 

main PROC : 프로시저의 시작 부분이다. main 이 아니라 다른 이름을 정의해도 동작한다.

 

mov eax, 10000h : eax 레지스터에 16진수 10000을 넣는다. 값을 할당한다는 느낌보다 move 즉 이동한다는 개념이다. 16진수 10000h는 10진수로 65536이다. 어셈블리어를 하면서 웬만하면 16진수를 쓰는 것이 처음엔 익숙하지 않아도 나중에 가면 편하다. 어차피 메모리 주소는 16진수로 봐야 한다.

 

add eax,40000h : 현재 10000h 가 입력되어 있는 레지스터에 40000h를 더한다. mov는 전에 있던 값을 무시하고 대입하지만 add는 현재 있는 값에 더한다.

 

mov var1, eax : eax에 있는 값을 var1로 이동한다.

 

add var1, 20000h : 변수 var1에 20000h 값을 더한다. 총 70000h가 될 것이다.

 

mov ecx, var1 : var1 의 값을 ecx 레지스터에 이동한다.

 

call DumpRegs : 레지스터를 콘솔에 출력하는 프로시저이다. irvine32.inc를 include해야 사용할 수 있다. 없어도 비주얼 스튜디오의 디버그를 사용하면 레지스터를 확인할 수 있다.

 

실행창은 위와 같다. EAX 레지스터에 50000h가 들어있고 ECX에 70000h 가 들어있다.

 

mov 명령어는

 

MOV 레지스터,레지스터

MOV 메모리, 레지스터

MOV 레지스터, 메모리

MOV 메모리, 상수값(10h 등)

MOV 레지스터, 상수값(10h 등)

 

이렇게 사용할 수 있다. 여기서 메모리란 변수가 위치한 주소를 의미한다.

 

MOV는 가장 기본적인 명령어라서 어느 프로그램에서나 사용한다.

 

exit : 프로그램을 종료시키는 매크로이다. (irvine32.inc)에 정의되있다.

 

main ENDP : 어셈블리 프로그램의 마지막을 나타낸다.

 

MOV 명령어를 니모닉이라고 한다. CPU 제조사가 제공하는 Instruction set 에서는 숫자로 지정되어 있다. (0과 1을 사용) 그런데 A0~A3 이라는 것은 사람이 이해하기 어렵다. 그래서 MOV라는 니모닉(기억이 쉬운 단어)을 사용한다. MOV 명령어도 목적지에 따라 코드가 다양하다. 어셈블리 컴파일러가 문맥에 따라 알아서 판단한다. 메모리에서 레지스터로 가는 건지 반대인지.

 

 

 

x86 명령어 세트

 

x86 instruction listings - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search List of x86 microprocessor instructions The x86 instruction set refers to the set of instructions that x86-compatible microprocessors support. The instructions are usually part of an e

en.wikipedia.org

어셈블리어는 대소문자 구분을 안하니까 mov나 MOV나 똑같이 동작한다는 점도 주의하자.

 

mov 는 가장 기본이 되는 문법이다. 숙련시켜서  잘 사용하도록 하자.

공유하기

facebook twitter kakaoTalk kakaostory naver band