<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Seoysauce.log</title>
        <link>https://velog.io/</link>
        <description>42Seoul, Front-end</description>
        <lastBuildDate>Sat, 17 Apr 2021 08:06:05 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Seoysauce.log</title>
            <url>https://images.velog.io/images/kitkat-42/profile/8befbc85-79c1-414a-92e6-7f961115ffe4/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Seoysauce.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/kitkat-42" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Libasm] 어셈블리어, 레지스터, NASM]]></title>
            <link>https://velog.io/@kitkat-42/libasm</link>
            <guid>https://velog.io/@kitkat-42/libasm</guid>
            <pubDate>Sat, 17 Apr 2021 08:06:05 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>이 프로젝트는 어셈블리어와 친숙해지는 것을 목표로 한다.</p>
</blockquote>
<h2 id="1-어셈블리어assembly-language">1. 어셈블리어(Assembly language)</h2>
<ul>
<li>기계어와 1:1로 매칭되는 언어</li>
<li>기계어와 고급 언어의 중간 단계의 언어</li>
<li>2진수로 표현된 기계어를 사람이 알아볼 수 있게 번역한 언어</li>
</ul>
<blockquote>
<p>어셈블리어가 뭔지 모른다면? <a href="https://youtu.be/yf7yFJHTif8">이 유튜브</a> 시청을 강추. 아주 쉽게 잘 소개되어 있다.</p>
</blockquote>
<img src="data:image/png;base64,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" align="center">

<p>기계어는 실제로 컴퓨터의 CPU가 읽어서 실행할 수 있는 0과 1로 이루어진 명령어의 조합이다. 이러한 각 명령어에 대해 사람이 알아보기 쉬운 니모닉 기호(mnemonic symbol)를 정해 사람이 좀 더 쉽게 컴퓨터의 행동을 제어할 수 있도록 한 것이 <strong>어셈블리 언어</strong>이다.</p>
<p>예를 들어,</p>
<pre><code>10110000 01100001</code></pre><p>는 x86 계열 CPU의 기계어 명령이고, 이것을 어셈블리어로 옮겨쓰면 다음과 같다.</p>
<pre><code>mov al, 061h</code></pre><p>명령어 mov는 영어 move를 변형한 니모닉이고, al은 CPU안에 있는 변수를 저장하는 <code>레지스터</code>의 하나이다. 그리고, 061h는 16진수 61 (즉 십진수 97, 이진수 01100001)이다. 이 한 줄의 뜻은 &#39;16진수 61을 al 레지스터에 넣으라&#39;는 뜻이며, 1과 0의 반복인 기계어보다 사람이 혼동없이 이해하기 한결 쉽다. 어셈블리어는 이러한 문장들로 구성된다.</p>
<img src="https://pwnh4.com/reverse-compilation-process.png">

