汇编 端口 shl和shr指令
1 端口
CPU可以直接读写以下3个地方的数据:
1.1 端口的读写
-
解决了串/并行 改变的问题
-
对端口的读写不能用mov,push,pop等;只有in
和out
-
访问端口:
in al,60h ;从60h号端口读入一个字节
-
对0~255
以内的端口进行读写时:
in al,20h ;20h端口读入一个字节
out 20h,al ;往20h端口写入一个字节
对256~65535
的端口进行读写时,端口号放在dx
中
mov dx,3f8h ;将端口号3f8h送入dx
in al,dx ;从3f8h端口 读入 一个字节
out dx,al ;向3f8h端口 写入 一个字节
1.2 CMOS RAM芯片
- 用途:写时间,时间错误时,计算机不工作。
- 地址端口:70h
数据端口:71h
1.3 shl 和 shr 指令
-
定义:是逻辑移位指令
-
shl
:是左移
指令
(1)将一个寄存器或寄存单元中的数据向左移位。
(2)将最后移除的移位写入CF
中。
(3)最低位用0补充。
eg.
指令:
mov al, 01001000b
shl al,1 ;将al中的数据左移一位
执行后:(al)=10010000b CF=0
(1)左移
原数据: 01001000
左移后: 01001000
(2)将最后移除的移位写入CF中
原数据: 01001000
左移后: 1001000 CF=0
(3)最低位用0补充
原数据: 01001000
左移后: 10010000
-
shr
是逻辑右移
指令,它和shl
所进行的操作刚好相反
(1) 将一个寄存器or内存单元中的数据向右移位。
(2)将最后移出的一位写入CF
中。
(3)最高位用0补充。
<h2><a id="1__0"></a>1 端口</h2>
<p>CPU可以直接读写以下3个地方的数据:</p>
<ul>
<li>CPU内部的寄存器</li>
<li>内存单元</li>
<li>端口</li>
</ul>
<h3><a id="11__6"></a>1.1 端口的读写</h3>
<ol>
<li>
<p>解决了串/并行 改变的问题</p>
</li>
<li>
<p>对端口的读写不能用mov,push,pop等;只有<code>in</code>和<code>out</code></p>
</li>
<li>
<p>访问端口:</p>
<pre><div class="hljs"><code class="lang-c">in al,<span class="hljs-number">60</span>h ;从<span class="hljs-number">60</span>h号端口读入一个字节
</code></div></pre>
</li>
<li>
<p>对<code>0~255</code>以内的端口进行读写时:</p>
<pre><div class="hljs"><code class="lang-c">in al,<span class="hljs-number">20</span>h ;<span class="hljs-number">20</span>h端口读入一个字节
out <span class="hljs-number">20</span>h,al ;往<span class="hljs-number">20</span>h端口写入一个字节
</code></div></pre>
<p>对<code>256~65535</code> 的端口进行读写时,端口号放在<code>dx</code>中</p>
<pre><div class="hljs"><code class="lang-c">mov dx,<span class="hljs-number">3f</span>8h ;将端口号<span class="hljs-number">3f</span>8h送入dx
in al,dx ;从<span class="hljs-number">3f</span>8h端口 读入 一个字节
out dx,al ;向<span class="hljs-number">3f</span>8h端口 写入 一个字节
</code></div></pre>
</li>
</ol>
<h3><a id="12_CMOS_RAM_26"></a>1.2 CMOS RAM芯片</h3>
<ol>
<li>用途:写时间,时间错误时,计算机不工作。</li>
<li>地址端口:70h<br />
数据端口:71h</li>
</ol>
<h3><a id="13_shl__shr__31"></a>1.3 shl 和 shr 指令</h3>
<ol>
<li>
<p>定义:是逻辑移位指令</p>
</li>
<li>
<p><code>shl</code>:是<code>左移</code>指令<br />
(1)将一个寄存器或寄存单元中的数据向左移位。<br />
(2)将最后移除的移位写入<code>CF</code>中。<br />
(3)最低位用0补充。<br />
eg.</p>
<pre><div class="hljs"><code class="lang-c">指令:
mov al, <span class="hljs-number">01001000b</span>
shl al,<span class="hljs-number">1</span> ;将al中的数据左移一位
执行后:(al)=<span class="hljs-number">10010000b</span> CF=<span class="hljs-number">0</span>
(<span class="hljs-number">1</span>)左移
原数据: <span class="hljs-number">01001000</span>
左移后: <span class="hljs-number">01001000</span>
(<span class="hljs-number">2</span>)将最后移除的移位写入CF中
原数据: <span class="hljs-number">01001000</span>
左移后: <span class="hljs-number">1001000</span> CF=<span class="hljs-number">0</span>
(<span class="hljs-number">3</span>)最低位用<span class="hljs-number">0</span>补充
原数据: <span class="hljs-number">01001000</span>
左移后: <span class="hljs-number">10010000</span>
</code></div></pre>
</li>
<li>
<p><code>shr</code> 是<code>逻辑右移</code>指令,它和<code>shl</code>所进行的操作刚好相反<br />
(1) 将一个寄存器or内存单元中的数据向右移位。<br />
(2)将最后移出的一位写入<code>CF</code>中。<br />
(3)最高位用0补充。</p>
</li>
</ol>
留言