前面我们用到了mov, add. sub指令,它们都带有两个操作对象。到现在,我们知道,mov指令可以有以下几种形式。
mov 寄存器,数据 比如: mov ax,8 mov 寄存器,寄存器 比如: mov ax,bx mov 寄存器,内存单元 比如: mov ax,[0] mov 内存单元,寄存器 比如: mov [0],ax mov 段寄存器,寄存器 比如: mov ds,ax
我们可以根据这些己知指令进行下面的推测。
(l)既然有“mov段寄存器,寄存器”,从寄存器向段寄存器传送数据,那么也应该有“mov寄存器,段寄存器”,从段寄存器向寄存器传送数据。一个合理的设想是:
8086CPU内部有寄存器到段寄存器的通路,那么也应该有相反的通路。
有了推测,我们还要验证一下。进入Debug,用A命令,如图3.4所示。
图3.4中,用A命令在一个预设的地0B39:0100处,用汇编的形式mov ax,ds写入指令,再用T命令执行,可以看到执行的结果,段寄存器ds中的值送到了寄存器ax中。
通过验证我们知道,“mov寄存器,段寄存器”
是正确的指令。
(2)既然有“mov内存单元,寄存器”,从寄存器向内存单元传送数据,那么也应该有“mov内存单元,段寄存器”
,从段寄存器向内存单元传送数据。比如我们可以将段寄存器cs中的内容送入内存10000H处,指令如下。
mov ax,1000H mov ds,ax mov [0],cs
在Debug中进行试验,如图3.5所示。
图3.5中,当CS:IP指向0B39:0105的时候,Debug显示当前的指令mov [0000],cs
因为这是一条访问内存的指令,Debug还显示出指令要访问的内存单元中的内容。由于指令中的CS是一个16位寄存器,所以要访问(写入)的内存单元是一个字单元,它的偏移地址为0,段地址在ds中,Debug在屏幕右边显示出“DS:0000=0000",我们可以知道这个字单元中的内容为O
mov [0000],cs
执行后,CS中的数据(OB39H)被写入1000:0处,1000:1单元存放0BH, 1000:0单元存放39H
最后,用D命令从1000:0开始查看指令执行后内存中的情况,注意1000:0, 1000:1两个单元的内容。
(3) "mov段寄存器,内存单元”也应该可行,比如我们可以用1 0000H处存放的字型数据设置ds(即将1 0000H处存放的字型数据送入ds),指令如下。
mov ax,1000H mov ds,ax mov ds,[0]
可以自行在Debug中进行试验。
add和sub指令同mov一样,都有两个操作对象。它们也可以有以下几种形式。
它们可以对段寄存器进行操作吗?比如“add ds,ax"
。请自行在Debug中试验。