<blockquote>
<p>지금까지 우리가 작성한 C언어(고급어) 파일을 <code>GCC(GNU Compiler Collection)</code>를 이용해 &#39;전처리, 컴파일, 어셈블, 링크&#39; 하는 과정을 거쳐 실행파일을 만들어 왔다. 지금까지는 <code>GCC</code>가 C언어를 어셈블리어로 컴파일 해주었지만, 이 프로젝트는 우리가 직접 어셈블리 파일을 만드는 것이다!</p>
</blockquote>
<h3 id="11-어셈블리어의-문법-intel-문법-vs-att-문법">1.1. 어셈블리어의 문법: Intel 문법 vs AT&amp;T 문법</h3>
<p>C나 Java 등과 다르게 어셈블리어는 정해진 표준이 없다. 
그래서 여러 종류의 문법이 존재하는데, 그 중 가장 대표적인 문법이 <strong>AT&amp;T</strong> 문법과 <strong>Intel</strong> 문법이다.
두 문법의 공통점은 <strong>opcode(명령어)</strong>와 <strong>operand(인자값)</strong>로 나뉜다는 점이다.</p>
<p>예)</p>
<pre><code> ADD EAX, 9
(ADD operand 1, operand 2)
</code></pre><ul>
<li>ADD: opcode, EAX: operand 1, 9: operand 2</li>
</ul>
<p>다만 두 문법의 차이점은 <strong>Intel</strong> 문법은 <strong><code>operand 1이 destination</code></strong>이고 <strong><code>operand 2가 source</code></strong>인 반면,
AT&amp;T 문법은 <code>operand 1이 source</code>, <code>operand 2가 destination</code>이라는 점이다.</p>
<p>또 다른 차이점은 <strong>*Intel</strong> 문법은 숫자를 그냥 숫자 그대로<strong><code>(0,1,2,3..)</code></strong> 표기하지만,
AT&amp;T 문법은 숫자 앞에 $를 붙여<code>($0,$1,$2,$3..)</code> 표기한다는 점이 있다.</p>
<p><strong>레지스터</strong>를 표기할 때도 다른데, 레지스터가 무엇인지는 아래에서 설명할 것이다.
아무튼 <strong>Intel</strong> 문법은 레지스터를 레지스터 이름 그대로 <strong><code>(rax, rbx, rcx, rdx)</code></strong> 표기하지만,
AT&amp;T 문법은 앞에 %를 붙여 <code>(%rax, %rbx, %rcx, %rdx)</code> 표기한다.</p>
<p>이외에도 메모리 주소를 참조할 때 <strong>Intel</strong>은 대괄호를 씌워서 <strong><code>[EAX]</code></strong> 이렇게 표기하고 At&amp;T는 괄호를 씌워 <code>(EAX)</code> 이렇게 표기하는 등의 차이가 있다.
Offset(오프셋)의 경우도 <strong>Intel</strong>은 EAX 레지스터에서 +4 만큼 떨어진 메모리 주소를 표기할 때는 <strong><code>[EAX + 4]</code></strong> 와 같이 표현한다.
어셈블리어를 들여다보면 대충 Intel 식인지 AT&amp;T 식인지 알아볼 수 있을 듯...
어쨌든 우리는 Intel 문법을 쓸 것이기 때문에 Intel 문법을 알아가면 되겠다.</p>
<h2 id="2-레지스터">2. 레지스터</h2>
<ul>
<li>레지스터는 <strong>CPU 내부에 있는(= 속도가 매우 빠른) 임시 저장장치</strong>이다.</li>
<li>레지스터는 메모리에 액세스하지 않고도 처리할 데이터 요소를 저장한다.</li>
<li>제한된 수의 레지스터가 프로세서 칩에 내장된다.</li>
</ul>
<img src="https://upload.wikimedia.org/wikipedia/commons/d/d8/ABasicComputer.gif">

