所谓32位的指针,其实就是以"段:偏移"形式给出的完整的逻辑地址,只是要求段地址在高字,偏移地址在低字而已。应用这个指令要注意两点:
(1)此指令并非要固定与DI寄存器配合,虽然在串处理指令中ES段寄存器与DI寄存器是配合应用的,但是这条指令允许将偏移地址装入其它寄存器中。比如"LES SI,存储器"、"LES AX,存储器"这样的用法都可以;
(2)与指令LEA不同,这个指令是真正要从内存中取得指针。不过在内存中定义指针时要采用定义"双字"的伪指令。前面我们讲过伪指令DB和DW,DB可以定义一个BYTE,DW可以定义一个WORD,如果要定义一个"双字"就要使用伪指令"DD(Define Double word)"。如果32位指针不是使用DD伪指令定义的,则使用LES指令编制的程序会出现编译错误。
段地址并不是只能装入ES寄存器,还可以装入DS寄存器,相应的指令就是LDS(Load DS with pointer),用法及注意事项与LES指令相同,不再过多讨论。
通过前面的学习我们已经知道有一些指令能够控制CPU的运行状态,比如NOP、STI等。8086/88还有一些专门控制处理机的指令,这些指令虽说是极其不常用,不过在这里简单介绍一下也算是让这一章有个比较圆满的结束。
I 停机指令HLT:
这条指令可以使CPU暂时停止执行下面的指令,直到有一次外部中断产生,中断结束后CPU才继续执行下面的程序。
II 等待指令WAIT:
这个指令同样使CPU停止执行下面的指令,直到产生一次外部中断。不过与HLT指令不同,中断结束后CPU仍然要回到WAIT指令继续等待。
III 换码指令ESC:
这个指令的应用格式为"ESC 存储器",它可以把指定存储单元中的数据送到数据总线上去。如果一台计算机中有多个处理器,比如有一个中央处理器和一个数学协处理器,那么应用此指令能够使两个处理器协调工作。
IV 封锁指令LOCK
这个指令与REP一样是一个前缀,它后面可以跟任意指令。此指令前缀的用途是封锁系统总线,直到它后加的指令执行完为止。在具有几个处理器的系统中,当CPU与其它处理器协同工作时,此指令前缀能保证总线传输信号的完整性。
通过这一章我们可以看到8086/88的指令系统比较复杂,而且各指令的利用率差别很大,像"MOV"、"PUSH"这样的指令使用十分频繁,而像"LAHF"、"CMC"这样的指令使用的机会就不多了。由此看来我们完全可以精简CPU的指令系统,舍弃那些不常用的指令。
这样做可以减少CPU中晶体管的数目,减少晶体管意味着降低耗电量和发热。如果不减少晶体管数目,我们也可以把更多的晶体管用于加快那些常用指令的执行速度。笔者不具备设计CPU的能力,但这的确是个思路。