2009-05-29 37 views
6

我看到這樣的代碼:因爲它的使用累加寄存器爲什麼mov指令直接使用ax而不是兩個段寄存器?

mov ds, cs 
mov es, cs 

是第一種方式速度快:

mov ax, cs 
mov ds, ax 
mov es, ax 

爲什麼我不能只是壓縮這?但這似乎並不直觀,因爲cs和ds是段寄存器。還是有一些我不知道的限制?

我正在使用nasm。

回答

9

你不能mov段寄存器段寄存器 - 沒有指令。

+0

當我。首先閱讀你的回覆,我沒有聽過即使你,但在NASM的文檔中,果然,沒有mov reg_dseg,reg_cseg指令。 – samoz 2009-05-29 20:57:17

+0

這不是原因,它是結果。 – 2009-05-29 20:58:25

+1

什麼?我不明白你的意思是尼爾。 – samoz 2009-05-29 21:06:09

1

微處理器的所有指令只有很多處理器的空間。所以一個通用指令通常比幾個特殊用途的指令更適用於很少使用的操作變化段寄存器。另外,對於某些處理器,指令的數量完全受限於架構 - 例如,原始8080處理器限制爲256條指令,因爲它們必須將操作碼編碼爲單個字節。

1

這不是真正的彙編語言,而是防止這些操作的底層機器語言。

雖然程序集由易於閱讀的單詞或助記符組成,但它們實際上直接代表機器代碼的1和0。在x86 CPU上,每條指令通常由一系列字節組成,每個字節在字節內具有單個字節或偶數位,具有含義。某些位代表指令,其他代表addressing mode。在寄存器尋址模式(例如您的示例)中,某些位表示將使用哪些特定寄存器作爲mov指令的源和目標。

現在x86處理器系列可以回溯到20世紀70年代CPU架構更簡單的時代。在那些日子裏,的概念非常重要 - ax是16位x86累加器。所有計算都在本寄存器中建立或「累積」,以便所有指令都可用。其他通用寄存器的使用範圍更加有限。

由於指令基於所需的字節,因此需要儘可能少的字節來表示儘可能快的指令解碼指令。爲了儘可能縮短指令的使用時間,蓄電池的使用是最重要的。

在比較現代的CPU上,比如摩托羅拉680x0更多的通用寄存器具有更多的能力,這些先前是累加器的領域。在RISC CPU上,所有寄存器都像累加器一樣靈活。我聽說在64位模式下,當前的x86/amd64指令集現在受到的限制更少。

1

查看Intel Manual Volume 2 Instruction Set Reference - 325383-056US September 2015「MOV Move」列「指令」。

mov r/m16, Sreg 

與「3.1.1:

的唯一的16位MOV到寄存器中被編碼。在操作碼彙總表」 3個指令列說明:

  • R/M16 - 使用的指令,其操作數大小 屬性是16個比特的字通用寄存器或存儲器操作數字通用寄存器。 :。AX,CX,DX,BX,SP,BP,SI,DI
  • SREG - 甲段寄存器

因此mov ds, cs不是可編碼,因爲沒有mov Sreg, Sreg版本

相關問題