인프런 강의 : [[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문]
C를 공부한 이후 C++을 해보기로 했다. (객체지향 언어에 대한 더 깊은 이해가 필요하니까 그리고 회사에서 쓴다.)
어셈블리어에 대해서는 정글에서 PintOS를 할때 사용했었다. 그 이후 까맣게 잊고 있었는데 C++을 하면서 다시 만나게 될줄 몰랐다.
거두절미하고 바로 시작하겠다.
먼저 사용하는 프로그램은 SASM이다
어셈블리어로 코드를 짜고 빌드와 디버그를 하게 해주는 프로그램이다.
https://dman95.github.io/SASM/english.html
Window도 Mac도 각자 맞는걸 알아서 다운받으면 된다.
이후 설정은 아래와 같이 한다.
빌드를 위한 설정이다.
어셈블러로 NASM을 가장 보편적으로 사용한다고 한다.


이후 처음 create project를 하면 다음과 같이 뜬다.

하지만 영상에서는 create 했을 때 환경이 다르게 생겼다

1번 라인을 보면 영상에서는
%include "io64.inc"
라는 부분이 있다. inc 파일을 include 한다 (C에서 많이 봤다). -- 64비트 매크로를 추가하는 부분 해당 코드를 꼭 추가해줘야 영상을 따라하는데 문제가 없다.
아직은 global 부분이 무엇을 의미하는지 모르겠다.
추측 : global 부분에 선언한 변수와 아래 main을 일치시켜줘야 한다는 것 그리고 해당 부분이 C언어 등에서 main()이랑 동일한 역할을 하고 있다는 것
이제 우리는 항상 코드를 배우면 가장 먼저했던 일인 Hello World를 출력해보겠다.
코드는 아래와 같이 작성하면된다.
%include "io64.inc"
section .text
global main
main:
mov rbp, rsp; for correct debugging
;write your code here
PRINT_STRING msg
xor rax, rax
ret
section .data
msg db 'Hello World', 0x00
코드를 보면 section으로 구분이 되어있고 section마다 하는 역할이 다른 것을 알 수 있다.
section .text
section .data
section .bbs
위 규칙을 보면서 우리는 code를 입력하면 된다.
먼저 section .data를 작성한다.
msg 라는 변수를 선언하고 db (byte)로 데이터 타입을 정해주고 초기값을 설정해준다.(초기값은 hello world)
0x00 은 주소를 의미(해당 주소의 메모리로 올리는거 같은데 일단은 추측이다)
이후 section .text에 PRINT_STRING msg 를 써준다.
PRINT_STRING은 SASM에서 print를 위해 제공하는 문자열 출력 매크로이고 msg는 section .data에서 선언한 변수이다.
이후 실행하면 아래와 같은 화면을 볼수 있다.

그리고 해당 코드를 exe로 저장한 후 cmd 창에서 실행하면 아래와 같이 Hello World가 출력되는 것을 볼 수 있다.

오늘은 여기까지..
후기.
이제 1강을 들었다. 제목만 보고 C++을 재밌게 배울수 있을거 같은데 라는 생각에 충동구매를 한 강의에서 어셈블리어를 만나니 뒤통수가 얼얼한 느낌이다. 그래도 기왕 시작한거 하나씩 하나씩 차근히 밟아가보자. 특별히 바쁜일이 없는 한 일주일에 3~4일씩 1~2강씩 듣고 난 후 내용을 정리해 올릴 계획이다. 그럼 화이팅!