본문 바로가기
→ My Meta+IT/리버싱

어셈블리어/Assembly_2

by DigitalJobs 2022. 1. 14.

어셈블리어/Assembly_2

2. 어셈블리어(Assembly language)?

- 기계어와 11 대응되는 컴퓨터 프로그램의 저급 언어.

 

어셈블러(Assember)?

- 어셈블리어로 작성된 소스 코드를 기계어로 변환하는 프로그램.

 

어셈블리어 구조

CPU2진수로 모든 것을 처리하는데 어셈블리 명령어들도 2진수로 되어 있다.

하지만 2진수로 된 것은 알아보기가 힘들어 mov, add와 같은 형태로 변환하여 보여진다.

mov %eax %ebxC언어로 보면 ebx = eax의 경우와 같다.

eax에 저장된 값을 ebx에 할당한다.

 

어셈블리어 문법 
(Intel vs AT&T)
Intel 방식
- 가독성이 뛰어남.
- 윈도우 환경에서 구동.
- 오퍼랜드 위치 : mov dest, source
- 메모리 오퍼랜드 : mov [eax], [ebx]

AT&T 방식
- 가독성은 떨어짐.
- 리눅스 환경에서 구동
- 인텔 방식보다 좀 더 많은 정보를 포함하고 있음.
- '%', '$'가 붙음.
- 오퍼랜드 위치 : mov source, dest
- 메모리 오퍼랜드 : mov (%ebx), (%eax)
어셈블리어 명령어(Intel)
push : 스택에 저장
pop : 스택 가장 상위에 있는 값을 꺼내서 저장
mov : 메모리나 레지스터 값을 옮길 때 사용
lea : 주소값을 옮길 때 사용
inc : 1 증가
dec : 1 감소
add : 레지스터나 메모리의 값을 덧셈할 때 쓰임
sub : 레지스터나 메모리의 값을 뺄셈할 때 쓰임
call : 프로시져를 호출한다.
※ 프로시져 : 어떤 행동을 수행하기 위한 일련의 작업 순서 (함수라고 생각하면 될 듯)
ret : 호출했던 바로 다음 지점으로 이동
cmp : 레지스터와 레지스터 값을 비교
nop : 아무 동작도 하지 않는다(No Operation)
jmp : 특정한 곳으로 분기

unsigned jump

(=)

je : jump equal

jne : jump not equal

jz : jump zero

jnz : jump not zero 

 

(>)

ja : jump above

jae : jump above or equal

jna : jump not above

jnae : jump not above or equal

 

(<)

jb : jump below

jbe : jump below or equal

jnb : jump not below

jnbe : jump not below or equal

 

signed jump

(>)

jg : jump greater

jge : jump greater or equal

jng : jump not greater

jnge : jump no greater or equal

 

(<)

jl : jump less

jle : jump less or equal

jnl : jump not less

jnle : jump not less or equal

 

 

 

-----------------JMP 세부설명-----------------

 

JL(Jump if Less) = (SF!=0F) 비교 결과가 작으면 점프.

 

JLE(Jump if Less or Equal) = (ZF=1 or SF!=0F) 비교 결과가 작거나 같으면 점프.

 

JNE(Jump if Not Equa) = (ZF=0) 비교 결과가 다르면 점프.

 

JNB(Jump if Not Below) = (CF=0) 비교 결과가 크거나 같으면(아래가 아니면) 점프.

 

JBE(Jump if (unsigned) below or Equal) CF=1 or ZF=1

 

JB(Jump if Below) = (a < b) 의 피연산자의 값이 클 경우 점프

 

JA(Jump if Above) = (a > b) 의 피연산자의 값이 클 경우 점프 (CF=0 and ZF=0)

 

JG(Jump if Greater) = (a > b) 왼쪽 인자의 값이 오른쪽 인자의 값보다 크면 점프 (ZF=0 and SF=0F)

 

----PUSH & POP----

 

PUSHFD = 플래그 레지스터를 스택에 저장

 

PUSHAD = 모든 레지스터를 스택에 저장.

 

POPAD = PUSHAD로 저장된 레지스터를 모두 복원

 

POPFD = 스택에서 플래그 레지스터 복원

 

PUSHA,POPA : 16bit 버전

 

----------------------------

 

CLI = 인터럽트 플래그를 0으로 만든다. (인터럽트 무시)

 

STI = 인터럽트 플래그를 1로 만든다. (인터럽트 허용)

 

본 포스팅이 도움이 되셨다면, 글안에 삽입된 광고에 클릭 한 번 부탁드립니다.^^

댓글