도카이트

[HawkIS] 어셈블리어로 문자열 출력하기 본문

낙서장

[HawkIS] 어셈블리어로 문자열 출력하기

dodoh4t 2023. 1. 8. 19:25
728x90
반응형

[기초 사전학습] - CPU 구성 및 레지스터의 종류와 용도

어셈블리어

  • CPU의 Instruction을 직접 사용
  • 하드웨어 의존적

CPU 구성

  • 연산 장치(ALU, Arithmetic and Logic Unit)
  • 제어 장치(Control Unit)
  • 레지스터(Register)

연산 장치

  • 내부장치
    • 가산기 : 덧셈 연산 수행
    • 보수기 : 뺄셈 연산 수행, 1의 보수나 2의 보수 방식
    • 시프터 : 비트를 오른쪽이나 왼쪽으로 이동해 나눗셈과 곱셈 수행
  • 관련 레지스터
    • 누산기 : 연산의 중간 결과 저장
    • 데이터 레지스터 : 연산에 사용할 데이터 저장
    • 상태 레지스터 : 연산 실행 결과로 나타나는 양수와 음수, 자리올림, 오버플로 상태 기억

제어 장치

  • 내부장치
    • 명령 해독기 : 명령 레지스터에 있는 명령을 해독하여 부호기로 전송
    • 부호기 : 명령 해독기가 전송한 명령을 신호로 만들어 각 장치로 전송
    • 주소 해독기 : 명령 레지스터에 있는 주소를 해독하여 메모리의 실제 주소로 변환 후, 이를 데이터 레지스터에 저장
  • 관련 레지스터
    • 프로그램 카운터 : 다음에 실행할 명령의 주소 저장
    • 명령 레지스터 : 현재 실행 중인 명령을 저장
    • 메모리 주소 레지스터 : 주기억장치의 번지를 저장
    • 메모리 버퍼 레지스터 : 메모리 주소 레지스터에 저장된 주소의 실제 내용을 저장

 

레지스터의 종류와 용도 (16, 32bit)

범용 레지스터(General Register)

: 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등 여러 목적으로 사용할 수 있는 레지스터

  • EAX, 누산기 : 산술 연산에 사용, 함수의 결과 값 저장
  • EBX, 베이스 레지스터 : 특정 주소 저장, 주소 지정을 확대하는 인덱스로 사용
  • ECX, 카운트 레지스터 : 반복적으로 실행되는 특정 명령에 사용, (루프 반복, 시프트 이동)
  • EDX, 데이터 레지스터 : 일반 자료를 저장 (입출력 동작에 사용)

 

세그먼트 레지스터(Segment Register)

: 각 세그먼트의 주소를 지정하는 레지스터

  • CS, 코드 세그먼트 레지스터 : 실행할 기계 명령어가 저장된 메모리 주소를 지정
  • DS, 데이터 세그먼트 레지스터 : 프로그램에서 정의된 데이터, 상수, 작업 영역 메모리 주소 지정
  • SS, 스택 세그먼트 레지스터 : 프로그램 스택 세그먼트의 시작 주소를 저장 메모리 상에 스택 구현을 가능하게 함
  • ES, FS, GS, 엑스트라 세그먼트 레지스터 : 문자 연산과 추가 메모리를 지정하는데 사용하는 여분의 레지스터

// 세그먼트(Segment)

: 프로그램에 정의한 메모리 상의 특정 영역으로 코드, 데이터, 스택 등을 포함. 세그먼트는 메모리의 대부분에 위치할 수 있음.

 

포인터 레지스터(Pointer Register)

