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]