🔔 사칙연산이란?
- 컴퓨터가 가장 많이 수행하는 연산 (ADD, SUB, MUL, DIV)
- 어셈블리어에서 직접 연산을 수행할 때는 "레지스터", "메모리", "상수" 조합을 정확히 알아야 한다.
📂 전체 예제 코드와 설명
%include "io64.inc" ; 입출력 매크로 포함 (SASM 전용)
- SASM에서 제공하는 입출력 도우미 매크로 모음
GET_DEC, PRINT_DEC, NEWLINE 같은 매크로가 정의되어 있음
1️⃣ 텍스트 섹션과 진입점 설정
section .text
global main
main:
mov rbp, rsp ; 스택 프레임 설정 (디버깅 편의를 위해)
.text: 실행코드 섹션
global main: 프로그램 진입점 지정
mov rbp, rsp: 디버깅 및 스택 관리 편의를 위해 프레임 포인터 설정
2️⃣ 사용자 입력 받기 (GET_DEC 매크로 활용)
GET_DEC 1, al ; 사용자 입력 → al (1바이트)
GET_DEC 1, num ; 사용자 입력 → num (1바이트 메모리 변수)
- 첫 번째 입력은 al에, 두 번째 입력은 num에 저장
3️⃣ 덧셈 연산 5종류 연습
레지스터 + 상수
add al, 1
PRINT_DEC 1, al
NEWLINE
레지스터 + 메모리
add al, [num]
PRINT_DEC 1, al
NEWLINE
- al에 num 값 더함 → 결과 출력 → 줄바꿈
레지스터 + 레지스터
mov bl, 3
add al, bl
PRINT_DEC 1, al
NEWLINE
- bl에 3 저장 후 al과 더함 → 결과 출력 → 줄바꿈
메모리 + 상수
add [num], byte 1
PRINT_DEC 1, [num]
NEWLINE
- num 값에 1 더함 → 결과 출력 → 줄바꿈
메모리 + 레지스터
add [num], al
PRINT_DEC 1, [num]
NEWLINE
- num에 al 값 더함 → 결과 출력 → 줄바꿈
4️⃣ 곱셈 연습 (MUL)
mov ax, 0 ; 곱셈 전 ax 초기화
mov al, 5 ; 피연산자 1
mov bl, 8 ; 피연산자 2
mul bl ; al * bl 수행 → 결과는 ax에 저장
PRINT_DEC 2, ax ; ax 전체 출력 (16비트 결과)
NEWLINE
- 결과는 ax (al: 하위 8비트, ah: 상위 8비트)에 저장
- 5 * 8 = 40 출력
5️⃣ 나눗셈 연습 (DIV)
mov ax, 100 ; 나눗셈 대상 값
mov bl, 3 ; 나눌 값
div bl ; ax ÷ bl 수행
PRINT_DEC 1, al ; 몫 출력
NEWLINE
- ax ÷ bl 수행
- 몫은 al에 저장, 나머지는 ah에 저장
- 결과: 몫 33 출력
나머지 출력
mov al, ah
PRINT_DEC 1, al ; 나머지 출력
- ah에 저장된 나머지를 al로 옮긴 뒤 출력 (PRINT_DEC는 ah 직접 출력 불가)
6️⃣ 마무리 (반환 및 종료)
xor rax, rax
ret
7️⃣ 초기화되지 않은 데이터 (num 선언)
section .bss
num resb 1
- num 변수 1바이트 예약 (초기화되지 않음)
💡 사칙연산 요점 정리
| 연산 종류 | 명령어 | 결과 저장 |
|---|
| 덧셈 | add | 첫 번째 피연산자에 저장 |
| 뺄셈 | sub | 첫 번째 피연산자에 저장 |
| 곱셈 | mul | 결과는 ax/dx에 저장 |
| 나눗셈 | div | 몫은 al/ax, 나머지는 ah/dx에 저장 |
📌 연산자별 피연산자 규칙
| 첫 번째 | 두 번째 | 가능 여부 |
|---|
| 레지스터 | 상수 | ✅ |
| 레지스터 | 레지스터 | ✅ |
| 레지스터 | 메모리 | ✅ |
| 메모리 | 상수 | ✅ (크기 지정 필수) |
| 메모리 | 레지스터 | ✅ |
| 메모리 | 메모리 | ❌ |
🌱 메모리 연산 핵심 규칙
- 메모리 접근 시 반드시 대괄호
[] 사용
add al, [num] (O)
add al, num (X) — 주소로 인식되어 에러
- 메모리+상수 연산 시 크기 지정 필수
add [num], byte 1 (O)
add [num], 1 (X)
💥 mul과 div는 무조건 ax 기반
| 연산명 | 연산 대상 | 결과 저장 |
|---|
| mul bl | al * bl | ax |
| mul bx | ax * bx | dx:ax |
| div bl | ax ÷ bl | 몫=al, 나머지=ah |
| div bx | dx:ax ÷ bx | 몫=ax, 나머지=dx |
✅ 전체 흐름 요약
- 사용자 입력 받기
- 5가지 형태의 덧셈 연습
- 곱셈 연습
- 나눗셈 연습
- 결과 모두 출력
- 프로그램 종료
🏁 디버그 시 확인 포인트
- 레지스터 값 변화 확인 (Ctrl+R)
- 메모리 값 변화 확인 (Ctrl+M)
- BreakPoint 걸고 F5 디버깅
- Step Over(F10), Step Into(F11)로 실행 흐름 파악
📖 헬퍼 매크로 정리
| 매크로명 | 설명 |
|---|
| GET_DEC | 10진수 입력 받기 |
| PRINT_DEC | 10진수 출력 |
| NEWLINE | 줄바꿈 출력 |