: 프로그램의 실행 과정에서 사용하는 주요 메모리 주소 값을 저장, 실제 메모리 상의 주소 참조

  • EBP, 베이스 포인터 : SS 레지스터와 함께 사용하여 스택 안의 변수 값을 읽는데 사용.
                                    스택 세그먼트에서 현재 호출해서 사용하는 함수의 시작 주소 값을 저장 함수로 전달되는
                                    지역 변수 등을 참조할 때 기준이 되며, ESP 레지스터와 함께 써서 스택 프레임(Stack Frame)을
                                    형성하기도 한다.
  • ESP, 스택 포인터 : SS 레지스터와 함께 사용하며, 스택의 가장 끝(하위) 주소를 가리킴 스택은 높은 주소에서 낮은 주소로
                                 이동하면서 데이터를 저장하므로, 스택이 확장되면 스택 포인터도 높은 주소에서 낮은 주소로 값을 변경
  • EIP, 명령 포인터 : 다음 명령어의 오프셋(상대 위치 주소)을 저장하며, 현재 실행 중인 코드 세그먼트에 속한
                                현재 명령을 가리킴. CS 레지스터와 합쳐 다음에 수행할 명령 주소를 형성

 

인덱스 레지스터(Index Register)

: 데이터를 복사할 때 출발지와 목적지 주소를 가리키는 레지스터. 주로 메모리의 한 영역에서 다른 영역으로
  데이터를 연속적으로 복사할 때 사용

  • EDI, 목적지 인덱스 : 목적지 주소 값 저장
  • ESI, 출발지 인덱스 : 출발지 주소 값 저장

 

플래그 레지스터

: 32비트 크기를 가지고 있으며, 컴퓨터의 다양한 상태를 나타내는 비트를 포함

  • EFLAGS, 플래그 레지스터 : 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장

 

** 사용 목적별 레지스터 맵핑

[사용 목적별 레지스터 맵핑]

 


어셈블리어를 이용한 이름 출력

실습 환경

Ubuntu 18.04.6 LTS (VM)

 

시스템 정보

Linux ubuntu 5.4.0-135-generic #152~18.04.2-Ubuntu SMP Tue Nov 29 08:23:49 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

 

1. nasm 설치

sudo apt-get install nasm

2. asm 파일 생성 및 수정

vi dodoh4t.asm

3. 코드 작성

section .data
    msg: db "Doyeon Kim (a.k.a. dodoh4t)",10
    len: equ $-msg
    
section .text
    global _start
_start:
    mov rax, 1     ;Syscall id 1 -> write
    mov rdi, 1     ;FD(File Descriptor) stdout
    mov rsi, msg   ;String address to write
    mov rdx, len   ;String length in bytes
    syscall        ;System call

_last:
    mov rax, 60    ;Syscall id 60 -> exit
    mov rdi, 0     ;Set exit code 0;
    syscall
  • section.data : 데이터 섹션. Static 변수, 상수를 지정 가능
  • msg, db, 10 : msg는 변수명, db(define byte)는 타입, 10은 Escape Sequence(\n)
  • equ $ : len의 메모리 주소를 equ로 생성하여 -msg, 바로 전 코드에서 주소를 빼면 문자열 길이 확인 가능(byte)
  • section.text : 명령어 주소에 대응하는 코드
  • global_start : 여러 파일을 컴파일 할 때 시작점(Entry Symbol)
  • mov rax, 1 : 1 값을 rax 레지스터에 저장 (1 : sys_write)
  • mov rdi, 1 : FD(File Descriptor, 1: Standard Output)
  • mov rsi, msg : msg 변수의 주소를 가리키는 코드 행
  • mov rdx, len : 문자열의 길이(size_t count)
  • mov rax, 60 : 시스템콜 종료 (60 : exit)
  • mov rdi, 0 : 에러 발생 X (return 0)

종합

:: sys_write 를 호출하여 file descriptor 1인 stdout에 msg 변수를 문자열 개수만큼 출력

 

** Static 변수

: 프로그램 시작부터 끝까지 메모리에서 값을 유지하는 변수

 

4. 컴파일 및 링크

nasm -f elf64 -g dodoh4t.asm -o dodoh4t.o
ld -o dodoh4t dodoh4t.o

5. 실행 및 출력 값 확인

./dodoh4t

  • 정상적으로 문자열 값이 출력되는 것을 확인할 수 있다 !
728x90
Comments