<p>CPU가 요청을 처리하는 데 필요한 데이터를 일시적으로 저장하는 기억장치가 이 그림의 가운데에 있는 레지스터이다. </p>
<blockquote>
<p>실제로 컴퓨터에서 데이터를 영구적으로 저장하기 위해서는 하드디스크를 이용해야하고, 임시적으로 저장하는 장소를 메모리(RAM)라고 알고있을 것이다.<br>하지만 메모리로 연산의 결과를 보내고 영구적으로 저장할 데이터를 하드디스크에 저장하는 등의 명령을 처리하기 위해서는 이들에 대한 주소와 명령의 종류를 저장할 수 있는 기억 공간이 하나 더 필요하다. 
그리고 이 공간은 무리없이 명령을 수행하기 위해 메모리보다 빨라야 한다. 바로 이런 역할을 하는 것이 레지스터이다. 
레지스터는 공간은 작지만 CPU와 직접 연결되어 있으므로 연산 속도가 메모리보다 수십 배에서 수백 배까지 더 빠르다. 
때문에 연산을 위해서는 반드시 레지스터를 거쳐야 하며, 이를 위해서 레지스터는 특정 주소를 가리키거나 값을 읽어올 수 있다. </p>
</blockquote>
<p>CPU에서 변수랑 비슷한 역할을 하는 것이라 생각하면 쉽다.
몇가지 레지스터를 살펴보자.</p>
<h3 id="21-레지스터의-종류">2.1. 레지스터의 종류</h3>
<p>레지스터는 CPU 당 한개만 존재하는 것이 아니라 필요와 용도에 따라 여러 종류가 있고, 각 레지스터의 사용 방식에 따라 이름을 구분해 사용해왔다.</p>
<ol>
<li><p>범용 레지스터 (64bit - 32bit - 16bit - up 8bit - down - 8bit)</p>
<ul>
<li><strong>rax (- eax - ax - ah - al)</strong><ul>
<li>산술, 논리연산</li>
<li>syscall 함수 주소 저장</li>
<li>함수 return값 저장</li>
</ul>
</li>
<li><strong>rbx (- ebx - bx - bh - bl)</strong><ul>
<li>메모리 주소 저장</li>
</ul>
</li>
<li><strong>rcx (- ecx - cx - ch - cl)</strong><ul>
<li>반복 작업에 루프 카운트를 저장(반복 횟수)</li>
</ul>
</li>
<li><strong>rdx (- edx - dx - dh - dl)</strong><ul>
<li>입력 / 출력 작업</li>
<li>큰 값 곱하기, 나누기 연산을 위해 DX, AX 사용</li>
</ul>
</li>
</ul>
</li>
<li><p><del>포인터 레지스터</del></p>
<ul>
<li><del>rsp (스택 포인터의 최고점)</del></li>
<li><del>rbp (스택 포인터의 최저점)</del></li>
</ul>
</li>
<li><p>인덱스 레지스터</p>
<ul>
<li><strong>rsi</strong> (src index)<ul>
<li>문자열 처리를 위한 소스 인덱스</li>
</ul>
</li>
<li><strong>rdi</strong> (dest index)<ul>
<li>문자열 작업을위한 대상 인덱스</li>
</ul>
</li>
</ul>
</li>
<li><p><del>세그먼트 레지스터</del></p>
<ul>
<li><del>cs</del></li>
<li><del>ds</del></li>
<li><del>ss</del></li>
<li><del>es</del></li>
</ul>
</li>
</ol>
<p>우리 프로젝트에서는 범용 레지스터와 인덱스 레지스터만 사용된다고 한다. 그런데 왜 데이터 크기별로 이름이 다른거지? -&gt; 2.3을 참고!</p>
<h3 id="22-64-bit-vs-32-bit">2.2. 64 bit vs 32 bit?</h3>
<p>32 비트, 혹은 64비트 시스템 컴퓨터라는 말을 많이 들어봤을 것이다.
여기서 말하는 비트 수는 명령을 한 번에 처리할 수 있는 레지스터의 비트 수를 말한다.
쉽게 말해 하나의 레지스터가 저장 가능한 공간의 크기가 32비트인지 64비트인지를 나타내는 거라 보면 된다.</p>
<p>계속적으로 멀티미디어가 발전하고 사용자가 늘어남에 따라 프로그램의 용량은 커져야 했고 더욱 많은 메모리 공간을 필요로 하게 되었다.
그래서 나온 것인 64비트 체제이다.
네트워크 주소에서의 IPv4와 IPv6의 경우를 생각하면 이해가 쉽다.</p>
<h3 id="23-데이터의-단위-bit-byte-word-dword">2.3. 데이터의 단위: Bit, Byte, word, dword</h3>
<p>어셈블리 변수의 자료형으로 사용된다.</p>
<table>
<thead>
<tr>
<th>data type (자료형)</th>
<th>크기</th>
</tr>
</thead>
<tbody><tr>
<td>BYTE</td>
<td>부호 없는 1 byte (= 8 bit)</td>
</tr>
<tr>
<td>WORD</td>
<td>부호 없는 2 byte</td>
</tr>
<tr>
<td>DWORD</td>
<td>부호 없는 4 byte</td>
</tr>
<tr>
<td>QWORD</td>
<td>부호 없는 8 byte</td>
</tr>
</tbody></table>
<img src="https://pwnh4.com/reverse-register-size.png">

<blockquote>
<p>AL, AH, AX, EAX, RAX가 모두 다른 레지스터라고 이해하는 경우가 있는데, RAX가 EAX를 포함하고, EAX가 AX를 포함하고.. 이런 형태이다. AX의 상위 8 bit를 al이 사용하고, 하위 8 bit를 ah가 사용하는 식.
이는 하위 비트 시스템(32비트, 16비트 시스템) 호환을 위한 설계이기도 하고, 레지스터 공간의 낭비를 없애기 위함이기도 하며, 효율적인 알고리즘을 위한 설계이기도 하다.</p>
</blockquote>
<h2 id="3-calling-convention함수-호출-규약">3. Calling convention(함수 호출 규약)</h2>
<ul>
<li><strong>함수를 호출하는 규약</strong>으로 스택을 이용하여 파라미터를 전달할 때 인자 전달 방법, 인자 전달 순서, 전달된 파라미터가 해제되는 곳, 리턴 값 전달 등을 명시한다.&#39;&#39;</li>
</ul>
<p>어셈블리 프로그램을 짜려면 먼저 함수 호출 규약을 알아야 한다.</p>
<p>우리에게 필요한 x86_64 calling convention은 <a href="https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md">여기</a>에 정리되어 있다. </p>
<table>
<thead>
<tr>
<th>arch</th>
<th>syscall NR</th>
<th>return</th>
<th>arg0</th>
<th>arg1</th>
<th>arg2</th>
<th>arg3</th>
<th>arg4</th>
<th>arg5</th>
</tr>
</thead>
<tbody><tr>
<td>x86_64</td>
<td>rax</td>
<td>rax</td>
<td>rdi</td>
<td>rsi</td>
<td>rdx</td>
<td>r10</td>
<td>r8</td>
<td>r9</td>
</tr>
</tbody></table>
<p>즉, x86_64 아키텍처에서의 syscall 넘버(NR)와 리턴값은 <code>rax</code>에 담기고, 함수에서 매개변수(arg0, arg1, ...)는 <code>rdi, rsi, rdx, rcx, r8, r9</code> 순으로 넘어오게 된다.</p>
<h3 id="자주쓰는-명령어opcode들">자주쓰는 명령어(opcode)들</h3>
<h4 id="1-조작-명령어">1. 조작 명령어</h4>
<ul>
<li><p><code>call</code> : 함수 호출</p>
</li>
<li><p><code>ret</code> : call로 호출된 함수를 종료하고 그 다음 명령줄로 이동</p>
</li>
<li><p><code>nop</code> : 아무것도 하지 않음</p>
</li>
<li><p><code>jmp</code> : 분기(라벨) 실행.</p>
<ul>
<li><p>조건 점프 명령어 : cmp 연산 결과에 따라 jmp</p>
</li>
<li><ul>
<li><code>je</code> : cmp A B 에서 A = B 일때 특정 라벨로 jmp</li>
</ul>
</li>
<li><ul>
<li><code>jne</code> : cmp A B 에서 A != B 일때 특정 라벨로 jmp</li>
</ul>
</li>
<li><ul>
<li><code>ja</code> : cmp A B 에서 A &gt; B 일때 특정 라벨로 jmp</li>
</ul>
</li>
<li><ul>
<li><code>jb</code> : cmp A B 에서 A &lt; B 일때 특정 라벨로 jmp</li>
</ul>
</li>
<li><ul>
<li><code>jae</code> : A &gt;= B</li>
</ul>
</li>
<li><ul>
<li><code>jbe</code> : A &lt;= B</li>
</ul>
</li>
<li><p>플래그 점프 명령어: flag의 값을 확인하고 그에 따라 jmp</p>
</li>
<li><ul>
<li><code>jc</code> : Jump If Carry, CF = 1 이면 jmp</li>
</ul>
</li>
<li><ul>
<li><code>jnc</code> : Jump If No Carry    CF, CF = 0 이면 jmp</li>
</ul>
</li>
</ul>
</li>
</ul>
<h4 id="2-데이터-전송-명령어">2. 데이터 전송 명령어</h4>
<ul>
<li><code>push</code> : 스택에 값을 넣음</li>
<li><code>pop</code> : 스택에서 값을 가져옴</li>
<li><code>mov</code> : 인자2 값을 인자1에 대입(전달)</li>
<li><code>lea</code> : 인자2 주소를 인자1에 대입(전달)</li>
</ul>
<h4 id="3-산술-명령어">3. 산술 명령어</h4>
<ul>
<li><code>inc</code> : 인자의 값을 1 증가</li>
<li><code>dec</code> : 인자의 값을 1 감소</li>
<li><code>add</code> : 인자2 값을 인자1에 더함</li>
<li><code>sub</code> : 인자2 값을 인자1에서 뺌</li>
<li><code>cmp</code> : 인자1,2의 값을 비교. 주로 위의 조건점프 명령어와 세트로 사용한다.</li>
<li><code>test</code> : 인자1과 인자2를 AND 연산한다. 이 연산의 결과는 <code>ZF(zero flag)</code>에만 영향을 미치고 Operand 자체에는 영향을 미치지 않는다.
보통 rax의 값이 0인지 확인할 때 rax 0, 0 이런 식으로 사용된다.
만약 TEST의 연산결과가 0이라면 <code>ZF는 1</code>로, 연산결과가 1이라면 <code>ZF는 0</code>으로 세트된다.</li>
</ul>
<h2 id="4-syscall">4. syscall</h2>
<ul>
<li>syscall 명령어를 통해 시스템 상에 미리 선언되어 있는 함수를 호출할 수 있다.</li>
<li>이 때 syscall 할 함수의 번호를 <code>rax</code>에 미리 넣어줘야한다.</li>
<li>syscall 함수의 반환값 또한 <code>rax</code>에 저장된다.</li>
<li>자주 사용하는 syscall numbers (macOS 기준)<pre><code>0x2000001 - exit()
0x2000002
0x2000003 - read()
0x2000004 - write()
0x2000005 - open()
0x2000006 - close()</code></pre></li>
<li>syscall 코드는 시스템 마다 다르며 맥은 <a href="https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master">이 문서</a>를 참고하자.
syscall은 클러스터에서 아래 위치에 있다.</li>
</ul>
<p>/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/sys/syscall.h</p>
<img src="https://user-images.githubusercontent.com/53321189/99216464-149c1980-2819-11eb-9282-ea7edabe26c2.png">

