-4
爲什麼我們能夠使用x86彙編語言中的MOV
指令以這些方式將內存操作數移動到段寄存器?爲什麼mov ds,[bx]和mov ds,[2345H]有效?
這些爲什麼有效?
Mov DS,[Bx]
Mov DS,[2345H]
爲什麼我們能夠使用x86彙編語言中的MOV
指令以這些方式將內存操作數移動到段寄存器?爲什麼mov ds,[bx]和mov ds,[2345H]有效?
這些爲什麼有效?
Mov DS,[Bx]
Mov DS,[2345H]
因爲那些是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根本沒有這樣的指令。這就是現在所有關於它的知識。它的一個機器代碼是
。 MOV是機器命令。 –
他們爲什麼不呢? 'MOV Sreg,r/m16'列在insn參考手冊中。機器碼編碼僅使用正常的mod/rm字節來允許源爲寄存器或內存操作數。請參閱[x86標記wiki](http://stackoverflow.com/tags/x86/info)以獲取手冊的鏈接。 –
我投票結束這個問題作爲題外話,因爲這對未來的讀者沒有價值。該手冊完全回答了整個問題,所以只是RTFM。 –