千夫长 發表於 2020-1-20 09:13:02

asm基础——汇编指令之in/out指令

<p><strong>x86中的IO端口访问</strong><br />
</p>
<p>汇编是直接面向硬件的,它可以访问系统的mem空间,也可以直接访问系统的io空间。</p>
<p>汇编中使用in/out来访问系统的io空间。</p>
<p><strong>IN</strong><br />
</p>
<p>从端口输入</p>
<p>
<table>
<tbody>
    <tr>
      <td>
      <p>OF</p>
      </td>
      <td>
      <p>DF</p>
      </td>
      <td>
      <p>IF</p>
      </td>
      <td>
      <p>SF</p>
      </td>
      <td>
      <p>ZF</p>
      </td>
      <td>
      <p>AF</p>
      </td>
      <td>
      <p>PF</p>
      </td>
      <td>
      <p>CF</p>
      </td>
    </tr>
    <tr>
      <td>
      <p></p>
      </td>
      <td></td>
      <td></td>
      <td>
      <p></p>
      </td>
      <td>
      <p></p>
      </td>
      <td>
      <p></p>
      </td>
      <td>
      <p></p>
      </td>
      <td>
      <p></p>
      </td>
    </tr>
</tbody>
</table>
</p>
<p>说明:从端口输入一个字节或字到AL或AX中(IA-32处理器上可以输入一个双字到EAX)。源操作数是端口地址,可以是8位的常量或者DX中的一个16位地址。</p>
<p>指令格式:</p>
<div class="jb51code">
<pre class="brush:plain;">
in accum, imm (应该不需要是8位,可以是16位,比如3F8h)
in accum, dx
</pre>
</div>
<p>下面是一个例子,对in做了一层包装:</p>
<div class="jb51code">
<pre class="brush:plain;">
UINT8
IoRead8 (
IN   UINTN         Port
)
{
UINT8Data;

__asm {
mov dx, word ptr
in al, dx

mov Data, al
}
return Data;
}</pre>
</div>
<p><strong>OUT</strong><br />
</p>
<p>输出到端口。</p>
<p>
<table>
<tbody>
    <tr>
      <td>
      <p>OF</p>
      </td>
      <td>
      <p>DF</p>
      </td>
      <td>
      <p>IF</p>
      </td>
      <td>
      <p>SF</p>
      </td>
      <td>
      <p>ZF</p>
      </td>
      <td>
      <p>AF</p>
      </td>
      <td>
      <p>PF</p>
      </td>
      <td>
      <p>CF</p>
      </td>
    </tr>
    <tr>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
</tbody>
</table>
</p>
<p>说明:将累加器中的一个字节或字输出到端口(IA-32处理器上可以向端口输出一个双字)。端口地址如果在范围0-FFh之间,可以是一个常量,也可以在DX中存放0-FFFFh之间的端口地址。</p>
<p>指令格式:</p>
<div class="jb51code">
<pre class="brush:plain;">
out imm8, accum(应该不需要是8位,可以是16位,比如3F8h)
out dx, accum
</pre>
</div>
<p>下面是一个例子,对out做了一层包装:</p>
<div class="jb51code">
<pre class="brush:plain;">
UINT8
IoWrite8 (
IN   UINTN         Port,
IN   UINT8         Value
)
{
__asm {
mov al, byte ptr
mov dx, word ptr
out dx, al
}
return Value;
}
</pre>
</div>
<p>注意,io地址要么是立即数,要么放在dx寄存器中;而数据也都放在al/ax/eax寄存器中,不能是其他寄存器。<br />
</p>
<p>以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持琼殿技术社区。</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>汇编中的数组分配和指针的实现代码</li><li>汇编语言 寄存器内存访问原理解析</li><li>汇编语言入门教程(这一篇足矣)</li><li>王爽 汇编语言学习笔记(详细)</li><li>汇编语言软件延时1s的实现方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: asm基础——汇编指令之in/out指令