하지만 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)