⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 page18.html

📁 编者李春生
💻 HTML
字号:
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=gb2312">
<title>第2章 开始设计程序</title>
</head>

<body>
<style type="text/css">
body {
	background-color: #c0c0c0;
}

table {
	background-color: #c0c0c0;
	line-height: 24px;
}
</style>
<!导航条>
<p><a href="content1.html">目录</a> <a href="page17.html">上一页</a> <a href="page19.html">下一页</a> <a href="page27.html">下一章</a></p>
<table 	border=0 align="center" width=800 frame="box" rules="none">
<!标尺行>
<tr>
<td width=3%></td><td width=6%></td><td width=1%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td><td width=5%></td>
<td width=1%></td><td width=6%></td><td width=3%></td>
</tr>
<!页眉行>
<tr height=60 valign="bottom">
<td></td><td>-18-</td><td></td> <!页码>
<td colspan=6>PC机汇编语言实战精解</td><td colspan=4></td><td colspan=6 align="right"><img src="icons/flag.gif"></td> <!书名>
<td></td><td></td><td></td> <!右侧空白>
</tr>
<!页眉线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!正文>
<font face="宋体" lang="ZH-CN" size=3>
<tr height=20><td colspan=22></td></tr> <!顶部空白>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
于"CS:IP"指向的内存单元,因此"CS:IP"的改变就意味CPU执行的指令要发生改变。所谓"跳转"的含义也就是如此。<br>
  为了反复执行前三条指令,我们在程序最后用"JMP 100"使CPU重新从"CS:0100"开始执行指令。<br>
  有关JMP还有一些便深入的内容,例如在这个程序中CS寄存器的内容并没有改变,即转移发生在一段之内。那么如果要"跨段"转移又应如何应用JMP指令呢?这个问题暂且留作后话。<br>
  这四条指令构成一个"循环",使61H端口第一位的状态在0、1之间连续变化。但是,如果没有第4,第5条指令,那是无法听到任何声音的。这是因为CPU执行指令的速度极快,61H端口的bit1位变化频率过高,己超出了听觉范围。因此程序在改变了端口61H的状态后应该"拖延"一段时间,再做第二次改变。第4,5条指令的作用就是"拖时间"。
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=3 align="center"><img src="icons/note.gif"></td>
<td colspan=15>
助记符:MOV(Move)<br>
用 途:传递数据<br>
格 式:MOV  寄存器,数字<br>
    MOV  存储器,数字<br>
    MOV  寄存器,存储器<br>
    MOV  存储器,寄存器<br>
    MOV  寄存器,寄存器<br>
执 行:右边的数据被"拷贝"到左边的寄存器或存储单元中。
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  同IN,OUT指令有些类似,数据仍然是从"右"传到"左",这实际上汇编语言的一个规律,和高级语言中的"赋值"是一样的。还要注意右边的数据是"拷贝"到左边的寄存器或存储单元中的,因此指令执行以后右边的寄存器或存储美元中的数据没有改变。
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=3 align="center"><img src="icons/attention.gif"></td>
<td colspan=15><FONT FACE="楷体_GB2312" LANG="ZH-CN" SIZE=3>
从应用格式上看没有"MOV 存储器,存储器"的用法,即MOV指令不能在内存单元之间移动数据。要想直接在内存中移动数据需要使用后面讲的"串操作"指令。另外,段地址寄存器之间也不能进行数据传送,比如"MOV DS,ES"这样的用法也是不对的。如果需要在段寄存器之间传送数据,应该借助其它通用寄存器或内存单元。
</font></td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  第4条指令把一个数字500H放到CX寄存器中,为"拖时间"作准备。实际上如果把"MOV"指令比作高级语言中的"赋值"语句,那么500H就是一个"常量",在汇编语言中将这种直接出现在指令中的常数称为"立即数"。将被"赋值"的寄存器就相当于是"变量",在C语言中称这种变量为寄存器变量。<br>
  真正在"拖时间"的是第5条指令--LOOP:
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=3 align="center"><img src="icons/note.gif"></td>
<td colspan=15>
助记符:LOOP(Loop)<br>
用 途:根据CX中设定的计数值循环执行一些指令<br>
格 式:LOOP  目的地址<br>
执 行:CX内的循环次数减去1,若CX≠0则CPU转移到指定的目的地址继续执行程序;若CX=0则CPU顺序执行LOOP下面的指令。
</td>
<td></td><td></td> <!右边距>
</tr>

<tr>
<td></td><td></td> <!左边距>
<td colspan=18>
  循环是程序设计中重要的技术。学过高级语言的朋友知道,对于有限次循环,应具备的两个主要因素是循环次数和循环体。汇编语言也是这样。只不过它有一些特别的规定:
</td>
<td></td><td></td> <!右边距>
</tr>

</font>

<!页脚线>
<tr valign="top">
<td></td><td colspan=20><hr></td><td></td>
</tr>
<!页脚>
<tr height=60 valign="top">
<td></td><td></td>
<td colspan=9><i>Copyright &copy; 2004-2005 <a href="mailto:webmaster@nucstorm.com">Chunk Lee</a></i></td>
<td colspan=9 align="right"><i><a href="http://www.nucstorm.com" target="_top">www.nucstorm.com</a></i></td>
<td></td><td></td>
</tr>
</table>
<!导航条>
<p align="right"><a href="content1.html">目录</a> <a href="page17.html">上一页</a> <a href="page19.html">下一页</a> <a href="page27.html">下一章</a></p>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -