어셈블리어/Assembly_2
2. 어셈블리어(Assembly language)란?
- 기계어와 1대1 대응되는 컴퓨터 프로그램의 저급 언어.
어셈블러(Assember)란?
- 어셈블리어로 작성된 소스 코드를 기계어로 변환하는 프로그램.
어셈블리어 구조
CPU는 2진수로 모든 것을 처리하는데 어셈블리 명령어들도 2진수로 되어 있다.
하지만 2진수로 된 것은 알아보기가 힘들어 mov, add와 같은 형태로 변환하여 보여진다.
mov %eax %ebx는 C언어로 보면 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로 만든다. (인터럽트 허용)
본 포스팅이 도움이 되셨다면, 글안에 삽입된 광고에 클릭 한 번 부탁드립니다.^^
'→ My Meta+IT > 리버싱' 카테고리의 다른 글
어셈블리어/Assembly_5_실습 (0) | 2022.01.14 |
---|---|
어셈블리어/Assembly_4_Break Point(브레이크 포인트) (0) | 2022.01.14 |
어셈블리어/Assembly_3_엔디언 (0) | 2022.01.14 |
어셈블리어/Assembly_1 (0) | 2022.01.14 |
댓글