目录 上一页 下一页 下一章

-18- PC机汇编语言实战精解

于"CS:IP"指向的内存单元,因此"CS:IP"的改变就意味CPU执行的指令要发生改变。所谓"跳转"的含义也就是如此。
  为了反复执行前三条指令,我们在程序最后用"JMP 100"使CPU重新从"CS:0100"开始执行指令。
  有关JMP还有一些便深入的内容,例如在这个程序中CS寄存器的内容并没有改变,即转移发生在一段之内。那么如果要"跨段"转移又应如何应用JMP指令呢?这个问题暂且留作后话。
  这四条指令构成一个"循环",使61H端口第一位的状态在0、1之间连续变化。但是,如果没有第4,第5条指令,那是无法听到任何声音的。这是因为CPU执行指令的速度极快,61H端口的bit1位变化频率过高,己超出了听觉范围。因此程序在改变了端口61H的状态后应该"拖延"一段时间,再做第二次改变。第4,5条指令的作用就是"拖时间"。
助记符:MOV(Move)
用 途:传递数据
格 式:MOV 寄存器,数字
    MOV 存储器,数字
    MOV 寄存器,存储器
    MOV 存储器,寄存器
    MOV 寄存器,寄存器
执 行:右边的数据被"拷贝"到左边的寄存器或存储单元中。
  同IN,OUT指令有些类似,数据仍然是从"右"传到"左",这实际上汇编语言的一个规律,和高级语言中的"赋值"是一样的。还要注意右边的数据是"拷贝"到左边的寄存器或存储单元中的,因此指令执行以后右边的寄存器或存储美元中的数据没有改变。
从应用格式上看没有"MOV 存储器,存储器"的用法,即MOV指令不能在内存单元之间移动数据。要想直接在内存中移动数据需要使用后面讲的"串操作"指令。另外,段地址寄存器之间也不能进行数据传送,比如"MOV DS,ES"这样的用法也是不对的。如果需要在段寄存器之间传送数据,应该借助其它通用寄存器或内存单元。
  第4条指令把一个数字500H放到CX寄存器中,为"拖时间"作准备。实际上如果把"MOV"指令比作高级语言中的"赋值"语句,那么500H就是一个"常量",在汇编语言中将这种直接出现在指令中的常数称为"立即数"。将被"赋值"的寄存器就相当于是"变量",在C语言中称这种变量为寄存器变量。
  真正在"拖时间"的是第5条指令--LOOP:
助记符:LOOP(Loop)
用 途:根据CX中设定的计数值循环执行一些指令
格 式:LOOP 目的地址
执 行:CX内的循环次数减去1,若CX≠0则CPU转移到指定的目的地址继续执行程序;若CX=0则CPU顺序执行LOOP下面的指令。
  循环是程序设计中重要的技术。学过高级语言的朋友知道,对于有限次循环,应具备的两个主要因素是循环次数和循环体。汇编语言也是这样。只不过它有一些特别的规定:

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章