<blockquote>
<p>테이블 상 1,2,3… 이라고 넘버링 되어있는데 실제로 사용할 때는 0x2000003 (=read) 호출하는 이유?
Mac은 syscall 번호를 여러 클래스로 나눠 뒀다. write, read는 unix 클래스로 분류, 최상단 비트를 2로 설정해둠.</p>
</blockquote>
<h3 id="41-error-함수">4.1. error 함수</h3>
<ul>
<li>syscall 후 에러 발생 시 이는 <strong>__error 함수</strong>를 이용해 처리해야한다.</li>
<li><strong>__error 함수</strong>는 sys/errno.h 에 선언되어 있다. </li>
<li>syscall 함수는 오류가 있을 경우 <code>rax</code>에 <strong>작은 음수(-1 ~ -4095)를 반환</strong>하며 동시에 <strong>CF(carry flag)가 참이 된다</strong>. 따라서 <code>jc</code>(carry flag가 1일 때 점프)를 활용하면 에러 처리 구문(err)으로 넘어갈 수 있다.</li>
<li>이 리턴값은, C언어에서 에러에 대한 정보를 나타내는 정보인 <strong>errno</strong>(쉽게 말해 미리 정의된 에러 번호)<strong>의 음수 값</strong>이다. 즉, syscall 후 에러 발생 시 <code>rax</code>에는 <strong>-errno</strong>(-4095 ~ -1)가 반환된다.</li>
<li>어셈블리로 작성한 _err 구문이 올바르게 errno를 출력할 수 있도록 하기 위해서는 <strong>rax에 음수 리턴값</strong>, <strong>[rax]에 errno에 해당하는 숫자</strong>가 들어갈 수 있도록 작성해야한다.</li>
</ul>
<blockquote>
<p>예를 들어... 아래 write.s 예제를 살펴보자.</p>
</blockquote>
<pre><code>section .text
    global  _ft_write
    extern  ___error

