🔔 사칙연산이란?

  • 컴퓨터가 가장 많이 수행하는 연산 (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
  • al에 1 더함 → 결과 출력 → 줄바꿈

레지스터 + 메모리

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
  • 반환값 0 설정 후 종료

7️⃣ 초기화되지 않은 데이터 (num 선언)

section .bss
num resb 1
  • num 변수 1바이트 예약 (초기화되지 않음)

💡 사칙연산 요점 정리

연산 종류명령어결과 저장
덧셈add첫 번째 피연산자에 저장
뺄셈sub첫 번째 피연산자에 저장
곱셈mul결과는 ax/dx에 저장
나눗셈div몫은 al/ax, 나머지는 ah/dx에 저장

📌 연산자별 피연산자 규칙

첫 번째두 번째가능 여부
레지스터상수
레지스터레지스터
레지스터메모리
메모리상수✅ (크기 지정 필수)
메모리레지스터
메모리메모리

🌱 메모리 연산 핵심 규칙

  1. 메모리 접근 시 반드시 대괄호 [] 사용
    • add al, [num] (O)
    • add al, num (X) — 주소로 인식되어 에러
  2. 메모리+상수 연산 시 크기 지정 필수
    • add [num], byte 1 (O)
    • add [num], 1 (X)

💥 mul과 div는 무조건 ax 기반

연산명연산 대상결과 저장
mul blal * blax
mul bxax * bxdx:ax
div blax ÷ bl몫=al, 나머지=ah
div bxdx:ax ÷ bx몫=ax, 나머지=dx

✅ 전체 흐름 요약

  1. 사용자 입력 받기
  2. 5가지 형태의 덧셈 연습
  3. 곱셈 연습
  4. 나눗셈 연습
  5. 결과 모두 출력
  6. 프로그램 종료

🏁 디버그 시 확인 포인트

  • 레지스터 값 변화 확인 (Ctrl+R)
  • 메모리 값 변화 확인 (Ctrl+M)
  • BreakPoint 걸고 F5 디버깅
  • Step Over(F10), Step Into(F11)로 실행 흐름 파악

📖 헬퍼 매크로 정리

매크로명설명
GET_DEC10진수 입력 받기
PRINT_DEC10진수 출력
NEWLINE줄바꿈 출력

profile
李家네_공부방

0개의 댓글