'프로그래밍/Assembly'에 해당되는 글 9건
- 2007/06/04 어셈블리 예제 연습 ex 7.20
- 2007/05/28 어셈블리 예제 연습 ex 8.21
- 2007/05/05 어셈블리 기본 요약
- 2007/05/04 어셈블리 간단 예제(2)
- 2007/05/01 EditPlus Assembly 설정 (MASM)(5)
- 2007/04/21 레지스터(Register)
- 2007/04/20 Intel 8086/8088
- 2007/04/19 IA-32 프로세스 변천(2)
- 2007/04/19 Intel 8086 어셈블리 명령어 & 지시어
.MODEL SMALL .386 DATA SEGMENT TBUFF DD ? DATA ENDS CODE SEGMENT INCLUDE SGIO.INC ASSUME CS:CODE, DS:DATA START: MOV AX,DATA MOV DS,AX MOV ECX,100 MOV EAX,0 KIM: ADD EAX,ECX LOOP KIM MOV TBUFF,EAX MOV EDX,TBUFF CALL DEC32OUT MOV AH,4CH INT 21H CODE ENDS END START
.MODEL SMALL .386 DATA SEGMENT TBUFF DT ? FIVE DW 5 SCORE DW 60,73,87,80 DW 70,87,95,76 DW 85,90,88,84 DW 92,85,95,75 DW 84,64,89,70 AVE DW 5 DUP(0) DATA ENDS CODE SEGMENT INCLUDE SGIO.INC ASSUME CS:CODE,DS:DATA START: MOV AX,DATA MOV DS,AX MOV SI,0 REPE1: MOV CX,5 MOV BX,0 MOV AX,0 FOR1: ADD AX,SCORE[BX+SI] ADD BX,8 LOOP FOR1 MOV DX,0 IDIV FIVE MOV AVE[SI],AX ADD SI,2 CMP SI,8 JNE REPE1 MOV CX,4 MOV SI,0 LEA BX, AVE REPE2: MOV AX,[BX+SI] ADD SI,2 MOV DX,AX CALL DEC16OUT CALL CRLF SUB CX,1 CMP CX,0 JG REPE2 MOV AH,4CH INT 21H CODE ENDS END START
CRLF PROC NEAR PUSH DX PUSH AX MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H POP AX POP DX RET CRLF ENDP DEC16IN PROC FAR PUSH CX MOV DX,0 MOV CH,0 CALL STDIN CMP AL,'-' JZ DEC16IN1 CMP AL,'+' JZ DEC16IN2 JMP DEC16IN3 DEC16IN1: MOV CH,-1 DEC16IN2: CALL STDIN DEC16IN3: SUB AL,30H JL DEC16IN4 CMP AL,9 JG DEC16IN4 CBW PUSH CX PUSH AX MOV AX,DX MOV CX,10 MUL CX MOV DX,AX POP AX ADD DX,AX POP CX JMP DEC16IN2 DEC16IN4: CMP CH,0 JE DEC16IN5 NEG DX DEC16IN5: POP CX RET DEC16IN ENDP DEC32IN PROC NEAR PUSH ECX MOV EDX,0 MOV CH,0 CALL STDIN CMP AL,'-' JZ DEC16IN31 CMP AL,'+' JZ DEC16IN32 JMP DEC16IN33 DEC16IN31: MOV CH,01 DEC16IN32: CALL STDIN DEC16IN33: SUB AL,30H JL DEC16IN34 CMP AL,9 JG DEC16IN34 CBW CWDE PUSH CX PUSH EAX MOV EAX,EDX MOV ECX,10 MUL ECX MOV EDX,EAX POP EAX ADD EDX,EAX POP CX JMP DEC16IN32 DEC16IN34: CMP CH,0 JE DEC16IN35 NEG EDX DEC16IN35: POP ECX RET DEC32IN ENDP STDOUT PROC NEAR PUSH DX MOV DL,AL MOV AH,2 INT 21H POP DX RET STDOUT ENDP DEC16OUT PROC NEAR CMP DX,01 JG KANG PUSH DX MOV DL,'-' MOV AH,2 INT 21H POP DX NEG DX KANG: PUSHA MOV CX,0 LEA DI,TBUFF DEC16OUT1: PUSH CX MOV AX,DX MOV DX,0 MOV CX,10 DIV CX XCHG AX,DX ADD AL,30H MOV [DI],AL INC DI POP CX INC CX CMP DX,0 JNZ DEC16OUT1 DEC16OUT2: DEC DI MOV AL,[DI] CALL STDOUT LOOP DEC16OUT2 POPA RET DEC16OUT ENDP DEC32OUT PROC NEAR CMP EDX,-1 JG KA PUSH EDX MOV DL,'-' MOV AH,2 INT 21H POP EDX NEG EDX KA: PUSHAD MOV ECX,0 LEA DI,TBUFF DEC32OUT1: PUSH ECX MOV EAX,EDX CDQ MOV ECX,10 IDIV ECX XCHG EAX,EDX ADD AL,30H MOV [DI],AL INC DI POP ECX INC ECX CMP EDX,0 JNZ DEC32OUT1 DEC32OUT2: DEC DI MOV AL,[DI] CALL STDOUT LOOP DEC32OUT2 POPAD RET DEC32OUT ENDP STDIN PROC NEAR MOV AH,1 INT 21H RET STDIN ENDP
레지스터
EU : Execution Unit
;---------;
; AH ; AL ; AX
;---------; BIU : Bus Interface Unit
; BH ; BL ; BX ;----------;
;---------; ; CS ;
; CH ; CL ; CX ;----------;
;---------; ; DS ;
; DH : DL ; DX ;----------;
;---------; ; SS ;
; SP ; ;----------;
;---------; ; ES ;
; BP ; ;----------;
;---------;
; SI ;
;---------;
; DI ;
;---------;
;---------;
; IP ;
;---------;
Flag Register
;-----------------------------------------------;
; ; ; ; ;OF;DF;IF;TF;SF;ZF; ;AF; ;PF; ;CF;
;-----------------------------------------------;
데이터 레지스터(Data Registers)
AX : 누산기 (산술연산, 포트로부터의 I/O) I/O --> (Input, Output)의 약칭
BX : 베이스 (데이타 구조의 시작 주소)
CX : 카운트 (카운트, 비트 쉬프트 카운트)
DX : 데이타 (산술연산, I/O주소)
AX = 16bit (2byte)
;------------------------------------------;
; AH = 8bit (1byte) ; AL = 8bit (1byte) ;
;------------------------------------------;
SP, BP, SI, DI, 세그먼트 레지스터(CS, DS, SS, ES), IP
-------------------------------------------------------;
; SP : Stack Pointer : 스텍의 현재 탑(Top)의 오프셋 ;
; BP : Base Pointer : 스텍으로의 프레임 포인터 ;
; SI : Source Index : 스트링 명령어 ;
; DI : Destination Index : 스트링 명령어 ;
;-------------------------------------------------------;
;------------------------;
; CS : Code Segment ;
; DS : Data Segment ;
; SS : Stack Segment ;
; ES : Extra Segment ;
;------------------------;
;--------------------------;
; IP : Instruction Pointer ;
;--------------------------;
플래그 레지스터 (Flag Register)
;---------------------------;
; OF : Overflow Flag ;
; DF : Direction Flag ;
; IF : Interrupt Flag ;
; TF : Trap Flag ;
; SF : Sign Flag ;
; ZF : Zero Flag ;
; AF : Auxiliary Carry Flag ;
; PF : Parity Flag ;
; CF : Carry Flag ;
;---------------------------;
1. 문자 'A'를 출력하는 예제
CODE SEGMENT ASSUME CS:CODE MOV AH, 02 MOV DL, 41H ; ASCII CODE 'A' INT 21H MOV AH, 4CH ; QUIT OR EXIT INT 21H CODE ENDS END
2. XLAT 명령어를 이용하여 화면에 AD라는 결과를 출력하는 예제
.MODEL SMALL KIM SEGMENT ASSUME CS:KIM, DS:KIM START: MOV AX, KIM MOV DS, AX MOV DL, 'A' MOV AH, 02 INT 21H MOV AL,2 LEA BX, HOON XLAT HOON MOV DL, AL MOV AH, 02 INT 21H MOV AH, 4CH INT 21H HOON DB 'B', 'C', 'D', 'E' KIM ENDS END START 3. 'test'라는 문자열을 출력하는 예제
.MODEL SMALL .DATA STRING1 DB 'test','$' .CODE MOV AX, @DATA MOV DS, AX MOV DX, OFFSET STRING1 MOV AH, 9 INT 21H MOV AH, 4CH INT 21H END
명령 : C:\masm32\bin\ml.exe /c /coff /Zi
인수 : $(FileName)
디렉토리 : $(FileDir)
출력 내용 캡쳐 : 체크
2. Link (Console)
명령 : C:\masm32\bin\link.exe /SUBSYSTEM:CONSOLE /DEBUG
인수 : $(FileNameNoExt).obj
디렉토리 : $(FileDir)
출력 내용 캡쳐 : 체크
3. Link (Windows)
명령 : C:\masm32\bin\link.exe /SUBSYSTEM:WINDOWS /DEBUG
인수 : $(FileNameNoExt).obj
디렉토리 : $(FileDir)
출력 내용 캡쳐 : 체크
4. Debug
명령: C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\MSDEV.EXE
인수 : $(FileNameNoExt).exe
디렉토리 : $(FileDir)
5. Execute
명령 : $(FileNameNoExt).exe
디렉토리 : $(FileDir)
* EditPlus Stx File (구문강조)
http://www.editplus.com/dn.cgi?asm2.rar
(2006-02-03) Win32 ASM stx - kylin
* MASM 16bit/32bit Version
1. MASM32 v9r (m32v9r.zip) 설치
2. EditPlus 사용자 도구 설정
3. EditPlus 구문강조 설정
Assembly (MASM)
1. Macro Assembler Version 5.10 (masm_912.zip) 설치
exe2bin.exe
LINK.EXE
make.exe
MASM.EXE
2. 예제파일 example1.asm 작성 (문자 'A'를 출력)
ASSUME CS:CODE
MOV DL, 41H ; ASCII CODE 'A'
INT 21H
INT 21H
END
3. 어셈블리 과정
ex) c:\masm> example1.asm
4. 링크 과정
ex) c:\masm> link example1.obj
5. 실행
ex) c:\masm> example1.exe
-
-
맹이
2007/05/09 23:10
일땜에 어셈블리를 시작했는데요. masm32를 받아 설치를 했는데 컴파일이 이상해서 고생많이 하던중에 이 글을 보고 masm를 설치했드니 컴파일이 이상없이 잘 되더군요. 좋은 글 참 고마웠습니다.
그런데 masm32에서 컴파일은 되는데 링크가 안되는건 어떤 문제일까요? masm32에는 라이버리가 많아서 편할것 같은데 링크가 안되서 안타깝습니다.-
신선
2007/05/11 17:09
저도 이제 막 학과수업으로 기초를 배우는 중이라 잘 모르지만...
MASM32 v9r (m32v9r.zip) 설치후 예제를 테스트 해봤었는데
잘 되는걸 확인했는데... 아래쪽 5.10 버젼에서의 예제는 MASM32
에서는 잘 안되어서 교수님께 물어봤더니 MASM32에서는 지시어같은걸
정확하게 잘 써줘야 된다고 하시더군요. 설정부분에 문제가 없다면
테스트 해본 예제 코딩에 문제가 있지 않을까 생각됩니다.
아~ 고달픈 어셈이여..;
-
레지스터란, CPU의 내부의 기억 장소로, 자료를 바이트 단위 또는 워드 단위로 수락합니다. 어찌 보면, RAM과 비슷하다고도 볼 수 있는데, 레지스터는 메모리와는 다른 몇 가지 기능들을 갖고 있습니다.
범용 레지스터
| 32Bit | 16Bit | 상위8Bit | 하위8Bit | 기능 |
| EAX | AX | AH | AL | 누산기(Accumulator, 중간 결과를 저장해 놓음)레지스터라 불리며, 곱셈이나 나눗셈 연산에 중요하게 사용 |
| EBX | BX | BH | BL | 베이스 레지스터라 불리며 메모리 주소 지정시에 사용됩니다. |
| ECX | CX | CH | CL | 계수기(Counter)레지스터라 불리며, Loop등의 반복 명령에 사용됩니다. |
| EDX | DX | DH | DL | 데이터(Data)레지스터라 불리며 곱셈, 나눗셈에서 EAX와 함께 쓰이며 부호 확장 명령 등에 사용됩니다. |
| ESI | SI | 다량의 메모리를 옮기거나 비교할 때 그 소스(Source)의 주소를 가진다. | ||
| EDI | DI | 다량의 메모리를 옮기거나 비교할 때 그 목적지의 주소를 가리킨다. | ||
| ESP | SP | 스택 포인터로 스택의 최종점을 저장한다. Push, Pop 명령에 의해 늘었다 줄었다 한다. | ||
| EBP | BP | ESP를 대신해 스택에 저장된 함수의 파라미터나 지역 변수의 주소를 가리키는 용도로 사용된다. |
범용 레지스터(General purpose register)
데이터들의 연산 및 전송, 번지 지정을 위한 포인터(pointer) 및 인덱스(index) 용도로 사용된다.
1. AX(Accumulator) : 누산기라고도 불리는 이 레지스터의 역할은 데이터 전송 및 연산 후의 결과 값을 잠시 저장한다. AX레지스터를 사용하면 다른 레지서트를 사용한 경우보다 명령어의 바이트 수가 짧게 되거나 실행 시간이 짧게되는 점이 있다. 또한 곱셈이나 나눗셈 등과 같은 연산에서는 반드시 AX나 AL레지스터를 사용해야 하는 경우도 있다.
2. BX(Base Register) : 메모리에 저장되어 있는 데이터의 주소를 저장한다든지, 전송 및 연산에 사용된다.
3. CX(Count Register) : 반복문이나 문자 스트링 등과 같은 명령어를 수행할 때 반복 횟수 등을 저장하는 카운터로 사용되기도 하고 또한 전송 및 연산에 사용된다.
4. DX(Data Register) : AX 레지스터와 함께 곱셈이나 나눗셈 등 일부 명령에서는 필수적으로 사용되기도 하고 또한 기타 연산 및 전송에 사용된다.
포인터와 인덱스 레지스터
포인터(SP와 BP)와 인덱스 레지스터(SI와 DI)들은 비록 범용 레지스터 범주에 속하지만 이들은 아래와 같이 주로 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터로 사용된다.
1. SP(Stack Pointer) : 스택 내에서 가장 최근에 저장된 데이터의 주소(TOP)을 가리킨다.
2. BP(Base Pointer) : SP 대신 스택 내에서 데이터를 액세스 할 때 사용한다. 뿐만 아니라 다른 영역의 데이터를 간접적으로 지정하거나 전송 및 연산에도 사용 가능하다. 그리고 스택 상에서 프로시저를 처리할 때 SP 대신 BP를 이용하여 프로시저 인수들을 액세스하여 처리하면 보다 효과적으로 프로시저를 관리할 수 있다.
3. SI(Source Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 메모리로부터 데이터를 전송하기 위한 출발지 주소 지정에 사용된다. 이때 DS 세그먼트를 참조하여 20비트의 물리 주소를 생성한다(DI : SI). 그리고 일반적인 전송이나 연산에도 사용된다.
4. DI(Destination Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 레지스터나 메모리로부터 메모리로 데이터를 전송하거나 비교할 때 목적지 주소를 지정할 때 사용한다. 이때 세그먼트 레지스터 ES를 참조하여 20비트의 물리 주소를 생성한다(ES : DI). 그리고 이 레지스터는 일반적인 연산에도 사용된다.
상태 레지스터
| 32Bit | 16Bit | 기능 |
| EIP | IP | EIP는 현재 실행되고 있는 프로그램의 실행코드가 저장된 메모리의 주소를 가리키는 레지스터로 프로그램의 실행이 진행됨에 따라 자동으로 증가하고 프로그램의 실행 순서가 변경되는 제어 문이 실행될 때 자동으로 변경된다. 그래서 직접 접근해서 값을 저장하거나 읽거나 하는 일이 없기 때문에 응용 프로그램에서는 손 댈 일이 없는 레지스터이다. |
| EFLAGS | FLAGS | 비트 단위의 플래그 들을 저장하는 레지스터로 아주 특별한 용도로 사용된다. |
명령어 레지스터 : IP(Instruction Pointer)
IP 레지스터는 다음에 실행할 명령어가 저장되어 있는 주소를 가지고 있는 레지스터로 명령어를 실행할 때마다 프로세서는 IP값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 가지고 있다.
IP는 사용자가 값을 변경할 수 없다.
플래그 레지스터(Flag Register)
CF(Carry Flag 비트 0) : 덧셈의 결과 높은 자리로 자리 올림수(carry)가 발생했다든지 혹은 뺄셈 후 빌림수(borrow)가 발생한 경우에 1로 세트된다. 또한 이 플래그는 부호 없는 정수연산에서의 오버플로(overflow) 상태를 나타내기도 하고, 다배정도 연산에 있어서도 사용된다.
PF(Parity Flag 비트 2) : 결과의 최하위 바이트에 값 1의 비트가 짝수 개 포함되어 있는 경우에 1이 되고 홀수 개 경우에는 0으로 된다.
AF(Auxilary carry Flag 비트 4) : 산술연산에 있어서 결과 비트 3에 캐리 혹은 빌림 수가 발생한 경우 1이 되고, 발생하지 않으면 0으로 된다. 이 플래그는 BCD 연산에서 보정용으로 사용된다.
ZF(Zero Flag 비트 6) : 연산의 결과 값이 0이 되었을 때 1로 세트된다.
SF(Sign Flag 비트 7) : 부호 있는 정수의 부호 비트가 0이면 양수, 1이면 음수로 된다.
OF(Overflow Flag 비트 11) : 연산을 부호가 있는 숫자로 했을 때, 오버플로 혹은 언더플로우(underflow)가 발생한 경우에 1로 세트된다.
제어 플래그 레지스터
DF(Direction Flag 비트 10) : 이 비트는 문자열 처리 방향을 정하는 방향 플래그이다. 문자열을 증가하는 레지스터는 DF가 0이면 선증가, DF가 1이면 선감소로 지정된다. 이 플래그는 STD(D = 1), CLD(D = 0) 명령으로 제어할 수 있다.
IF(Interrupt enable Flag) : 외부 인터럽트 발생의 허용을 제어하는 인터럽트 허용 플로그이다. IF가 1이면 외부 인터럽트가 허용되고, 0이면 금지된다. 이 플래그는 프로세서 내부에서 발생하는 인터럽트에 대해서는 영향이 전혀 없다.
TF(Trap enable Flag) : 이 플래그가 1로 세트되면 프로세서는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생하고 인터럽트 처리 루틴으로 들어간다.
세그먼트 레지스터
| 16Bit | 기능 |
| ES | 보조 세그먼트 레지스터다. 두 곳 이상의 데이터 저장영역을 가리켜야 할 때 DS와 함께 사용된다. 하지만 32비트 프로그램에서는 DS와 ES가 같은 영역을 가리키고 있기 때문에 굳이 신경 쓰지 않아도 된다. |
| CS | 코드 세그먼트를 가리키는 레지스터 |
| SS | 스택 세그먼트를 가리키는 레지스터 |
| DS | 데이터 세그먼트를 가리키는 레지스터 |
| FS, GS | 보조 세그먼트 레지스터. FS, GS는 286 이후에 추가된 것으로 운영체제를 작성하는 게 아니라면 없듯이 여겨도 된다. |
세그먼트 레지스터(Segment Register)
1. CS(Code Segment) : 실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터로 다음에 수행될 명령어의 물리 주소는 CSx10H와 오프셋 레지스터인 IP와 합해서 결정된다.
2. DS(Data Segmen) : 명령어가 수행하는데 필요한 데이터들이 들어있는 데이터 세그먼트의 시작주소를 가지고 있는 레지스터로 메모리 직접 주소 지정 및 BP 레지스터 이외의 다른 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다. 또한 문자열 처리 명령에서 SI 레지스터와 결합해서 출발지의 물리주소를 생성하기도 한다.
3. SS(Stack Segment) : 스택 영역을 나타내는 스택 세그먼트의 시작주소를 가지고 있는 레지스터로서 유효 주소는 SP와 SSx10H의 합으로 물리 주소를 결정한다. 또한 BP레지스터를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해져서 물리 주소를 생성한다.
4. ES(Extra Segment) : 일반적으로 문자열 처리 명령어에 대해 사용할 때 추가로 사용하는 여분의 세그먼트인 익스트라 세그먼트의 시작주소를 가지고 있는 레지스터로 문자열 처리 명령어가 수행되면 목적지의 위치는 DI와 EXx10H로 결정되고 출발지의 위치는 SI와 DXx10H로 물리 주소가 결정된다.
Intel 8086/8088은 실행장치(EU:Execution Unit)와 버스 인터페이스 장치(BIU:Bus Interface Unit) 두 개의 장치를 가지고 있다. 버스 인터페이스 장치는 명령어, 오퍼랜드, 데이터들을 메모리로부터 인출(fetch)하는 일을 맡고 있고, 실행장치는 메모리로부터 인출된 명령어를 해독하고 실행하는 곳이다. Intel 8086/8088은 메모리 내에 FIFO(First In First Out)구조를 갖는 큐(queue)를 포함하고 있기 때문에 버스를 최대의 효율로 이용할 수 있다.
Intel 8086은 6바이트(2바이트 크기 3개)크기의 큐를 가지고 있고, Intel 8088은 4바이트 크기의 큐를 가지고 있다. 그러므로 Intel 8086의 큐는 3개의 16비트 크기를 저장할 수 있지만 Intel 8088은 2개의 16비트 크기만 저장할 수 있다.
이들 큐(queue)는 Intel 8086/8088에서 실행 장치가 동작하고 있는 동안 다음 명령어를 메모리로 부터 큐로 인출해 저장함으로서 메모리를 보다 효율적으로 사용할 수 있게 된다.
2. Intel 8086/8088의 메모리
Intel 8086/8088의 최대 주소 공간은 00000H 번지에서 FFFFFH 번지까지 1MB의 공간을 가지며 하나의 메모리 공간은 8비트 크기이다.
이들 프로세서 역시 대부분의 컴퓨터와 마찬가지로 메모리는 한 바이트 마다 하나의 주소가 부여되는 바이트 단위 주소가 붙어 있다. 따라서 만일 00100H의 주소를 시작으로 11H와 01H인 두 개의 데이터는 00100번지에 이 워드(2바이트)의 첫 번째 데이터인 11H가 00101H번지에는 01H의 데이터들이 각기 저장되어진다.
3. Programming 모델
IA-32 어셈블리 언어를 이용한 프로그램은 Intel 8086/8088과 같은 프로세서 내의 레지스터들의 종류와 사용용도를 알아야만 프로그램이 가능하므로 Intel 8086/8088 레지스터들의 사용 용도와 메모리 내에 있는 해당 세그먼트 주소를 알 수 있는 세그먼트 레지스터(segment register)와 오프셋(offset)에 대해 알아 본다.
범용 레지스터(General purpose register)
데이터들의 연산 및 전송, 번지 지정을 위한 포인터(pointer) 및 인덱스(index) 용도로 사용된다.
1. AX(Accumulator) : 누산기라고도 불리는 이 레지스터의 역할은 데이터 전송 및 연산 후의 결과 값을 잠시 저장한다. AX레지스터를 사용하면 다른 레지서트를 사용한 경우보다 명령어의 바이트 수가 짧게 되거나 실행 시간이 짧게되는 점이 있다. 또한 곱셈이나 나눗셈 등과 같은 연산에서는 반드시 AX나 AL레지스터를 사용해야 하는 경우도 있다.
2. BX(Base Register) : 메모리에 저장되어 있는 데이터의 주소를 저장한다든지, 전송 및 연산에 사용된다.
3. CX(Count Register) : 반복문이나 문자 스트링 등과 같은 명령어를 수행할 때 반복 횟수 등을 저장하는 카운터로 사용되기도 하고 또한 전송 및 연산에 사용된다.
4. DX(Data Register) : AX 레지스터와 함께 곱셈이나 나눗셈 등 일부 명령에서는 필수적으로 사용되기도 하고 또한 기타 연산 및 전송에 사용된다.
포인터와 인덱스 레지스터
포인터(SP와 BP)와 인덱스 레지스터(SI와 DI)들은 비록 범용 레지스터 범주에 속하지만 이들은 아래와 같이 주로 데이터가 저장되어 있는 메모리 주소를 가리키는 포인터로 사용된다.
1. SP(Stack Pointer) : 스택 내에서 가장 최근에 저장된 데이터의 주소(TOP)을 가리킨다.
2. BP(Base Pointer) : SP 대신 스택 내에서 데이터를 액세스 할 때 사용한다. 뿐만 아니라 다른 영역의 데이터를 간접적으로 지정하거나 전송 및 연산에도 사용 가능하다. 그리고 스택 상에서 프로시저를 처리할 때 SP 대신 BP를 이용하여 프로시저 인수들을 액세스하여 처리하면 보다 효과적으로 프로시저를 관리할 수 있다.
3. SI(Source Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 메모리로부터 데이터를 전송하기 위한 출발지 주소 지정에 사용된다. 이때 DS 세그먼트를 참조하여 20비트의 물리 주소를 생성한다(DI : SI). 그리고 일반적인 전송이나 연산에도 사용된다.
4. DI(Destination Index) : 번지의 간접 지정에 사용된다. 특히 문자열 처리 명령에 있어서는 레지스터나 메모리로부터 메모리로 데이터를 전송하거나 비교할 때 목적지 주소를 지정할 때 사용한다. 이때 세그먼트 레지스터 ES를 참조하여 20비트의 물리 주소를 생성한다(ES : DI). 그리고 이 레지스터는 일반적인 연산에도 사용된다.
명령어 레지스터 : IP(Instruction Pointer)
IP 레지스터는 다음에 실행할 명령어가 저장되어 있는 주소를 가지고 있는 레지스터로 명령어를 실행할 때마다 프로세서는 IP값을 현재 수행하는 명령어 길이만큼 자동적으로 증가해 다음 실행할 명령어 주소를 가지고 있다.
IP는 사용자가 값을 변경할 수 없다.
세그먼트 레지스터(Segment Register)
Intel 8086/8088 프로세서는 1MB까지의 메모리를 액세스하기 위해 20비트의 주소선이 있다. 그러나 Intel 8086/8088 레지스터는 모두 16비트의 크기 밖에 안 되므로 이들만 가지고는 1MB 용량을 가지는 메모리로 액세스할 수 있는 20비트의 주소를 생성할 수 없다. 그래서 IA-16 프로세서에서는 세그먼트 레지스터와 오프셋 레지스터 2개를 조합시켜 20비트 크기의 물리 주소를 산출해내는 방법을 취하고 있다.
1. CS(Code Segment) : 실행 할 명령어들이 들어있는 코드 세그먼트의 시작 주소를 가지고 있는 레지스터로 다음에 수행될 명령어의 물리 주소는 CSx10H와 오프셋 레지스터인 IP와 합해서 결정된다.
2. DS(Data Segmen) : 명령어가 수행하는데 필요한 데이터들이 들어있는 데이터 세그먼트의 시작주소를 가지고 있는 레지스터로 메모리 직접 주소 지정 및 BP 레지스터 이외의 다른 레지스터와 함께 사용하여 메모리 간접 주소 지정에서 오프셋 값과 더해져 물리 주소를 산출한다. 또한 문자열 처리 명령에서 SI 레지스터와 결합해서 출발지의 물리주소를 생성하기도 한다.
3. SS(Stack Segment) : 스택 영역을 나타내는 스택 세그먼트의 시작주소를 가지고 있는 레지스터로서 유효 주소는 SP와 SSx10H의 합으로 물리 주소를 결정한다. 또한 BP레지스터를 사용하는 메모리 간접 주소 지정에서 오프셋과 합해져서 물리 주소를 생성한다.
4. ES(Extra Segment) : 일반적으로 문자열 처리 명령어에 대해 사용할 때 추가로 사용하는 여분의 세그먼트인 익스트라 세그먼트의 시작주소를 가지고 있는 레지스터로 문자열 처리 명령어가 수행되면 목적지의 위치는 DI와 EXx10H로 결정되고 출발지의 위치는 SI와 DXx10H로 물리 주소가 결정된다.
오프셋(Offset) 레지스터
액세스 할 수 있는 해당 세그먼트의 크기는 최대 64KB이므로 그 세그먼트 안에서 필요한 정보를 액세스 하기 위해서는 다른 16비트 크기를 포인터 할 수 있는 레지스터가 필요한데 이 같은 포인터 역할을 하는 것을 오프셋 레지스터라 한다. 오프셋이란 어떤 기준 위치로부터 대상이 되는 정보가 있는 곳 까지의 떨어져 있는 거리를 의미한다.
20비트 물리 주소 산출
세그먼트 레지스터 0020H
오프셋 0010H
00200H (세그먼트 레지스터 4비트 shift left 결과 값)
0010H (오프셋 값)
--------
+ 00210H
세그먼트 레지스터를 4비트 shift left 한 결과값 + 오프셋 값 = 20비트 물리 주소
플래그 레지스터(Flag Register)
CF(Carry Flag 비트 0) : 덧셈의 결과 높은 자리로 자리 올림수(carry)가 발생했다든지 혹은 뺄셈 후 빌림수(borrow)가 발생한 경우에 1로 세트된다. 또한 이 플래그는 부호 없는 정수연산에서의 오버플로(overflow) 상태를 나타내기도 하고, 다배정도 연산에 있어서도 사용된다.
PF(Parity Flag 비트 2) : 결과의 최하위 바이트에 값 1의 비트가 짝수 개 포함되어 있는 경우에 1이 되고 홀수 개 경우에는 0으로 된다.
AF(Auxilary carry Flag 비트 4) : 산술연산에 있어서 결과 비트 3에 캐리 혹은 빌림 수가 발생한 경우 1이 되고, 발생하지 않으면 0으로 된다. 이 플래그는 BCD 연산에서 보정용으로 사용된다.
ZF(Zero Flag 비트 6) : 연산의 결과 값이 0이 되었을 때 1로 세트된다.
SF(Sign Flag 비트 7) : 부호 있는 정수의 부호 비트가 0이면 양수, 1이면 음수로 된다.
OF(Overflow Flag 비트 11) : 연산을 부호가 있는 숫자로 했을 때, 오버플로 혹은 언더플로우(underflow)가 발생한 경우에 1로 세트된다.
제어 플래그 레지스터
DF(Direction Flag 비트 10) : 이 비트는 문자열 처리 방향을 정하는 방향 플래그이다. 문자열을 증가하는 레지스터는 DF가 0이면 선증가, DF가 1이면 선감소로 지정된다. 이 플래그는 STD(D = 1), CLD(D = 0) 명령으로 제어할 수 있다.
IF(Interrupt enable Flag) : 외부 인터럽트 발생의 허용을 제어하는 인터럽트 허용 플로그이다. IF가 1이면 외부 인터럽트가 허용되고, 0이면 금지된다. 이 플래그는 프로세서 내부에서 발생하는 인터럽트에 대해서는 영향이 전혀 없다.
TF(Trap enable Flag) : 이 플래그가 1로 세트되면 프로세서는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생하고 인터럽트 처리 루틴으로 들어간다.
1978년에 소개된 Intel 8086은 16비트 레지스터, 16비트 외부 데이터 버스, 및 20비트 주소선에 의해 1MB 크기의 주소공간을 사용할 수 있도록 개발되었다. 그러나 그 당시 메모리 칩(chip) 가격은 상당히 비싼 편이어서 이전에 사용하던 IA-8 프로세서 보다 2배나 많은 메모리를 필요로 하는 Intel 8086 프로세서를 선택하기를 주저했다.
이런 이유로 Intel 8086이 소개된지 얼마 되지 않은 1979년에 외부 데이터 버스를 8비트로 축소한 것을 제외하고는 Intel 8086과 동일하게 동작할 수 있는 Intel 8088 프로세서가 개발되었다. 이들 Intel 8086/8088 프로세서에 세그먼트 개념이 도입되었다. 세그먼트에 의해 16비트 세그먼트 레지스터로 최대 64KB 크기의 하나의 메모리 세그먼트가 구성 될 수 있어 이로 인해 Intel 8086/8088 프로세서는 한번에 4개의 세그먼트 레지스터(CS, DS, SS, ES)를 사용하여 세그먼트간의 교체(switching)없이 최대 256KB 크기까지의 주소지정이 가능하도록 하였다. 16비트 크기인 세그먼트 레지스터 포인터와 오프셋(offset)이라 부르는 추가된 16비트 포인터를 서로 조합하여 만든 20비트 크기의 주소로 최대 1MB 크기까지의 메모리를 사용할 수 있다.
Intel 8088 : 16비트 레지스터, 8비트 외부 데이터 버스, 20비트 크기의 주소로 최대 1MB 크기 메모리
2. Intel 80286 (IBM PC-AT)
IA-16 프로세서에 다중 사용자(multiuser) OS를 탑재하여 여러 사용자가 한대의 PC를 사용할 수 있는 보호모도(protected mode)를 최조로 도입한 것은 1984년에 IBM AT(Advanced Technology)란 이름으로 등장한 Intel 80286 프로세서이다. 이 프로세서는 Intel 8086과 마찬가지로 프로세서내의 레지스터 크기는 16비트로 변함이 없지만 주소 버스가 Intel 8086/8088에서의 20비트 크기에서 24비트로 확장되어 보호모드 상태에서 최대 16MB 까지의 메모리를 사용할 수 있다. 이로 인해 Intel 계열 처음으로 Intel 80286 프로세서에서 실제모드(real mode)와 보호모드(protected mode)라는 두 가지 동작 모드를 제공하였다. 실제 모드란 Intel 80286 프로세서 상에서 Intel 8086과 동일하게 동작한다는 것이다. 달리 말하면 어떠한 Intel 8086 프로그램도 아무런 수정 없이 Intel 80286의 실제 모드에 오류(error)없이 실행 가능하다. 이때 실제 모드에서 동작하는 Intel 80286은 24비트 주소선중 20비트만을 사용하므로 액세스(access) 가능한 메모리 공간은 Intel 8086처럼 1MB로 제한된다. Intel 80286 시스템에 전원을 넣으면 처음에는 실제 모드로 동작한다. Intel 80286은 16개의 명령어가 추가되었는데 이들 명령어는 모두 프로세서의 보호 모드를 관리하기 위한 것들이었다. Intel 80286이 실제 모드로 동작하는 경우 Intel 8086과 다른 점은 프로세서가 새로 설계되었고 최대 클록 속도가 6MHz 혹은 8MHz로 증가하여 Intel 8086보다 더 빠르게 실행된다는 것 뿐이다.
보호 모드란 다중 프로그램(multi programming)이 하나의 메모리에 적재되어 각각의 프로그램들이 OS에 의해 보호되면서 수행된다는 의미로 붙여졌다. 여기서 보호된다는 말은 하나의 세그먼트에 저장되어 있으면서 실행되는 프로그램은 다른 세그먼트에 저장되어 있는 프로그램에 대해 어떤 데이터도 읽거나(read) 혹은 쓸 수(write) 없다는 의미이다.
이 모드에서 프로그램은 물리 주소(physical address)를 사용하지 않고 세그먼트 셀럭터(selector)를 통해 주소를 지정한다. Intel 80286에서 이 방식을 사용하면 각 프로그램은 최대 16MB의 메모리를 사용할 수 있다. Intel 80286의 보호 메커니즘(mechanism)에는 세그먼트 경계 조사, 읽기만(read-only), 실행만(execute-only) 할 수 있게끔 하는 세그먼트 옵션(segment option)이 있다. 또 응용 및 사용자 프로그래머로부터 OS 코드를 보호하기 위해 최대 4개의 특권 레벨(privilege level)을 설정할 수도 있다.
3. Intel 80386
1985년에 소개된 Intel 80386 프로세서는 IA-32 프로세서 계열 최초의 32비트 프로세서다. 이 프로세서는 오퍼랜드 저장과 주소지정을 위해 32비트 크기의 레지스터가 도입되었다. 32비트 범용 레지스터 각각의 1/2인 하위 16비트와 상위 16비트는 앞 세대인 16비트 프로세서(Intel 8086/8088, Intel 80286)에 내장된 16비트 레지스터의 모든 특성을 그대로 사용할 수 있을 뿐만 아니라 Intel 80286 동작 모드인 실제 모드와 보호 모드 외에 여러 개의 8086 기계가 서로 보호되면서 동시에 수행될 수 있는 가상 8086 모드(virtual 8086 mode)를 새로 추가하였다. Intel 80386 프로세서는 32비트 주소 버스에 의해 최대 4GB 크기의 물리적 메모리를 지원한다. 32비트 프로세서는 각 소프트웨어 프로세스(software process)용의 논리 주소공간을 제공한다. 이 프로세서는 세그먼트 메모리 모델과 플랫(flat) 메모리 모델 모두를 지원한다. 플랫 메모리 모델에서는 여러 개의 세그먼트 레지스터가 하나의 메모리 안에 할당되어 같은 주소를 지정한다. 그리고 주의해야할 사항은 메모리 모델로 플랫을 사용할 때는 .586 등과 같은 지시어보다도 Flat 메모리 모델 선언이 먼저 나와야 한다는 것이다. 이전의 16비트 명령어들은 새로운 32비트 오퍼랜드와 주소 지정형식으로 강화되어 비트 연산용의 명령어 등 16개의 새로운 명령어들도 추가하였다. 또한 Intel 80386 프로세서에서는 IA-32 프로세서에 페이징(paging) 기법이 도입되었는데 이것은 4KB 크기의 고정된 페이지에 의해 최대 64TB 크기까지의 가상 메모리를 관리할 수 있는 메모리 관리 방식이다.
IA-32 프로세서는 또한 여러 개의 병렬 단계를 가지는 최초의 IA-32 프로세서다. 병렬 단계를 포함한다는 것은 버스 인터페이스 장치(bus interface unit), 코드 프리 페치 장치(code prefetch unit(버스 unit 에서 object code를 받아서 그것을 16비트 queue에 전달한다)), 명령어 해독 장치(decode unit(prefetch unit에서 받은 object code를 micro code로 디코드한다)), 실행 장치(micro code명령을 실행한다), 세그먼트 장치(논리 주소를 실제 주소로 변환하며, 보호 조사를 실행한다), 및 페이징 장치(실제 주소를 물리 주소로 변환해서 페이지 기반 보호 조사를 실행해서 최근에 액세스한 최대 32개 페이지에 관한 정보를 얻어 캐시(cache)에 저장한다)의 6단계가 있다.
4. Intel 80486
1989년에 소개된 Intel 80486 프로세서는 Intel 80386 프로세서의 명령어 해독 장치와 실행 장치를 5 단계로 파이프라인(pipeline) 하여 5개의 명령어들을 동시에 처리할 수 있도록 병렬 처리 기능을 향상시키긴 했지만, 어셈블리 언어 관점에서 보면 단지 6개의 명령어만 추가되었고 이들 용도도 OS에 관련된 것 일뿐 응용 프로그램을 위한 것은 아니었다.
다만 특이할 만한 개선점은 Intel 80386에서 실수 연산을 위해 선택적으로 사용되던 Intel 80387의 FPU(Floationg-point Process Unit)를 Intel 80486 프로세서 안에 내장시킴과 더불어 같은 시간대에 여러 기능들을 동시에 처리할 수 있는 기술인 파이프라인 기술을 채택하여 Intel 80386보다 두 배 빠른 성능을 가진 Intel 80386의 후속 IA-32 프로세서이다.
5. Intel Pentium
1993년에 발표한 펜티엄 프로세서는 두개의 병렬 실행 파이프라인을 가지는 슈퍼스칼라(superscalar) 기술이 추가된 IA-32 프로세서이다. 이 슈퍼스칼라 기술은 두 개의 명령어를 동시에 디코드(decoded)하고 실행할 수 있는 기술이다. 펜티엄은 또한 이전의 IA-32 프로세서와 다른 차이는 캐시 크기가 16KB로 증가되어 Intel 80486의 8KB 캐시보다 두 배 크기로 확장되었다. 즉 8KB의 명령 캐시와 8KB의 데이터를 갖고 있다. 또한 데이터 버스는 이전의 IA-32 프로세서인 Intel 80486이 가졌던 32비트로부터 64비트 크기로 내부 데이터 버스(internal data path)를 확장하여 내장한 시스템이다.
|
명 령 어 |
설 명 | |
| Data Transfer | ||
| MOV | Move | 데이터 이동 (전송) |
| PUSH | Push | 오퍼랜드의 내용을 스택에 쌓는다 |
| POP | Pop | 스택으로부터 값을 뽑아낸다. |
| XCHG | Exchange Register/memory with Register | 첫 번째 오퍼랜드와 두 번째 오퍼랜드 교환 |
| IN | Input from AL/AX to Fixed port | 오퍼랜드로 지시된 포트로부터 AX에 데이터 입력 |
| OUT | Output from AL/AX to Fixed port | 오퍼랜드가 지시한 포트로 AX의 데이터 출력 |
| XLAT | Translate byte to AL | BX:AL이 지시한 데이블의 내용을 AL로 로드 |
| LEA | Load Effective Address to Register | 메모리의 오프셋값을 레지스터로 로드 |
| LDS | Load Pointer to DS | REG←(MEM), DS←(MEM+2) |
| LES | Load Pointer ti ES | REG←(MEM), ES←(MEM+2) |
| LAHF | Load AH with Flags | 플래그의 내용을 AH의 특정 비트로 로드 |
| SAHF | Store AH into Flags | AH의 특정 비트가 플래그 레지스터로 전송 |
| PUSHF | Push Flags | 플래그 레지스터의 내용을 스택에 쌓음 |
| POPF | Pop Flags | 스택으로부터 플래그 레지스터로 뽑음 |
| Arithmetic | ||
| ADD | Add | 캐리를 포함하지 않은 덧셈 |
| SBB | Subtract with Borrow | 캐리를 포함한 뺄셈 |
| DEC | Decrement | 오퍼랜드 내용을 1 감소 |
| NEG | Change Sign | 오퍼랜드의 2의 보수, 즉 부호 반전 |
| CMP | Compare | 두 개의 오퍼랜드를 비교한다 |
| ADC | Add with Carry | 캐리를 포함한 덧셈 |
| INC | Increment | 오퍼랜드 내용을 1 증가 |
| AAA | ASCII adjust for Add | 덧셈 결과 AL값을 UNPACK 10진수로 보정 |
| DAA | Decimal adjust for Add | 덧셈 결과의 AL값을 PACK 10진수로 보정 |
| SUB | Subtract | 캐리를 포함하지 않은 뺄셈 |
| AAS | ASCII adjust for Subtract | 뺄셈 결과 AL값을 UNPACK 10진수로 보정 |
| DAS | Decimal adjust for Subtract | 뺄셈 결과의 AL값을 PACK 10진수로 보정 |
| MUL | Multiply (Unsigned) | AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장 |
| IMUL | Integer Multiply (Signed) | 부호화된 곱셈 |
| AAM | ASCII adjust for Multiply | 곱셈 결과 AX값을 UNPACK 10진수로 보정 |
| DIV | Divide (Unsigned) | AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장 |
| IDIV | Integer Divide (Signed) | 부호화된 나눗셈 |
| AAD | ASCII adjust for Divide | 나눗셈 결과 AX값을 UNPACK 10진수로 보정 |
| CBW | Convert byte to word | AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장 |
| CWD | Convert word to double word | AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환 |
| Logic | ||
| NOT | Invert | 오퍼랜드의 1의 보수, 즉 비트 반전 |
| SHL/SAL | Shift logical / arithmetic Left | 왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0) |
| SHR | Shift logical Right | 오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0) |
| SAR | Shift arithmetic Right | 오른쪽 자리이동, 최상위 비트는 유지 |
| ROL | Rotate Left | 왼쪽으로 오퍼랜드만큼 회전 이동 |
| ROR | Rotate Right | 오른쪽으로 오퍼랜드만큼 회전 이동 |
| RCL | Rotate through Carry Left | 캐리를 포함하여 왼쪽으로 오퍼랜드만큼 회전 이동 |
| RCR | Rotate through Carry Right | 캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동 |
| AND | And | 논리 AND |
| TEST | And function to Flags, no result | 첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트 |
| OR | Or | 논리 OR |
| XOR | Exclusive Or | 배타 논리 합 (OR) |
| String Manipulation | ||
| REP | Repeat | REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복 |
| MOVS | Move String | DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송 |
| CMPS | Compare String | DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정 |
| SCAS | Scan String | AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정 |
| LODS | Load String | SI 내용을 AL 또는 AX로 로드 |
| STOS | Store String | AL 또는 AX를 ES:DI가 지시하는 메모리에 저장 |
| Control Transfer | ||
| CALL | Call | 프로시저 호출 |
| JMP | Unconditional Jump | 무조건 분기 |
| RET | Return from CALL | CALL로 스택에 PUSH된 주소로 복귀 |
| JE/JZ | Jump on Equal / Zero | 결과가 0이면 분기 |
| JL/JNGE | Jump on Less / not Greater or Equal | 결과가 작으면 분기 (부호화된 수) |
| JB/JNAE | Jump on Below / not Above or Equal | 결과가 작으면 분기 (부호화 안 된 수) |
| JBE/JNA | Jump on Below or Equal / not Above | 결과가 작거나 같으면 분기 (부호화 안 된 수) |
| JP/JPE | Jump on Parity / Parity Even | 패리티 플레그가 1이면 분기 |
| JO | Jump on Overflow | 오버플로가 발생하면 분기 |
| JS | Jump on Sign | 부호 플레그가 1이면 분기 |
| JNE/JNZ | Jump on not Equal / not Zero | 결과가 0이 아니면 분기 |
| JNL/JGE | Jump on not Less / Greater or Equal | 결과가 크거나 같으면 분기 (부호화된 수) |
| JNLE/JG | Jump on not Less or Equal / Greater | 결과가 크면 분기 (부호화된 수) |
| JNB/JAE | Jump on not Below / Above or Equal | 결과가 크거나 같으면 분기 (부호화 안 된 수) |
| JNBE/JA | Jump on not Below or Equal / Above | 결과가 크면 분기 (부호화 안 된 수) |
| JNP/JPO | Jump on not Parity / Parity odd | 패리티 플레그가 0이면 분기 |
| JNO | Jump on not Overflow | 오버플로우가 아닌 경우 분기 |
| JNS | Jump on not Sign | 부호 플레그가 0이면 분기 |
| LOOP | Loop CX times | CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기 |
| LOOPZ/LOOPE | Loop while Zero / Equal | 제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기 |
| LOOPNZ/LOOPNE | Loop while not Zero / not Equal | 제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기 |
| JCXZ | Jump on CX Zero | CX가 0이면 분기 |
| INT | Interrupt | 인터럽트 실행 |
| INTO | Interrupt on Overflow | 오버플로우가 발생하면 인터럽트 실행 |
| IRET | Interrupt Return | 인터럽트 복귀 (리턴) |
| Processor Control | ||
| CLC | Clear Carry | 캐리 플레그 클리어 |
| CMC | Complement Carry | 캐리 플레그를 반전 |
| CLD | Clear Direction | 디렉션 플레그를 클리어 |
| CLI | Clear Interrupt | 인터럽트 플레그를 클리어 |
| HLT | Halt | 정지 |
| LOCK | Bus Lock prefix | |
| STC | Set Carry | 캐리 플레그 셋 |
| NOP | No operation | |
| STD | Set Direction | 디렉션 플레그 셋 |
| STI | Set Interrupt | 인터럽트 인에이블 플레그 셋 |
| WAIT | Wait | 프로세서를 일지 정지 상태로 한다 |
| ESC | Escape to External device | 이스케이프 명령 |
|
지시어 |
내 용 |
형 식 |
|
SEGMENT |
어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다. | segname SEGMENT ; 세그먼트 시작 ⋮ ; 세그먼트 내용 segname ENDS ; 세그먼트 끝 |
|
PROC |
매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다. | procname PROC ; 프로시저의 시작 ⋮ ; 프로시저의 내용 procname ENDP ; 프로시저의 끝 |
|
ASSUME |
어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다. | ASSUME SS:stack_segname, DS:data_segname, CS:code_segname, ES:extra_segname |
|
END |
전제 프로그램의 끝을 나타냄 | END |
| 데이터 정의 지시어 : 프로그램에서 데이터를 저장할 기억 장소를 정의, 초기값 부여 | ||
|
DB |
Define Byte | name DB 초기값 |
|
DW |
Define Word | name DW 초기값 |
|
DD |
Define Double Word | name DD 초기값 |
|
DQ |
Define Quad Word | name DQ 초기값 |
|
DT |
Define Ten Bytes | name DT 초기값 |
|
EQU |
변수 이름에 데이터값이나 문자열 정의 | name EQU 데이터값/문자열 |
|
= |
EQU와 달리 정의된 값을 변경 가능 | |
|
EVEN |
어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함 | |
|
PAGE |
어셈블리 리스트의 형식을 결정 | PAGE [length][,width] |
|
TITLE |
어셈블리 리스트의 각 페이지에 제목 출력 | TITLE text |


ex720.asm

m32v82r_657.zip


Recent Comment