_ft_write:
    mov rax, 0x2000004  ; rax에 write함수(0x2000004) 담음
    syscall             ; rax 값을 보고 해당하는 함수를 시스템콜
    jc  _err            ; CF = 1(오류 발생 시) 이면, _err 함수로 점프
                        ; syscall 함수는 오류가 있을 경우 rax에 해당하는 오류(음의 정수)값 반환하며
                        ; 동시에 CF = 1이 된다.
    ret

_err:
    push rax            ; rax 값을 스택에 백업
    call ___error       ; ___error 함수 호출(rax = 에러 주소값)
    pop rdx             ; 스택에 저장된 값을 rdx로 꺼내옴
    mov [rax], rdx      ; rax가 가리키는 주소의 값으로 rdx 값을 대입
    mov rax, -1         ; 반환할 값(-1)
    ret</code></pre><ul>
<li>syscall 한 write 함수에서 <code>잘못된 파일 번호에 의한 에러</code>가 생겼을 경우, (잘못된 파일 번호의 <code>errno</code>는 <code>9</code>이다) </li>
<li>write 함수에서 에러가 생기면 <code>CF = 1</code> 이 되면서, <code>rax = -9</code>가 된다.</li>
<li>우리는 <code>[rax]</code>에 <code>-9</code>를 담아야 하고, <code>rax</code>에는 write 함수의 오류 반환값인 <code>-1</code>를 담아야 한다.</li>
<li>따라서 rax에 담겨있는 error value를 push해 스택에 백업해둔다. 그 다음에 ___error 함수를 호출하면 <strong>에러 주소값</strong>이 rax에 담긴다. rdx에 스택에 저장시켜 놨던 error value를 팝해온다.</li>
<li>rdx에 담긴 error value를 에러 주소를 변경하지 않고 고대로 집어 넣기 위해 <code>mov [rax], rdx</code> 해준다. rax에 []를 씌워주면 주소는 건들지 않고 값만 바꿀 수 있다.</li>
</ul>
<p>에러넘버는 <a href="https://docs.microsoft.com/ko-kr/cpp/c-runtime-library/errno-doserrno-sys-errlist-and-sys-nerr?view=msvc-160">여기</a>에 정리되어 있다. (혹은 man 2 errno)</p>
<blockquote>
<p>c언어 파일에서는 #include &lt;errno.h&gt;를 선언하면 errno라는 변수(별도의 선언 x)를 사용할 수 있으며 이 변수를 통해 에러코드를 불러 올 수 있게 된다.</p>
</blockquote>
<h2 id="5-nasmnetwide-assembler">5. NASM(Netwide Assembler)</h2>
<p>어셈블리 언어는 NASM, MASM 등과 같은 <code>어셈블러</code>라고하는 유틸리티 프로그램에 의해 실행 가능한 기계어 코드로 변환된다.
그 중 넷와이드 어셈블러(Netwide Assembler, NASM)은 인텔 x86 아키텍처용 어셈블러이자 역어셈블러이다.</p>
<ul>
<li>어셈블러(Assembler) : 어셈블리어를 기계어로 바꿔주는 프로그램</li>
<li>역어셈블러(Disassembler) : 기계어를 어셈블리어로 번역해 보여주는 프로그램(Ollydbg, IDA, GDB)</li>
</ul>
<p>쉽게 말해 어셈블리 파일(.s)을 컴파일해주는 프로그램이라 할 수 있겠다.</p>
<p>이제 NASM을 설치해보자.</p>
<ol>
<li>brew설치
<code>curl -fsSL https://rawgit.com/kube/42homebrew/master/install.sh | zsh</code></li>
<li>NASM 설치
<code>brew install nasm</code></li>
</ol>
<p>설치를 완료했다면, 이제 어셈블리 파일(.s)을 작성하고 컴파일 해보자.</p>
<h2 id="6-어셈블리어로-hello-world-프로그램-짜기">6. 어셈블리어로 Hello World 프로그램 짜기</h2>
<h3 id="61-section">6.1. Section</h3>
<p>어셈블리파일은 세 부분으로 나뉜다.</p>
<ol>
<li>text section
<code>section .text</code></li>
</ol>
<ul>
<li>실제 코드 작성 부분</li>
</ul>
<ol start="2">
<li>BSS section(Block Starting Symbol)
<code>section.bss</code></li>
</ol>
<ul>
<li>변수 선언 부분(변하는 값들)</li>
</ul>
<ol start="3">
<li>data section
<code>section.data</code></li>
</ol>
<ul>
<li>상수 선언, 초기화 부분(안 변하는 값들)</li>
</ul>
<h3 id="62-hello-world-출력-프로그램-짜기">6.2. Hello World 출력 프로그램 짜기</h3>
<p><code>helloworld.s</code> 라는 파일을 만들고 아래와 같이 코드를 작성해보자.</p>
<pre><code>section .text
    global _main    ; _main함수를 global로 설정하여, 전역에서 접근 가능하도록 함.

