Description
前面我們用到了mov, add. sub指令,它們都帶有兩個操作對象。到現在,我們知道,mov指令可以有以下幾種形式。
mov 寄存器,數據 比如: mov ax,8
mov 寄存器,寄存器 比如: mov ax,bx
mov 寄存器,內存單元 比如: mov ax,[0]
mov 內存單元,寄存器 比如: mov [0],ax
mov 段寄存器,寄存器 比如: mov ds,ax
我們可以根據這些己知指令進行下面的推測。
-
既然有
“mov段寄存器,寄存器”
,從寄存器向段寄存器傳送數據,那么也應該有
“mov寄存器,段寄存器”
,從段寄存器向寄存器傳送數據。一個合理的設想是:8086CPU內部有寄存器到段寄存器的通路,那么也應該有相反的通路。
有了推測,我們還要驗證一下。進入Debug,用 \(-A\) 命令,如下圖3.4所示。
圖中,用A命令在一個預設的地 \(0B39:0100\)處,用匯編的形式 mov ax,ds
寫入指令,再用T命令執行,可以看到執行的結果,段寄存器 ds
中的值送到了寄存器 ax
中。
通過驗證我們知道,“mov寄存器,段寄存器”
是正確的指令。
-
既然有
“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\)",我們可以知道這個字單元中的內容為 \(0\)
mov [0000],cs
執行后,CS中的數據(\(0B39H\) )被寫入 \(1000:0\) 處,\(1000:1\) 單元存放 \(0BH, 1000:0\) 單元存放 \(39H\)
最后,用D命令從 \(1000:0\) 開始查看指令執行后內存中的情況,注意\(1000:0, 1000:1\)兩個單元的內容。
- "mov段寄存器,內存單元”也應該可行,比如我們可以用1 0000H處存放的字型數據設置ds(即將1 0000H處存放的字型數據送入ds),指令如下。
mov ax,1000H
mov ds,ax
mov ds,[0]
可以自行在Debug中進行試驗。
add和sub指令同mov一樣,都有兩個操作對象。它們也可以有以下幾種形式。
它們可以對段寄存器進行操作嗎?比如“add ds,ax"
。請自行在Debug中試驗。