2진수 

  • 기수(base)가 2인 수 체계를 말한다.
  • 사용 가능한 수는 0과 1 이다.

16진수

  • 기수(base)가 16인 수 체계를 말한다.
  • 사용 가능한 수는 0 ~ 9, A ~ F ( A = 10, F = 15 )

 

2진수 -> 16진수 변환 방법

  1. 2진수를 오른쪽부터 4자리씩 끊어서 그룹으로 묶는다.
  2. 각 4자리 그룹을 10진수로 바꾼 뒤, 해당하는 16진수로 변환한다.

예제 

2진수: 10110111

1. 4자리씩 나누기:      1011   0111
2. 각각 10진수로:        11     7
3. 16진수로 변환:        B      7

=> 결과: 0xB7

 

16진수 -> 2진수 변환 방법

각 16진수 자릿수를 개별적으로 2진수 4자리로 변환한다.

예제

16진수: 9A

1. '9' → 1001
2. 'A' (10) → 1010

결과: 0b10011010

 

16진수 <-> 2진수 매핑 테이블

16진수 2진수
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

 

'언어 > C' 카테고리의 다른 글

[C] 컴퓨터 덧셈 ( 반가산기, 전가산기 )  (0) 2025.04.23
[C] 게이트 회로  (0) 2025.04.23

반가산기

반가산기

반 가산기는 2개의 2진수  A,B 논리변수를 더하여 합(SUM)과 캐리(Carry)를 산출하기 위한 조합 논리회로다.

  • 입력 받을 수 있는 수는 A, B 2가지 각각 0 또는 1을 입력한다.
  • 2진수 1 + 1은 2진수 10(2)다.
  • A가 1, B가 1이면 XOR 연살결과 S는 0이다.
  • 동시에 A가 1, B가 1이면 AND 연산결과 C는 1이다. 이 1은 자리올림을 나타낸다.

🔷 반가산기 진리표

A B S C
0 0 0 0
0 1 1 0
1 0 1 0
1 1 0 1

 

보통 4비트씩 묶어서 계산하기 때문에 반가산기만으로는 덧셈을 온전히 처리할 수 없다.

3자리 이상부터 자리 올림이 발생하면, 총 3가지의 수가 입력되어야하는데 반가산기는 2개의 입력만 받을 수 있기 때문이다.


전가산기

전가산기

컴퓨터 내부에서 여러 비트로 된 두 수를 더할 때 두 비트에서 더해진 결과인 캐리(Carry)는 더 높은 자리의 두 비트의 덧셈에 추가되어 더해진다. 이때, 아래 자릿수에서 발생한 캐리까지 포함하여 세 비트를 더하는 논리회로를 전가산기라고 한다.

전가산기는 3개의 입력을 받을 수 있다.

 

🔷 전가산기 진리표

A B Cin S Cout
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1

 

'언어 > C' 카테고리의 다른 글

[C] 2진수, 16진수 변환  (0) 2025.04.23
[C] 게이트 회로  (0) 2025.04.23
게이트 회로는 디지털 논리 회로의 기본 구성 요소로, 전기 신호의 논리적 연산을 수행하는 장치를 말한다.

 

🔹 게이트 회로의 기본 개념

게이트 회로는 논리 게이트를 기반으로 하며, 이들은 불 대수를 구현한다.

입력 값은 0 또는 1이며, 출력 값도 0 또는 1이다.

 

🔹 주요 논리 게이트 종류

  1. AND 게이트
    • 입력 신호가 모두 1일 때만 출력이 1이 된다.
    • A & B
  2. OR 게이트
    • 입력 중 하나라도 1이면 출력이 1이 된다.
    • A | B
  3. XOR 게이트
    • 입력이 다를 경우에만 출력이 1이 된다.
    • A^B
  4. NOT 게이트
    • 입력을 반전시킨다. 입력이 0이면 출력이 1, 입력이 1이면 출력이 0이 된다.
    • !A

 

출처 : https://devraphy.tistory.com/290

'언어 > C' 카테고리의 다른 글

[C] 2진수, 16진수 변환  (0) 2025.04.23
[C] 컴퓨터 덧셈 ( 반가산기, 전가산기 )  (0) 2025.04.23

x86-64( =x64 ) 아키텍처에서 사용하는 64비트 범용 레지스터는 다음과 같다.

 

