#include <stdio.h>
int main(){
printf("Hello World!");
}
mov eax, 1
push eax
push DWORD "Hello World!"
call printf
1101010101101010101011010101010101
어셈블리어는 정해진 표준이 없기 때문에 여러 종류의 문법이 있습니다. 대표적으로 AT&T
문법과 Intel
문법이 있습니다.
Opcode Operand1, Operand2
Source를 Destination에 연산하게 되는데 두 문법은 이 순서가 반대입니다.
주로
Intel
문법을 사용합니다.
32bit | 16bit | 64bit | 풀네임 | 뜻 |
---|---|---|---|---|
EAX | AX | RAX | Extended Accumulator Register | 누산기(Accumulator)라 불리고, 산술 연산에서 중간 결과값이 저장되며 최종 리턴값이 누산되어 저장된다. |
EBX | BX | RBX | Extended Base Register | 산술 연산에 사용되지만 리턴값이 저장되지 않는다 |
ECX | CX | RCX | Extended Counter Register | 반복문의 인덱스와 같은 레지스터, 숫자가 역순으로 줄어든다 |
EDX | DX | RDX | Extended Data Register | EAX, ECX, EBX가 부족하면 사용하는 여분의 레지스터 |
ESI | Extended Source Index | 메모리를 옮기거나 복사할 때 소스의 데이터가 복사된다 | ||
EDI | Extended Destination Index | 복사할 때 목적지의 데이터가 복사된다 | ||
EBP | Extended Base Pointer | StackFrame의 시작지점 주소 | ||
ESP | Extended Stack Pointer | StackFrame의 종료지점 주소 |
인텔 문법 기준입니다.
명령어 | 뜻 |
---|---|
MOV | |
LEA | MOV와 같지만, MOV는 값을 저장하고 LEA는 주소를 저장합니다. |
ADD/SUB | Operand2를 Operand1에 더하고 빼는 연산을 합니다. |
INC/DEC | 1을 더하고 빼는 연산을 수행 합니다. |
CMP | 두 Operand를 비교합니다. |
CALL | 함수를 호출하는 명령입니다. |
RET | CALL로 호출된 함수를 종료하고 CALL 다음 명령줄로 이동합니다. |
NOP | 아무것도 하지 않는 명령어입니다. |