#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 | 아무것도 하지 않는 명령어입니다. |