레지스터 역할 및 설명
RAX 누산기 레지스터, 산술 및 I/O 연산
RBX 베이스 레지스터, 특정 주소 저장
RCX 카운터 레지스터, 루프 및 반복 연산
RDX 데이터 레지스터, 곱셈 / 나눗셈 연산
RSI 소스 인덱스, 문자열 연산시 사용
RDI 목적지 인덱스, 문자열 연산 시 사용
RBP 베이스 포인터, 스택 프레임 관리
RSP 스택 포인터, 현재 스택 주소
R8 추가적인 범용 레지스터
R9 추가적인 범용 레지스터
R10 추가적인 범용 레지스터
R11 추가적인 범용 레지스터( 일반적으로 임시 저장 용도 )
R12 추가적인 범용 레지스터
R13 추가적인 범용 레지스터
R14 추가적인 범용 레지스터
R15 추가적인 범용 레지스터

 

📌 64비트 레지스터 설명

🌙 연산용 레지스터

🔹 RAX (누산기, Accumulator Register)

  • 산술 연산, I/O 연산, 곱셈/나눗셈 연산에서 기본적으로 사용된다.
  • 함수 호출 시 리턴 값을 저장하는 역할 ( return 값 저장 )

🔹 RBX (누산기, Accumulator Register)

  • 데이터를 저장하는 역할을 하며, 메모리 접근 시 특정 값 저장 가능

🔹 RCX (카운터 레지스터, Counter Register)

  • 루프 및 반복문에서 주로 사용된다.
  • LOOP 명령어에서 반복 횟수를 저장하는 역할을 한다.

🔹 RDX (데이터 레지스터, Data Register)

  • 곱셈/나눗셈 연산에서 사용된다.

 

🌙 메모리 및 스택 관련 레지스터

🔹 RBP (베이스 포인터, Base Pointer)

  • 함수 호출 시 스택 프레임 관리
  • 지역 변수 및 함수 매개변수 접근

🔹 RSP (스택 포인터, Stack Pointer)

  • 현재 스택의 최상위 주소를 가리킨다.
  • 푸시( PUSH ), 팝( POP ) 연산에 사용한다.

 

🌙 문자열 연산

🔹 RSI (소스 인덱스, Source Index)

  • 메모리 복사 시 소스 주소를 저장한다.

🔹 RDI (목적지 인덱스, Destination Index)

  • 메모리 복사 시 목적지 주소를 저장한다.

예제

MOV RSI, source ; 소스 주소
MOV RDI, dest ; 목적지 주소
MOV RCX, length ; 복사할 길이
REP MOVSB ; 바이트 단위로 복사

 

x86 아키텍처에서 사용하는 16비트 범용 레지스터는 다음과 같다.

 

레지스터 설명
AX 누산기, 연산 및 함수 호출 반환값을 저장
BX 베이스, 주소 계산 및 메모리 접근
CX 카운터, 루프 반복 횟수를 저장
DX 데이터, 입출력 및 곱셉 / 나눗셈 연산
SI 소스, 문자열 및 배열 연산
DI 목적지, 문자열 및 배열 연산
BP 베이스 포인터, 스택 프레임 관리
SP 스택 포인터, 현재 스택 위치

 

📌 레지스터의 하위 부분

각 16비트 레지스터는 8비트 단위( AH/AL, BH/BL 등 )로 나뉘어 사용 가능하다.

🔹 AX( 16비트 ) 기준 하위 레지스터 구조

AX ( 16비트 ) = [ 상위 8비트( AH ) | 하위 8비트 ( AL ) ]
  • AX = 누산기 레지스터 전체
  • AH = AX의 상위 8비트
  • AL = AX의 하위 8비트

⭐ 예제( AX를 8비트로 조작 )

MOV AX, 0x1234 ( AX = 0x1234 )
MOV AH, 0x56 ( AH만 변경 ▶ AX = 0x5634 )
MOV AL, 0x78 ( AL만 변경 ▶ AX = 0x5678 )

 

➡️ AX를 8비트 단위로 조작하여 메모리를 절약 가능하다.

 

📌 16비트 레지스터 설명

🌙 연산 및 데이터 관련 레지스터

🔹 AX ( Accumulator, 누산기 레지스터 )

  • 산술 및 논리 연산에서 기본적으로 사용한다
  • I/O 연산, 함수 호출 반환 값을 저장한다.
  • 곱셈( MUL ), 나눗셈( DIV ) 연산에 사용한다.

⭐ 예제 ( AX를 활용한 덧셈 )

MOV AX, 5
ADD AX, 3 ( AX = 5 + 3 = 8 )

 

🔹 BX ( Base Register, 베이스 레지스터 )

  • 메모리 주소 저장
  • 주소 지정에서 베이스 값으로 활용한다.

⭐ 예제 ( 메모리 주소 지정 )

MOV BX, 0x1000 ( 메모리 주소 0x1000을 BX에 저장 )
MOV [BX], AX ( BX가 가리키는 메모리 주소에 AX 값 저장 )

 

