有空就看新闻 發表於 2021-12-16 19:40:00

用汇编语言输出Hello World!

<div class="Post-RichTextContainer">
<div class="css-1yuhvjn">
<div class="RichText ztext Post-RichText css-hnrfcf">
<p data-pid="zLltnse3">https://zhuanlan.zhihu.com/p/147696502</p>
<p data-pid="zLltnse3">众所周知,首先从输出“Hello World!”开始学习一门编程语言已经是惯例了,汇编语言也不例外,下面我们将从输出“Hello World!”开始学习汇编语言。</p>
<h3>一、编写源程序</h3>
<p data-pid="TOAzj5R1">首先我们尝试用C语言来实现该功能:</p>
<div class="highlight">
<pre><code class="language-c"><span class="cp">#include <span class="cpf">&lt;stdio.h&gt;<span class="cp">
<span class="cp">
<span class="kt">int <span class="nf">main<span class="p">() <span class="p">{
    <span class="n">printf<span class="p">(<span class="s">"Hello World!"<span class="p">); <span class="c1">// 输出“Hello World!”
<span class="c1">    <span class="k">return <span class="mi">0<span class="p">;
<span class="p">}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
</div>
<p data-pid="rMZm-WZf">可以看到,仅仅用了一行代码就实现了该功能。那么用汇编语言又该如何去实现呢?</p>
<div class="highlight">
<pre><code class="language-text">data segment ;数据段
    string db 'Hello,World!$'
data ends
code segment ;代码段
assume cs:code,ds:data
start:
    mov ax,data ;获取段基址
    mov ds,ax ;将段基址送入寄存器
    mov dx,offset string
    mov ah,9
    int 21h
    mov ah,4ch
    int 21h
code ends
end start</code></pre>
</div>
<p data-pid="fwhXqB4r">下面对该汇编程序的部分代码进行说明:</p>
<div class="highlight">
<pre><code class="language-text">string db 'Hello,World!$'</code></pre>
</div>
<blockquote data-pid="90vu-t-M"> 定义一个名为string的字符串,string是字符串的名称,db是定义字节说明,字符串内容需用单引号括起,其中 $ 是串的结束标志<br> </blockquote>
<div class="highlight">
<pre><code class="language-text">assume cs:code,ds:data</code></pre>
</div>
<blockquote data-pid="D2C1DZfk"> 这是一条汇编伪指令,含义是指定code段与CS寄存器关联,data段与DS寄存器关联<br> </blockquote>
<div class="highlight">
<pre><code class="language-text">mov dx,offset string</code></pre>
</div>
<blockquote data-pid="f6WbJw4n"> 获取string的偏移地址<br> </blockquote>
<div class="highlight">
<pre><code class="language-text">mov ah,9
int 21h</code></pre>
</div>
<blockquote data-pid="nzNxGT9q"> 调用9号DOS功能(显示字符串 )<br> </blockquote>
<div class="highlight">
<pre><code class="language-text">mov ah,4ch
int 21h</code></pre>
</div>
<blockquote data-pid="-uXusQZP"> 调用程序结束功能<br> </blockquote>
<p data-pid="-2oYx1y-">对比两段代码,显然同样的功能用汇编语言实现起来比用C语言实现起来更加复杂。这是因为汇编语言是低级编程语言,而C语言等是高级编程语言,汇编语言更加接近底层。<strong>程序员用汇编语言来编写程序实际上都是对CPU中的寄存器进行操作,汇编语言编程是针对寄存器来进行编程的。</strong></p>
<h3>二、对源程序进行编译</h3>
<p data-pid="_S9U-AXG">汇编语言程序从设计到形成可执行程序文件,在计算机上的操作过程分为三步:<strong>编辑、汇编、连接</strong>。用文本编辑程序写程序,形成<code>.ASM</code>文件,用汇编程序对<code>.ASM</code>文件进行汇编,形成<code>.OBJ</code>文件,再用连接程序对<code>.OBJ</code>文件进行连接,形成<code>.EXE</code>文件。</p>
<h3>1. 编辑</h3>
<p data-pid="idrx5jn4">新建一个名为<code>HELLO.ASM</code>的文件,用文本编辑器将源程序写入该文件中。</p>
<h3>2. 汇编</h3>
<p data-pid="3KJsBz4S">汇编程序的作用是<strong>把汇编语言源程序翻译成为机器代码,产生二进制格式的目标文件(Object File)</strong></p>
<p data-pid="_W-b6UWN">在DOS中输入以下命令:</p>
<div class="highlight">
<pre><code class="language-powershell"><span class="n">MASM <span class="n">HELLO<span class="p">.<span class="n">ASM</span></span></span></span></code></pre>
</div>
<h3>3. 连接</h3>
<p data-pid="Gv68snZ0">连接就是使用连接程序LINK<strong>把目标文件(OBJ)转换为可执行的EXE文件</strong>。</p>
<p data-pid="nR1LiBlS">在DOS中输入以下命令:</p>
<div class="highlight">
<pre><code class="language-powershell"><span class="n">LINK <span class="n">HELLO<span class="p">.<span class="n">OBJ</span></span></span></span></code></pre>
</div>
<h3>三、在Debug模式下调试程序</h3>
<p data-pid="fYFMJVdR">程序必须经过调试阶段,才能观测结果和发现程序中的错误。</p>
<p data-pid="i0KDE0B5">在DOS中输入以下命令:</p>
<div class="highlight">
<pre><code class="language-text">debug hello.exe</code></pre>
</div>
<p data-pid="Q8QRCfha">&nbsp;</p>
<p data-pid="Q8QRCfha">&nbsp;</p>
<p data-pid="Q8QRCfha">&nbsp;</p>
<p data-pid="Q8QRCfha">用Debug调入HELLO.EXE,出现<code>-</code>Debug命令提示符。在<code>-</code>后可键入Debug命令进行调试。</p>
<h3>四、运行程序</h3>
<p data-pid="BEM5Hrgg">在DOS中输入以下命令:</p>
<div class="highlight">
<pre><code class="language-text">hello.exe</code></pre>
</div>
<p data-pid="Y68jtlcT">运行结果:</p>
<img width="641" class="origin_image zh-lightbox-thumb lazy lazyload" data-size="normal" data-rawwidth="641" data-rawheight="142" data-original="https://pic2.zhimg.com/v2-08538a1e5de85ee0a08f4117c82086ad_r.jpg" data-actualsrc="https://pic2.zhimg.com/v2-08538a1e5de85ee0a08f4117c82086ad_b.jpg" data-lazy-status="ok" data-src="https://pic2.zhimg.com/80/v2-08538a1e5de85ee0a08f4117c82086ad_720w.jpg"></div>
<div class="RichText ztext Post-RichText css-hnrfcf"><br>
<p>&nbsp;</p>
</div>
</div>
</div>
<div class="ContentItem-time">&nbsp;</div>
<div class="css-qbubgm">&nbsp;</div>
<div id="Popover5-toggle" class="ShareMenu-toggler">&nbsp;</div><br><br>
来源:https://www.cnblogs.com/yibeimingyue/p/15699754.html
頁: [1]
查看完整版本: 用汇编语言输出Hello World!