기계어는 0과 1로 이루어져 있있다.
이를 사람이 이해하는 것은 어려운 일이었습니다.
David Wheeler는 어셈블리 언어와 어셈블러를 고안하여 이 문제를 해결했습니다. 어셈블리 언어는 사람이 이해하기 쉬운 형태로 작성된 프로그래밍 언어이며, 어셈블러는 이를 기계어로 변환해주는 도구입니다.
어셈블리 언어는 컴퓨터의 기계어와 치환되는 언어입니다. 이는 기계어가 여러 종류라면 어셈블리어도 여러 종류여야 함을 의미합니다.
각 아키텍처마다 해당하는 어셈블리어가 존재합니다. 이로써 x86, x86-64, ARM, MIPS 등의 다양한 ISA에 대응하는 어셈블리어가 존재합니다.
데이터 이동(Data Transfer)
mov 값 대입,
lea 주소 대입
산술 연산(Arithmetic)
inc 1 더함
dec 1 뺌,
add 더하기,
sub 빼기
논리 연산(Logical)
and, or, xor, not
비교(Comparison)
cmp, test
분기(Branch)
jmp 그냥 이동,
je 값이 같으면 이동,
jg 값이 크면 이동
스택(Stack)
push 최상단에 쌓기,
pop 최상단에 값을 넣고 더하기
프로시져(Procedure)
call 호출,
ret 호출자의 실행 흐름으로 돌아가기,
leave 스택 프레임 정리
시스템 콜(System call)
syscall 커널에게 필요한 동작 요청