블로그 이미지

마이실피르넷

일상의 이야기와 여러가지 유용한 정보들을 나누는 공간입니다. by 실피르넷


'프로그래밍/Assembly'에 해당되는 글 9건

  1. 2007/06/04 어셈블리 예제 연습 ex 7.20
  2. 2007/05/28 어셈블리 예제 연습 ex 8.21
  3. 2007/05/05 어셈블리 기본 요약
  4. 2007/05/04 어셈블리 간단 예제(2)
  5. 2007/05/01 EditPlus Assembly 설정 (MASM)(5)
  6. 2007/04/21 레지스터(Register)
  7. 2007/04/20 Intel 8086/8088
  8. 2007/04/19 IA-32 프로세스 변천(2)
  9. 2007/04/19 Intel 8086 어셈블리 명령어 & 지시어

어셈블리 예제 연습 ex 7.20


	.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

Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/214 관련글 쓰기

Top

어셈블리 예제 연습 ex 8.21

어셈블리 예제 연습

	.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



사용자 삽입 이미지
Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/213 관련글 쓰기

Top

어셈블리 기본 요약

레지스터
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           ;

;---------------------------;

Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/200 관련글 쓰기

Top

어셈블리 간단 예제

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

Comment 2 Trackback 0
  1. Favicon of http://cranix.net BlogIcon 크래닉스 2007/05/05 01:06 address edit & delete reply

    재밌어보여!
    재밌지?

    • Favicon of http://mysilpir.net BlogIcon 신선 2007/05/05 03:00 address edit & delete

      -_-

      그래. 재밌어 죽겠다!

Trackback : http://my.silpir.net/trackback/199 관련글 쓰기

Top

EditPlus Assembly 설정 (MASM)

EditPlus Assembly 설정 (MASM32)

1. Assemble
명령 : 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
































* Microsoft® MASM Programmer’s Guide




1. MASM32 v9r (m32v9r.zip) 설치
사용자 삽입 이미지

2. EditPlus 사용자 도구 설정
사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

사용자 삽입 이미지

3. EditPlus 구문강조 설정
사용자 삽입 이미지



Assembly (MASM)

1.  Macro Assembler Version 5.10 (masm_912.zip) 설치
C:\masm 폴더로 압축을 풀어준다.
CREF.EXE
exe2bin.exe
LINK.EXE
make.exe
MASM.EXE
5개의 파일이 들어있습니다.

2. 예제파일 example1.asm 작성 (문자 '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
사용자 삽입 이미지


3. 어셈블리 과정
c:\masm> 파일명.asm
ex) c:\masm> example1.asm
사용자 삽입 이미지

사용자 삽입 이미지

4. 링크 과정
c:\masm> link 파일명.obj
ex) c:\masm> link example1.obj

사용자 삽입 이미지

5. 실행
c:\masm> 파일명.exe
ex) c:\masm> example1.exe

사용자 삽입 이미지
Comment 5 Trackback 0
  1. Favicon of http://2nom.com/leelook BlogIcon leeLook 2007/05/04 12:49 address edit & delete reply

    어셈~ 토나와 ㅠ.ㅠ

    • Favicon of http://mysilpir.net BlogIcon 신선 2007/05/04 23:19 address edit & delete

      어셈의 추억~ 룰루랄라. ㅎ.ㅎ;

  2. Favicon of http://maengyi.info BlogIcon 맹이 2007/05/09 23:10 address edit & delete reply

    일땜에 어셈블리를 시작했는데요. masm32를 받아 설치를 했는데 컴파일이 이상해서 고생많이 하던중에 이 글을 보고 masm를 설치했드니 컴파일이 이상없이 잘 되더군요. 좋은 글 참 고마웠습니다.

    그런데 masm32에서 컴파일은 되는데 링크가 안되는건 어떤 문제일까요? masm32에는 라이버리가 많아서 편할것 같은데 링크가 안되서 안타깝습니다.

    • Favicon of http://mysilpir.net BlogIcon 신선 2007/05/11 17:09 address edit & delete

      저도 이제 막 학과수업으로 기초를 배우는 중이라 잘 모르지만...
      MASM32 v9r (m32v9r.zip) 설치후 예제를 테스트 해봤었는데
      잘 되는걸 확인했는데... 아래쪽 5.10 버젼에서의 예제는 MASM32
      에서는 잘 안되어서 교수님께 물어봤더니 MASM32에서는 지시어같은걸
      정확하게 잘 써줘야 된다고 하시더군요. 설정부분에 문제가 없다면
      테스트 해본 예제 코딩에 문제가 있지 않을까 생각됩니다.
      아~ 고달픈 어셈이여..;

  3. Favicon of http://mysilpir.net BlogIcon 신선 2007/06/10 03:51 address edit & delete reply

    http://vim.cau.ac.kr/vimlab/wiki.php/masm
    masm 참고

Trackback : http://my.silpir.net/trackback/198 관련글 쓰기

Top

레지스터(Register)

레지스터(Register)
레지스터란, 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로 물리 주소가 결정된다.
Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/183 관련글 쓰기

Top

Intel 8086/8088

1. Intel 8086/8088의 기본적인 구조

  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의 데이터들이 각기 저장되어진다.
한 바이트당 하나의 주소, 최대 가능한 메모리 공간 : 00000H ~ FFFFFH 까지 1MB

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비트 물리 주소 산출
ex)
세그먼트 레지스터  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로 세트되면 프로세서는 하나의 명령어가 끝날 때마다 자동적으로 내부 인터럽트를 발생하고 인터럽트 처리 루틴으로 들어간다.
Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/179 관련글 쓰기

Top

IA-32 프로세스 변천

1. Intel 8086/8088

  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 8086 : 16비트 레지스터, 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)를 확장하여 내장한 시스템이다.

Comment 2 Trackback 0
  1. Favicon of http://clueir.com/tt BlogIcon ㄹㅔㅈㅕ 2007/04/19 23:01 address edit & delete reply

    저랑 비슷한 전공을 하시는가봐요?? ㅋㅋ
    초등학교때 286 컴퓨터의 녹색 모니터를 보며 땅따먹기 게임을 하던게 생각이 나네요..ㅎㅎ

    • Favicon of http://mysilpir.net BlogIcon 신선 2007/04/20 20:02 address edit & delete

      ㅎ.ㅎ; 그런것 같네요~

Trackback : http://my.silpir.net/trackback/178 관련글 쓰기

Top

Intel 8086 어셈블리 명령어 & 지시어

명  령  어

설                                               명

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
-
END

어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다. segname SEGMENT ; 세그먼트 시작
⋮ ; 세그먼트 내용
segname ENDS ; 세그먼트 끝

PROC
-
ENDP

매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(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
출처 : Tong - 통토로동통똥똥님의 reverse tech통
Comment 0 Trackback 0

Trackback : http://my.silpir.net/trackback/177 관련글 쓰기

Top

prev 1 next