혼동되는 어셈블리 명령어
by St1tchNEG : 2의 보수 (부호 반전)
NOT : 1의 보수 (비트 반전)
MUL : AX와 오퍼랜드 곱셈 -> AX또는 DX:AX에 저장
IMUL <- 부호 o
CBW : AL -> AX 확장 ex) eax에 0x12345678가 있으면 -> 0x12340078으로 됨
CWD : AX -> DX:AX 확장
SHL/SAL : 왼쪽 shift
SHR/SAR : 오른쪽 shift (SAR은 산술 shift로 최상위 비트를 유지한다고 한다.)
ROL/RCL : 회전 왼쪽 shift
ROR/RCR : 회전 오른쪽 shift
PUSHAD : 레지스터 내용을 스택에 push (EAX, ECX, EDX, EBX, ESP, EBP, ESI, EDI 순서)
PUSHFD : 플래그 레지스터 내용을 스택에 push
REP : 뒤의 스트링 명령을 (E)CX가 0이 될때까지 반복. (E)CX는 1씩 감소.
ex) rep movs byte ptr [edi], byte ptr [esi] <- 문자열 esi값을 edi에 복사
SCAS : 크기에 맞게 ax와 비교.
repne scas byte ptr [edi] <- al과 비교하여 같지 않으면 빠져나감
STOS : 크기에 맞게 ax를 edi가 가리키는 주소에 저장
ex) rep stos byte ptr [EDI]
LODS : SI내용을 AL에 로드.
DIV - 부호 없는 나누기 (EAX와 나누어 몫은 EAX, 나머지는 EDX에 저장)
operand는 1개이고 부호가 없는 나눗셈
IDIV - 부호 있는 나누기 (EAX와 나누어 몫은 EAX, 나머지는 EDX에 저장)
operand는 1개이고 부호가 있는 나눗셈
IDIV가 나타나기 전에 CBW, CWD, CDQ 와 같이 부호비트 확장하는 코드가 등장한다.
나눗셈을 진행하고 부호비트를 넣어줄 공간을 확보하는데 기존 공간의 2배를 확장하게 된다.
CBW 는 BYTE->WORD
CWD 는 WORD->DWORD
CDQ 는 DWORD->QWORD
AAA | Ascii Adjust for Addition | AAD | Adjust For Division |
뎃셈을 한 후 AL 레지스터 값을 언팩 10진 보정하는 명령어 | 나누기 연산을 하기 전에 언팩 10진 보정하는 명령어 | ||
AAM | Ascii Adjust for Multiplication | AAS | Adjust for Subtraction |
곱셈을 한 후 언팩 10진 보정하는 명령어 | 뺄셈을 한 후 언팩 10진 보정하는 명령어 | ||
ADC | Add With Carry p | ADD | Arithmetic Addition |
더하기를 할 때 캐리(carry)도 함께 더함 | 두 오퍼랜드에 더하기를 수행하여 결과를 DEST 즉, 왼쪽에 저장 | ||
AND | Logical And | CALL | Procedure Call |
두 오퍼랜드에 논리 연산 AND를 함 | 서브루틴을 호출 | ||
CBW | Convert Byte to Word | CLC | Clear Carry |
AL 레지스터에 바이트를 AX의 워드형으로 확장 | 캐리 플래그(flag)를 클리어 함 | ||
CLD | Clear Direction Flag | CLI | Clear Interrupt Flag |
방향 플래그를 클리어 함 | 인터럽트 플래그를 클리어 함 | ||
CLI | Clear Intterupt Flag | CLTS | Clear Tack Switched Flag |
인터럽트 플래그를 클리어 함 | 태스크 스위치 플래그를 클리어 함 | ||
CMC | Complement Carry Flag | CMP | Compare |
캐리 플래그를 세트 | 두 오퍼랜드를 비교하고 그 결과에 따라서 플래그를 세트 | ||
CMPS/CMPSB/CMPSW/CMPSD(E) - Compare String | CMPXCHG | Compare and Exchange | |
SI가 가리키는 곳과 (E)DI가 가리키는 곳을 비교하여 그 결과에 따라서 플래그를 세트 | 두 오퍼랜드를 비교한 후 값을 서로 바꿈 | ||
CWD | Convert Word to Extended Doubleword | CWDE | Convert Word to Extended Doubleword |
AX 레지스터의 워드를 DX:AX의 더블워드 형으로 확장함 | AX 레지스터의 워드를 EAX의 더블워드 형으로 확장함 | ||
DAA | Decimal Adjust for Addition | DAS | Decimal Adjust for Subtraction |
덧셈을 한 후 AL 레지스터에 값을 팩 10진 보정함 | 뺄셈을 한 후 AL 레지스터에 값을 팩 10진 보정함 | ||
DEC | Decrement | DIV | Divide |
오퍼랜드의 값을 1 감소함 | 나눗셈을 수행함 | ||
HLT | Halt CPU | IDIV | Signed Integer Division |
CPU의 동작을 멈추게 함 | 나눗셈을 수행함 | ||
IMUL | Signed Multiply | IN | Input Byte or Word From Port |
곱셈을 수행함 | 데이터를 포트에서 읽어옴 | ||
INC | Increment | INS | Input String from Port |
오퍼랜드의 값을 1 증가시킴 | 문자열 데이터를 포트에서 읽어옴 | ||
INT | Interrupt | INTO | Interrupt on Overflow |
인터럽트를 호출함 | 오버플로우 플래그가 세트되어 있다면 인터럽트를 4번 부름 | ||
IRET/IRETD | Interrupt Return | JA | Jump it Above (CF=0 and ZF=0) |
인터럽트에서 원래 루틴으로 돌아옴 | 비교 결과가 크다면 점프하는 명령 | ||
JAE | Jump if Above or Equal (CF=0) | JB | Jump if Below (CF=1) |
비교한 결과가 크거나 같으면 점프하는 명령 | 비교한 결과가 작으면 점프하는 명령 | ||
JBE | Jump if Below or Equal (CF=1 or ZF =1) | JC | Jump if Carry (CF=1) |
비교한 결과가 작거나 같으면 점프하는 명령 | 캐리 플래그가 세트되었다면 점프 | ||
JCXZ | Jump if CX Zero (CX=0) | JE | Jump if Equal (ZF=1) |
CX 레지스터의 값이 0이라면 점프 | 비교한 결과가 같은면 점프 | ||
JG | Jump if Greater (ZF=0 and SF=0F) | JGE | Jump if Greater or Equal (SF=0F) |
비교한 결과가 크다면 점프 | 비교한 결과가 크거나 같으면 점프 | ||
JL | Jump if Less (SF!=0F) | JLE | Jump if Less or Equal (ZF=1 or SF!=0F) |
비교한 결과가 작으면 점프 | 비교한 결과가 작거나 같으면 점프 | ||
JMP | Unconditional Jump | JNA | Jump if Not Above (CF=1 or ZF=1) |
무조건 점프 | 비교한 결과가 작거나 같으면 점프 | ||
JNAE | Jump if Not Above or Equal (CF=1) | JNB | Jump if Not Below (CF=0) |
비교한 결과가 작으면 점프 | 비교한 결과가 크거나 같으면 점프 | ||
JNBE | Jump if Not Below or Equal (CF=0 and ZF=0) | JNC | Jump if Not Carry (CF=0) |
비교한 결과가 크면 점프 | 캐리 플래그가 세트되어 있지 않다면 점프 | ||
JNE | Jump if Not Equa (ZF=0) | JNG | Jump if Not Greater (ZF=1 or SF!=0f) |
비교한 결과가 다르면 점프 | 비교한 결과 같거나 작으면 점프 | ||
JNGE | Jump if Not Greater or Equal (SF != 0F) | JNL | Jump if Not Less (SF=0F) |
비교한 결과 작으면 점프 | 비교한 결과 크거나 같으면 점프 | ||
JNLE | Jump if Not Less or Equal (ZF=0 and SF=0F) | JNO | Jump if Not Overflow (OF=0) |
비교한 결과 크면 점프 | 오버플로우 플래그가 0이면 점프 | ||
JNP | Jump if No Parity (PF=0) | JNS | Jump if Not Signed (SF=0) |
패리티 플래그가 0이면 점프 | 사인 플래그가 0이면 점프 | ||
JO | Jump if Overflow (OF=1) | JP | Jump if Parity (PF=1) |
오버플로우 플래그가 1이면 점프 | 패리티 플래그가 1이면 점프 | ||
JPE | Jump if Parity Even (PF=1) | JPO | Jump if Parity Odd (PF=0) |
패리티 플래그가 1이면 점프 | |||
패리티 플래그가 0이면 점프 | |||
JS | Jump if Signed (SF=1) | JZ | Jump if Zero (ZF=1) |
사인 플래그가 1이면 점프 | 같으면(0) 점프 | ||
LAHF | Load Register AH From Flags | LEA | Load Effective Address |
플래그 레지스터에 값을 AH 레지스터로 읽어옴 | 오퍼랜드의 오프셋을 레지스터에 저장함 | ||
LOCK | Lock Bus | LODS | Load String |
다음 명령이 수행될 때까지 다른 프로세서의 접근을 막음 | DS:SI가 가리키는 메모리에 값을 AL 또는 AX 레지스터로 읽어옴 | ||
LOOP | Decrement CX and Loop if CX Not Zero | LOOPE/LOOPZ | Loop While Equal / Loop While Zero |
CX 레지스터에 값만큼 반복함 | 제로 플래그가 1이거나 CX 레지스터가 0이 아닐 때 반복 | ||
LOOPNZ/LOOPNE | Loop While Not Zero / Loop While Not Equal | MOV | Move Byte or Word |
제로 플래그가 0이거나 CX 레지스터가 0이 아닐 때 반복 | 오퍼랜드에 값을 옮김. 오른쪽에서 왼쪽으로 옮겨짐 | ||
MOVS | Move String (Byte or Word) | MUL | Unsigned Multiply |
DS:SI가 가리키는 메모리의 값을 ES:DI가 가리키는 메모리로 옮김 | 곱셈을 함 | ||
NEG | Two's Complement Negation | NOP | No Operation |
오퍼랜드의 부호를 바꿈 | 3 사이클 동안 아무 일도 하지 않음 | ||
NOT | One's Compliment Negation (Logical NOT) | OR | Inclusive Logical OR |
오퍼랜드에 대해 논리연산 NOT을 해줌 | 두 오퍼랜드에 대해 논리연산 OR 함 | ||
OUT | Output Data to Port | OUTS | Output String to Port |
데이터를 포트에 씀 | 문자열 데이터를 포트에 씀 | ||
POP | Pop Word off Stack | POPF/POPFD | Pop Flags off Stack |
스택에 보관해 두었던 값을 가져옴 | 스택에 저장되어 있는 데이터를 플래그 레지스터로 가져옴 | ||
PUSH | Push Word onto Stack | PUSHA/PUSHAD | Push All Registers onto Stack |
데이터를 스택에 보관함 | 모든 레지스터의 값을 스택에 보관함 | ||
PUSHF/PUSHFD | Push Flags onto Stack | RCL | Rotate Through Carry Left |
플래그 레지스터의 값을 스택에 보관함 | 왼쪽으로 비트 회전을 시킴 | ||
RCR | Rotate Carry Right | REP | Repeat String Operation |
오른쪽으로 비트 회전을 시킴 | 문자열에 관계된 명령들을 지정한 횟수만큼 반복함 | ||
REPE/REPZ | Repeat Equal / Repeat Zero | REPNE/REPNZ | Repeat Not Equal / Repeat Not Zero |
ZF 레지스터에 값만큼 문자열 명령어를 반복함 | ZF 레지스터에 값만큼 반복함 | ||
RET/RETF | Return From Procedure | ROL | Rotate Left |
프러시저에서 복귀함 | 왼쪽으로 비트 회전함 | ||
ROR | Rotate Right | SAHF | Store AH Register into FLAGS |
오른쪽으로 비트 회전함 | AH의 값을 플래그로 옮김 | ||
SAL/SHL | Shift Arithmetic Left / Shift Logical Left | SAR | Shift Arithmetic Right |
왼쪽으로 지정한 수만큼 비트 회전시킴 | 지정한 횟수만큼 오른쪽으로 비트 회전시킴 | ||
SBB | Subtract with Borrow/Carry | SCAS | Scan String |
뺄셈을 할 때 캐리도 같이 빼줌 | AL 레지스터나 AX 레지스터의 값과 ES:DI가 가리키는 값을 비교 | ||
SETAE/SETNB | Set if Above or Equal / Set if Not Below | SETB/SETNAE | Set if Below / Set if Not Above or Equal |
캐리 플래그가 0이라면 지정한 바이트형 레지스터를 1로 세트 | 캐리 플래그가 0이라면 지정한 바이트형 레지스터를 1로 세트 | ||
SETBE/SETNA | Set if Below or Equal / Set if Not Above | SETE/SETZ | Set if Equal / Set if Zero |
제로 플래그나 캐리 플래그가 1이라면 바이트형 레지스터를 1로 세트 | 제로 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETNE/SETNZ | Set if Not Equal / Set if Not Zero | SETL/SETNGE | Set if Less / Set if Not Greater or Equal |
제로 플래그가 0이라면 바이트형 레지스터를 1로 세트 | 사인 플래그와 오버플로우 플래그가 같지 않다면 바이트형 레지스터를 1로 세트 | ||
SETGE/SETNL | Set if Greater or Equal / Set if Not Less | SETLE/SETNG | Set if Less or Equal / Set if Not greater or Equal |
사인 플래그와 오버플로우 플래그가 같다면 바이트형 레지스터를 1로 세트 | 제로 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETG/SETNLE | Set if Greater / Set if Not Less or Equal | SETS | Set if Signed |
제로 플래그는 0이고 사인 플래그와 오버플로우 플래그가 같다면 바이트형 레지스터를 1로 세트 | 사인 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETNS | Set if Not Signed | SETC | Set if Carry |
사인 플래그가 0이라면 바이트형 레지스터를 1로 세트 | 캐리 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETNC | Set if Not Carry | SETO | Set if Overflow |
캐리 플래그가 0이라면 바이트형 레지스터를 1로 세트 | 오버플로우 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETNO | Set if Not Overflow | SETP/SETPE | Set if Parity / Set if Parity Even |
오버플로우 플래그가 0이라면 바이트형 레지스터를 1로 세트 | 패리티 플래그가 1이라면 바이트형 레지스터를 1로 세트 | ||
SETNP/SETPO | Set if No Parity / Set if Parity Odd | SGDT | Store Global Descriptor Table |
패리티 플래그가 0이라면 바이트형 레지스터를 1로 세트 | Global Descriptor Table(GDT)의 위치를 지정한 메모리에 저장 | ||
SIDT | Store Interrupt Descriptor Table | SHL | Shift Logical Left |
Interrupt Descriptor Table(IDT)의 위치를 지정한 메모리에 저장 | 오퍼랜드에 내용을 지정한 수만큼 왼쪽으로 비트 회전시킴 | ||
SHR | Shift Logical Right | SHLD/SHRD | Double Precision Shift |
오퍼랜드에 내용을 지정한 수만큼 오른쪽 비트 회전시킴 | 두 오퍼랜드를 이용하여 지정한 수만큼 왼쪽/오른쪽으로 비트 회전시킴 | ||
SLDT | Store Local Descriptor Table | STC | Set Carry |
Local Descriptor Table(LDT)에 위치를 지정한 메모리에 저장 | 캐리 플래그를 1로 세트 | ||
STD | Set Direction Flag | STI | Set Interrupt Flag |
방향 플래그를 1로 세트 | 인터럽트 플래그를 1로 세트 | ||
STOS | Store String | STR | Store Task Register |
AL 혹은 AX의 내용을 ES:DI가 가리키고 있는 곳으로 저장 | 태스트 레지스터에 값을 읽어옴 | ||
SUB | Subtract | TEST | Test For Bit Pattern |
뺄셈을 수행함 | 두 오퍼랜드를 논리연산 AND를 한 후 결과에 따라서 플래그를 세트 | ||
XCHG | Exchange | XLAT/XLATB | Translate |
두 오퍼랜드의 값을 서로 바꿈 | DS:BX가 가리키는 값에 AL 레지스터 값만큼 더한 후 AL에 저장 | ||
XOR | Exclusive OR | ||
두 오퍼랜드에 논리 연산 XOR을 해줌 |
참고 : http://breath91.tistory.com/137
블로그의 정보
튜기's blogg(st1tch)
St1tch