匯編 | mov. add. sub指令


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

我們可以根據這些己知指令進行下面的推測。

  1. 既然有 “mov段寄存器,寄存器”,從寄存器向段寄存器傳送數據,

    那么也應該有 “mov寄存器,段寄存器” ,從段寄存器向寄存器傳送數據。

    一個合理的設想是:8086CPU內部有寄存器到段寄存器的通路,那么也應該有相反的通路。
    有了推測,我們還要驗證一下。進入Debug,用 \(-A\)​​​​ 命令,如下圖3.4所示。

圖中,用A命令在一個預設的地 \(0B39:0100\)​處,用匯編的形式 mov ax,ds 寫入指令,再用T命令執行,可以看到執行的結果,段寄存器 ds 中的值送到了寄存器 ax 中。

通過驗證我們知道,“mov寄存器,段寄存器”是正確的指令。

  1. 既然有 “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\)兩個單元的內容。

  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中試驗。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM