튜기's blogggg

혼동되는 어셈블리 명령어

by St1tch

NEG : 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

활동하기