_main :
    mov rax, 0x2000004    ; syscall(시스템콜)쓰기 위해 rax에 syscall 번호 넣어줌
                            ; 0x2000004 : write 함수
    ; 매개변수 순서대로 넣어줌, 순서 정해져있음.(rdi - rsi - rdx - r10 - r8 - r9)
    mov rdi, 1          ; rdi : arg0    fd = 1
    mov rsi, msg        ; rsi : arg1    buf에 들어가는 변수 명
    mov rdx, 11         ; rdx : arg2    출력할 문자열(hello world)의 바이트 수
    syscall             ; syscall 호출(write)
    /* 아래는 return 0과 비슷함. 종료된 것을 알려줘야 함.*/
    mov rax, 0x2000001  ; exit
    mov rdi, 0            ; rdi: arg0 = 0
    syscall            ; exit 호출

section .data
    msg db &quot;Hello World&quot;
</code></pre><blockquote>
<p>어셈블리 파일 내부 함수에 _(언더바)를 붙이는 이유?</p>
<p>일종의 약속(코딩 컨벤션)으로, 언더바를 붙이지 않으면 C에서 어셈블리어로 작성한 함수를 사용할 수 없다. 
어셈블리에서는 기본적으로 모든 코드가 private이다. 이때 다른 모듈이 해당 코드에 접근할 수 있게 하기 위해서 global instruction을 이용하여 심볼에 다른 코드가 접근할 수 있도록 해 준다. 이렇게 명시하지 않는다면 링커에서 아무런 심볼을 찾을 수 없다는 오류가 발생한다.</p>
</blockquote>
<h3 id="63-컴파일하기">6.3. 컴파일하기</h3>
<ol>
<li>컴파일<pre><code>$ nasm -f macho64 hello.s</code></pre></li>
<li>링킹<pre><code>$ ld -lSystem hello.o</code></pre></li>
<li>실행<pre><code>$ ./a.out</code></pre>출처</li>
</ol>
<p><a href="https://dongdd.tistory.com/862">https://dongdd.tistory.com/862</a>
<a href="https://cs.lmu.edu/~ray/notes/nasmtutorial/">NASM 튜토리얼</a>
<a href="https://m.blog.naver.com/mjnms/220460806744">레지스터 내용 블로그</a>
<a href="https://velog.io/@hidaehyunlee/libasm-%EC%96%B4%EC%85%88%EB%B8%94%EB%A6%AC-%EB%AA%85%EB%A0%B9%EC%96%B4-opcode-%EC%A0%95%EB%A6%AC">어셈블리 명령어 정리</a>
<a href="https://yeosong1.github.io/main_page">42 wiki - Libasm</a>
<a href="https://yechoi.tistory.com/17">https://yechoi.tistory.com/17</a></p>
]]></description>
        </item>
    </channel>
</rss>