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 | 이스케이프 명령 |
8086 지시어
지시어 | 내 용 | 형 식 |
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 |