🔹 CX ( Counter Register, 카운터 레지스터 )

  • 루프( LOOP ) 및 반복 연산에서 사용한다.
  • 비트 시프트( Shift ) 연산에도 사용한다.

⭐ 예제 ( CX를 활용한 루프 연산 )

MOV CX, 10 ( CX = 10 ( 루프 반복 횟수 지정 )
LOOP_START :
DEX CX ( CX = CX - 1 )
JNZ LOOP_START ( CX가 0이 아니면 루프 반복 )

 

🔹 DX ( Data Register, 베이스 레지스터 )

  • 입출력 포트 접근에 사용한다. ( IN / OUT 명령어 )
  • 곱셈( MUL), 나눗셈( DIV ) 연산 시 사용한다.

⭐ 예제( DX를 활용한 곱셈 연산 )

MOV AX, 5 
MOV DX, 3
MUL DX ( AX = AX * DX ( 5 * 3 = 15 )

 

🌙 문자열 및 메모리 연산 레지스터

🔹 SI ( Source Index, 소스 인덱스 레지스터 )

  • 문자열 복사 및 메모리 접근 시 소스 주소로 사용한다.

🔹 DI ( Destination Index, 목적지 인덱스 레지스터 )

  • 문자열 복사 및 메모리 접근 시 목적지 주소로 사용한다.

 

🌙 스택 관련 레지스터

🔹 BP ( Base Pointer, 베이스 포인터 레지스터 )

  • 스택 프레임을 관리 한다.
  • 함수 호출 시 지역 변수 및 매개변수 접근에 사용한다.

🔹 SP ( Stack Pointer, 스택 포인터 레지스터 )

  • 스택의 현재 위치를 가리킨다.
  • PUSH, POP 연산 시 사용한다.

⭐ 예제( 스택 조작 )

PUSH AX ( AX 값을 스택에 저장 ( SP 감소 )
POP BX ( 스택에서 값을 가져와 BX에 저장 ( SP 증가 )

 

 

✅ 16비트 레지스터는 과거 x86 프로세스에서 사용되었고, 현재는 32비트 / 64비트 레지스터로 확장되었다.

✅ 부트로더, 운영체제 커널, 레거시 코드에서 사용되기 때문에 알아둘 필요는 있다.

MOV 명령어는 어셈블리어에서 가장 기본적인 명령어 중 하나다.
데이터를 한 위치에서 다른 위치로 복사하는 역할을 한다.
일반적으로 레지스터 간, 메모리와 레지스터 간, 값과 레지스터 간 데이터 이동에 사용된다.

 

📌 MOV 명령어 기본 형식

MOV 대상, 소스
  • 대상( Destination ) : 데이터를 저장할 위치 ( 레지스터 또는 메모리 )
  • 소스( Source ) : 데이터를 제공하는 위치 ( 레지스터, 메모리, 값 )

📌 MOV 명령어 사용 예시

1️⃣ 레지스터 간 데이터 이동

MOV EAX, EBX ( EBX 레지스터 값을 EAX 레지스터로 복사 )
MOV EDX, ECX ( ECX 레지스터 값을 EDX 레지스터로 복사 )

 

같은 크기의 레지스터끼리만 이동할 수 있다.

 

2️⃣ 값을 레지스터에 저장

MOV EAX, 1 ( EAX에 1을 저장 )
MOV EBX, 2 ( EBX에 2를 저장 )

 

값은 직접 레지스터에 저장할 수 있다.

 

3️⃣ 메모리에서 레지스터로 데이터 이동

MOV EAX, [1234h] ( 메모리 주소 1234h의 값을 EAX에 저장 )
MOV EBX, [ESI] ( ESI 레지스터가 가리키는 메모리 값을 EBX에 저장 )

 

4️⃣ 레지스터에서 메모리로 데이터 이동

MOV [1234h], EAX ( EAX 값을 메모리 주소 1234h에 저장 )
MOV [EDI], ECX ( ECX 값을 EDI가 가리키는 메모리에 저장 )

 

📌 MOV 명령어 사용 시 주의할 점

❌ 메모리에서 메모리로 직접 데이터 이동 불가

MOV [1234h], [5678h] ( 오류 )

 

메모리에서 메모리로 직접 이동하는 명령은 지원되지 않는다.

레지스터를 경유해야 한다.

MOV EAX, [5678h] ( 먼저 메모리 값을 EAX로 이동 )
MOV [1234h], EAX ( EAX 값을 다른 메모리에 저장 )

 

📌 정리 

  • MOV는 데이터를 복사하는 명령어이며 원본 값은 변하지 않는다.
  • 레지스터 ↔ 레지스터, 레지스터 ↔ 메모리, 값 ↔ 레지스터 이동이 가능하다.
  • 메모리 ↔ 메모리 이동은 직접 수행할 수 없고, 반드시 레지스터를 경유해야 한다.

x86 아키텍처에서 사용하는 32비트 범용 레지스터는 다음과 같다.

 

레지스터 용도 및 특징
EAX 누산기 역할, 연산 결과 저장, 반환값 저장
EBX 베이스 레지스터, 상대 주소 계산에 사용
ECX 카운터 레지스터, 루프 및 반복 연산에 사용
EDX 데이터 레지스터, 입출력 연산 및 곱셈 / 나눗셈 결과 저장
ESI 문자열 및 메모리 연산에서 소스 주소로 사용
EDI 문자열 및 메모리 연산에서 목적지 주소로 사용
EBP 스택 프레임의 기준이 되는 베이스 포인터
ESP 스택의 현재 위치를 가리키는 스택 포인터

 

1️⃣ EAX ( 누산기, Accumulator Register ) ( AX 2개로 구성 )

  • 연산( 덧셈, 곱셈 등 ) 결과를 저장하는 기본 레지스터
  • MUL, DIV 연산에서 사용된다.
  • 함수 호출 시 반환 값을 저장한다.

2️⃣ EBX ( 베이스 레지스터, Base Register )

  • 상대 주소 계산에 사용한다.
  • 데이터를 저장하는 일반적인 용도로도 사용 가능하다.

3️⃣ ECX ( 카운터 레지스터, Counter Register )

  • 루프에서 반복 횟수를 저장한다.
  • 시프트 연산에서 이동 횟수를 지정한다.

4️⃣ EDX ( 데이터 레지스터, Data Register )

  • MUL, DIV 연산에서 EAX와 함께 사용된다
  • 입출력 연산에서 포트 번호를 지정한다.

5️⃣ ESI ( 소스 인덱스, Source Index Register )

  • 문자열 및 메모리 연산에서 소스 주소로 사용된다.
  • 반복적인 데이터 이동을 수행한다.

7️⃣ EDI ( 목적지 인덱스, Destination Index Register )

  • 문자열 및 메모리 연산에서 목적지 주소로 사용된다.
  • 반복적인 데이터 저장을 수행한다.

7️⃣ EBP ( 베이스 포인터, Base Pointer )

  • 함수 호출 시 스택 프레임의 기준 주소를 저장한다.
  • 지역 변수 및 함수 매개변수 접근에 사용한다. ( [EBP + offset] )

8️⃣ ESP ( 스택 포인터, Stack Pointer )

  • 현재 스택의 최상단을 가리킨다.
  • 함수 호출( CALL )과 리턴( RET )에서 자동으로 조정된다.
  • PUSH, POP 명령어 사용 시 값이 변경된다.

 

 

 

컴퓨터의 기계어와 고급 언어 사이의 중간 단계에 해당하는 프로그래밍 언어다.
기계어는 컴퓨터가 직접 이해하고 실행할 수 있는 0과 1로 이루어진 바이너리 코드이지만,
이를 사람이 작성하기는 매우 어렵다. 반면, 고급 언어는 사람이 이해하기 쉽고, 여러 추상화가 되어 있어 프로그램을 작성하는 데 편리하다.

 

📌 어셈블리어의 특징

1️⃣ 저수준 언어

  • CPU의 명령어와 직접적으로 대응되며, 하드웨어를 세밀하게 제어할 수 있다.

2️⃣ 빠른 실행 속도

  • 고급 언어 보다 컴파일 과정 없이 직접 기계어로 변환되므로 속도가 빠르다.

3️⃣ 하드웨어 의존적

  • 특정 CPU( 예: x86, ARM 등 ) 아키텍처에 맞춰 작성되며, 다른 CPU에서는 동작하지 않는다.

4️⃣ 어셈블러( Assembler ) 필요

  • 어셈블리어 코드를 기계어로 변환하려면 어셈블러( Assembler )가 필요하다. ( 예: MASM, NASM )

📌 어셈블리어 기본 구조

어셈블리어 코드는 기본적으로 세 가지 섹션으로 나뉜다.

1️⃣ 데이터 섹션( .data )

  • 프로그램에서 사용할 변수나 상수를 정의한다.

2️⃣ 코드 섹션( .text )

  • 실제 실행될 명령어가 포함된 부분이다.

3️⃣ 스택 섹션( .bss )

  • 초기화되지 않은 데이터를 저장하는 공간이다.

+ Recent posts