2016-04-15 35 views
-4

爲什麼我們能夠使用x86彙編語言中的MOV指令以這些方式將內存操作數移動到段寄存器?爲什麼mov ds,[bx]和mov ds,[2345H]有效?

這些爲什麼有效?

Mov DS,[Bx] 

Mov DS,[2345H] 
+0

。 MOV是機器命令。 –

+0

他們爲什麼不呢? 'MOV Sreg,r/m16'列在insn參考手冊中。機器碼編碼僅使用正常的mod/rm字節來允許源爲寄存器或內存操作數。請參閱[x86標記wiki](http://stackoverflow.com/tags/x86/info)以獲取手冊的鏈接。 –

+4

我投票結束這個問題作爲題外話,因爲這對未來的讀者沒有價值。該手冊完全回答了整個問題,所以只是RTFM。 –

回答

2

因爲那些是MOV指令的有效形式。 MOV指令允許下列移動(我省略移動從控制和調試寄存器/;詳情見你的CPU手冊):

general-purpose register <- integer constant 
memory <- integer constant 

general-purpose register <- general-purpose register 
memory <- general-purpose register 
general-purpose register <- memory 

segment register <- general-purpose register 
segment register <- memory 
general-purpose register <- segment register 
memory <- segment register 

的CPU不支持MOV指令以下動作:

segment register <- segment register 
segment register <- integer constant 
memory <- memory 

如果你想知道爲什麼,它簡化了CPU中的東西。 CPU需要解碼的指令越少,同樣可能的操作數編碼也越少。當一條指令最多可以訪問一個內存位置時,可能要處理的特殊情況也會減少。大多數說明都是這樣的。這使得設計更簡單,CPU更便宜。有幾條指令可以訪問兩個內存位置,但是它們非常專業化,它們的內存位置不是非常靈活(它們綁定到特定的寄存器)。 PUSH和POP可以在內存和堆棧之間移動數據(堆棧是內存)。 MOVSB/MOVSW/MOVSD將DS:(E | R)SI存儲器中的數據移動到ES:(E | R)DI的存儲器中。

你的彙編器不會讓你MOV WORD [BX], [SI],因爲它知道CPU不能這樣做,CPU根本沒有這樣的指令。這就是現在所有關於它的知識。它的一個機器代碼是