Assembly instructions(80x86, Intel)

       Basic instruction
mov
;mov dest, src
mov al, [L1] ; AL(reg)에 L1에 위치한 데이터를 대입
mov al, L1 ; AL(reg)에 L1이 위치한 바이트 주소 대입
mov eax,$+7 ; eax=현재주소+7
movzx eax, ax ;ax를 eax로 확장(for unsigned)
movsx eax, ax ;ax를 eax로 확장(for signed)
cmp
cmp vleft, vright ;vleft-vright 결과값의 형태에 따라서 flag에 저장
    arithmetic
add eax, 4
sub bx, 10
inc ecx ;ecx++
dec dl ;dl—
;mul dest,source ;multiply for unsigned
;imul dest,source ;multiply for signed
;div dest,source ;divide for unsigned
;idiv dest,source ;divide for signed
;EDX:EAX + EBX:ECX
add eax, ecx ;하위 32비트를 더한다.
adc edx, ebx ;상위 32비트와 이전의 덧셈에서의 캐리를 더한다.
;EDX:EAX - EBX:ECX
sub eax, ecx ;하위 32비트를 뺀다.
sbb edx, ebx ;상위 32비트를 빼고 받아 내림을 한다.
;EDX:DAX */
mul eax ;edx:eax=eax*eax
div ebx ;edx=edx:eax%ebx
clc ;clear carryflag
    shift
logic shift
shl ax,1
shr ax,1
arithmetic shift
sal ax,1
sar ax,1
rotation shift
rol ax,1
ror ax,1
        preproccesor
equal
symbol equ value ;symbol에 value 값 대입, 상수 처리(변경 불가)
define
%define SIZE 100 ;same as '#define SIZE 100’ in C/C++
        data instruction
db, dw, dd, dq, dt
L1 db 0
L2 dw 1000
L3 dd 11010b ;L3로 라벨 붙여진 더블 워드가 2진수 11010으로 초기화
resb, resw, resd, resq, rest
L1 resb 1 ;L1로 라벨 붙혀진 초기화 되지 않은 1 바이트
L2 times 100 db 0 ;이는 100개의 db 0을 나열한 것과 같음
L3 resw 100 ;100개의 워드를 위한 공간 정의(초기화 X)
    stack
push, pop
subprogram_label:
push ebp
mov ebp, esp
;
;subprogram code
;
pop ebp
ret
pusha,popa
80x86에서는
PUSHA와 POPA 명령을 이용하여,
EAX, EBX, ECX, EDX, ESI, EDI, EBP 레지스터의 값들을 모두 스택에 push 할 수 있게 한다.
CALL, RET
call subprogram_label
;
ret
subprogram_label 다음 코드 주소를 push한 후 분기
ret은 분기하기 전에 저장한 다음 코드 주소로 jmp
ENTER,LEAVE
enter 0,0 ;c 호출 규약에서는 첫번째 피연산자 바이트 크기
; ; 두번째 피연사자는 항상 0
leave
stack fram일을 처리하는 코드
EXTERN, GLOBAL
externd을 통해 외부의 모듈의 global 라벨들을 사용할 수 있다.
global get_int, print_sum
extern get_int, print_sum
LEA
lea eax,[ebp-8]
위 코드는 'ebp-8’의 주소를 가지고 eax에 전달하여 준다.
( [ebp-8]이 'ebp-8’의 값을 가르키는 것이 아니다. LEA 명령은 절대로 메모리를 읽어드리지 않는다.
  오직 다른 명령이 읽어들일 주소값을 계산하고, 이를 첫 번째 레지스터 피연산자에 저장할 뿐이다.
  따라서 별도로 메모리 크기를 지정할 필요가 없다. )
SETxx
setxx 명령은 특별한 경우에서 분기를 이용하지 않을 수 있는 방법을 제공한다.
setxx는 FLAGS의 상태에 따라 바이트 레지스터나 메모리의  값을 0 or 1 로 바꾸어 준다.
SETxx의 조건이 참이라면 그 결과는 1, 거짓이면 0이 저장된다.
setz al ;Z플래그가 세트 되어있으면 1, 아니면 0이 al에 저장
CMC
Complement Carry Flag, CF값을 1의 보수로 바꾸어 주는 명령어
CF값이 1이면 0으로, 0이면 1로 바꾸는 코드이다.
CBW CWD CDQ
C는 convert를 B W D Q 는 Byte Word Dword Qword를 의미한다.
CBW같은 경우 Convert Byte to Word로
부호가 있는 비트정보를 확장할 때 사용한다.

CBW - AL의 데이터를 AX로 확장한다.

CWD - AX의 데이터를 DX : AX에 걸쳐 저장한다.

CDQ - EAX의 데이터를 EDX : EAX에 걸쳐 저장한다.

CWD를 DX:AX로 확장할 필요가 없지 CWD는 16비트 때부터 있던 명령어로
그때 사용하던 방법이 x86까지 그대로 이용되는 것이다.