-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 |