2012-06-20 132 views
0

爲什麼直接值不能直接移入段註冊表(即mov ds 10)?MOV指令限制

此外,爲什麼不能直接複製段寄存器(即mov es,ds)?

.code 
     mov AX,@data 
     mov DS,AX 

爲什麼不能這樣直接被完成:

 mov DS, @data 

任何解釋它爲什麼這樣設計?

+1

*推測*你在說x86,x64架構?還有其他的,你知道的,其中一些*不會受到x86指令集中明顯缺乏正交性的影響。請添加合適的標籤。 –

+0

請重申您的問題,也許增加一些真實的例子。 –

回答

3

這裏的主要問題是指令烯/解碼

X86具有可變的長度的操作碼。它們的範圍可以從單個字節(如nop)到幾個字節,如12字節,類似movl $ 0xdeadbeef,0x12345678(%ebx,%edx,1) 英特爾決定不包含沒有提供真正優勢的指令。 mov segmentregister,就是其中之一。最有可能的原因是,細分市場註冊人不必經常更換。因此,這節省了指令編碼的空間,因此可以節省芯片上的幾個晶體管(與晶體管轉儲相比,可能不是那麼多)。

其他類似於ARM或MIPS的ISA,它們的指令具有固定的編碼大小,通常允許所有寄存器執行相同的操作。在ARM的情況下,即使PC是一個正常的寄存器,也可以讀取一個寫入。

+0

謝謝你的解釋! –

2

因爲不需要編輯這些註冊表(除非在極少數情況下),因爲它們是由操作系統設置的。那麼爲什麼浪費硅來做一些無用的事情?

雖然您可以通過另一個臨時編輯這些註冊表。

+1

這隻適用於32位代碼,而不是16位代碼。 –