c0mpos3r

Hello, world! 본문

Develop/Assembly

Hello, world!

음대생 2024. 7. 4. 13:51

어셈블리 언어는 베어본 언어다. 프로그래머가 실제 하드웨어 위에 있는 유일한 인터페이스는 커널 자체뿐이다.

 

어셈블리에서 유용한 프로그램을 빌드하려면 커널에서 제공하는 리눅스 시스템 호출을 사용해야함.

 

이러한 시스템 호출은 키보드에서 입력을 읽고 화면에 출력을 쓰는 등의 기능을 제공하기 위해 운영 체제에 내장된 라이브러리이다.

 

시스템 호출을 호출하면 커널은 프로그램 실행을 일시 중단한다. 그 다음 하드웨어에서 요청한 작업을 수행하는데 필요한 드라이버에 연결한 다음 프로그램 제어권을 다시 돌려준다.

 

커널은 드라이버를 사용하여 하드웨어를 구동하기 때문에 드라이버를 드라이버라고 부른다.

 

어셈블리에서 실행하려는 함수 번호(작업 코드 OPCODE)로 EAX를 로드하고 나머지 레지스터를 시스템 호출에 전달할 인수로 채우면 작업을 수행할 수 있다. INT 명령어로 소프트웨어 인터럽트를 요청하면 커널이 인수를 받아 라이브러리에서 함수를 호출한다.

 

EAX = 1일 때 인터럽트를 요청하면 sys_exit가 호출되고, EAX = 4 일 때 인터럽트를 요청하면 sys_write가 호출된다. 함수에 필요한 경우 EBX, ECX 및 EDX가 인수로 전달된다.

 

Program Write

먼저 .data Section ‘msg’ 변수를 만들고 출력할 문자열(이 경우 ‘Hello, world!’)을 할당한다.

.text Section에서는 프로그램의 시작점을 나타내는 전역 레이블 _start: 를 제공하여 실행을 시작할 위치를 커널에 알려준다. 메시지를 콘솔 창에 출력하기 위해 시스템 호출 sys_write를 사용한다. 이 함수는 Linux System Call Table에서 OPCODE 4로 할당 되어 있다. 또한 이 함수는 작업을 수행할 소프트웨어 인터럽트를 요청하기 전에 EDX, ECX, EBX에 순차적으로 로드되는 3개의 인수를 받는다.

 

전달되는 인수는

EDX는 문자열의 길이(바이트 단위)와 함께 로드된다.

ECX는 .data Scetion에 생성된 변수 주소로 로드된다.

EBX는 우리가 쓰고자 하는 파일(이 경수 STDOUT)과 함께 로드된다.

전달된 인수의 데이터 유형과 의미는 함수 정의에서 확인할 수 있다.

아래 명령을 사용하여 프로그램을 Compile, Link 및 실행한다.

전달된 인수와 데이터 유형과 의미는 함수 정의에서 확인할 수 있다.

 

helloworld.asm

; Hello World Program - asmtutor.com
; Compile with: nasm -f elf helloworld.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 hello.o -o helloworld
; Run with: ./helloworld

SECTION .data
msg     db        'Hello World!', 0Ah ; 메시지 문자열로 메시지 변수 할당

SECTION .text
global  _start

_start:

		mov     edx, 13  ; 쓸 바이트 수 - 각 문자당 1바이트 0Ah(줄 바꿈 문자)를 더한 값이다.
		mov     ecx, msg ; 메시지 문자열의 메모리 주소를 ECX로 이동한다.
		mov     ebx, 1   ; STDOUT 파일에 쓰기
		mov     eax, 4   ; SYS_WRITE 호출(Kernel OPCODE 4)
		int     80h

 

Result

$ nasm -f elf hello.asm
$ ld -m elf_i386 hello.o -o hello
$ ./hello
Hello, world
Segmentation fault

 

이 글은 https://asmtutor.com/#lesson1의 자료를 참고하여 작성되었습니다.

이 글은 상업적 목적이 아닌 개인이 공부한 내용을 정리하기 위한 글입니다. 

'Develop > Assembly' 카테고리의 다른 글

NULL terminating bytes  (0) 2024.07.04
External include files  (0) 2024.07.04
Subroutines  (0) 2024.07.04
Calculate string length  (0) 2024.07.04
Proper program exit  (0) 2024.07.04