<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on LeafCxy's Blog</title><link>https://leafcxy.github.io/posts/</link><description>Recent content in Posts on LeafCxy's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 15 Jul 2025 06:30:08 +0000</lastBuildDate><atom:link href="https://leafcxy.github.io/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Hello World</title><link>https://leafcxy.github.io/posts/hello-world/</link><pubDate>Tue, 15 Jul 2025 06:30:08 +0000</pubDate><guid>https://leafcxy.github.io/posts/hello-world/</guid><description>&lt;blockquote&gt;
&lt;p&gt;我觉得程序员这个群体是非常幸运的一群人，我们生在一个技术改变世界的时代，而我们可能正做着能够改变世界的技术，这是何等的荣耀和机遇。 ——《MacTalk 人生元编程》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;大概每个程序员在开篇都会写一个 Hello World! 来作为开始。这是我的第一篇博客，就来写一写程序员眼中的 Hello World!。&lt;/p&gt;
&lt;!-- more --&gt;
&lt;h2 id="这是一个-01-的世界"&gt;这是一个 01 的世界&lt;/h2&gt;
&lt;p&gt;每个伟大的梦想都来自最小的尝试。秒写一个代码：hello.c&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Hello world&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这段代码相信大家都很熟悉，无非就是输出一个 Hello world 字符串。下面我们就来分析一下这段代码。&lt;/p&gt;
&lt;h2 id="预处理阶段"&gt;预处理阶段&lt;/h2&gt;
&lt;p&gt;我们可以使用 gcc -E hello.c -o hello.i 来将预处理之后的数据存到 hello.i 中，或者使用 &amp;gt; 重定向到指定的文件，预处理的结果比较简单，大家可以直接看输出的结果。&lt;/p&gt;
&lt;h2 id="编译阶段"&gt;编译阶段&lt;/h2&gt;
&lt;p&gt;gcc -S hello.i -o hello.s 将预处理之后的文件编译成 hello.s 文件。
在编译阶段，编译器检查代码的规范性、是否有语法错误等，在检查无误后，gcc 把代码翻译成汇编语言。 我们来看一下编译之后的文件 &amp;gt;more hello.s&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt; .file &amp;#34;hello.c&amp;#34;
.section .rodata
.LC0:
.string &amp;#34;Hello world&amp;#34;
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident &amp;#34;GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2&amp;#34;
.section .note.GNU-stack,&amp;#34;&amp;#34;,@progbits
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="汇编阶段"&gt;汇编阶段&lt;/h2&gt;
&lt;p&gt;汇编阶段将编译阶段生成的.s 文件转成二进制目标代码。 gcc -c hello.s -o hello.o 生成了.o 二进制文件，这时就不能使用 more 来进行文本查看了，可以使用 objdump 命令。 objdump -d hello.o&lt;/p&gt;</description></item></channel></rss>