x86
通用暫存器少,64位架構下只有16個。32位的只有8個。而且很多指令隱形的依賴或修改通用暫存器。8個使用有嚴格的限制,8個可以自由使用。這造成為了遵守這些暫存器使用規則,經常需要將暫存器之間的資料互相移動。
因為有限的通用暫存器數量以及其中還有限制使用規則,為指令分配使用的暫存器時,經常會出現一些指令本沒有依賴關係,現在共用同一個暫存器而出現了依賴關係。
這對於處理器流水線技術來說非常不友好,因為指令之間存在依賴關係時,後一個指令需要等待前一個指令執行完畢才能執行。這不能發揮流水線的優點了。而為了實現高效能,則需要新增暫存器重新命名技術,將指令之間虛擬的依賴關係取出。
x86指令可變長度,而且是其中最糟糕的一種,確定一條指令有多少位元組,需要從指令第一個位元組逐個檢測。現有x86指令結構最長15個位元組,內部結構最多可劃分成七八個部分。前一個部分確定了,才能確定下一個部分,直至確定指令末尾。
這種複雜結構,對處理器指令解碼模組非常不好,需要很多數量電晶體實現解碼功能。
而MIPS結構指令長度固定的,32位,4個位元組。也就是說解碼無須瞭解指令內部特徵,就可以快速知道下一個指令的位置。指令地址+4就可以了。而且MIPS指令內部結構也非常簡單。同樣的解碼模組使用很少 的電晶體就可以是實現解碼了。
8086實現為了提供20位地址空間,1兆位元組的能力,設計了一個分段機制,因為16位通用暫存器只有16位地址訪問能力。所以專門設計了一組段暫存器。每次訪問記憶體時,都用段暫存器內的段基地址加上通用暫存器內的地址,得到一個20位地址。
到了32位時代,其實這種分段機制可以徹底去掉,因為32位通用暫存器就有32位地址訪問能力,4G位元組記憶體。但是x86依然保留了這種分段機制,而且結果比原來的段暫存器還更復雜了。可是實際的作業系統不管WINDOWS還是LINUX都沒有使用這種分段機制。這些作業系統透過對段暫存器以及相關結構透過合理設定,使得段基地址值為0。在軟體層面相當於沒有使用分段機制。但是處理器卻必須實現這個分段機制。每次指令訪問記憶體時,都需要段基地址加上通用暫存器內的地址,哪怕段基地址為0。實際上處理器上實現分段機制的模組完全多餘,但是x86必須實現該功能。
x86有很多種定址機制。有幾種定址方式極少使用,結構也非常複雜,對於處理器設計有非常不友好。為了實現定址機制,也需要大量的處理器設計。
x86中有很多為了減少程式中指令數量而設計的指令,就是將多條指令的功能合併到一條指令上。雖然在效果上它們是相等的。但是這種超級指令,也對處理器設計增加了負擔。
x86到目前為止指令總數非常大,處理器內對指令的解碼和執行指令的功能,相關的電晶體數量需要很大數量。其實x86中很多指令都可以拆解成多個功能更基本的指令。
雖然現在的x86內部採取了RISC精簡指令的設計思想,內部使用少量基本的指令表示。x86指令被解碼器處理後可能拆解成多個x86內部RISC指令,再做後續處理。但是這本身還是需要一定複雜的結構實現它的。
總之,指令結構複雜,增加了解碼模組的負擔。指令數量多,增加功能執行模組的負擔。
x86
通用暫存器少,64位架構下只有16個。32位的只有8個。而且很多指令隱形的依賴或修改通用暫存器。8個使用有嚴格的限制,8個可以自由使用。這造成為了遵守這些暫存器使用規則,經常需要將暫存器之間的資料互相移動。
因為有限的通用暫存器數量以及其中還有限制使用規則,為指令分配使用的暫存器時,經常會出現一些指令本沒有依賴關係,現在共用同一個暫存器而出現了依賴關係。
這對於處理器流水線技術來說非常不友好,因為指令之間存在依賴關係時,後一個指令需要等待前一個指令執行完畢才能執行。這不能發揮流水線的優點了。而為了實現高效能,則需要新增暫存器重新命名技術,將指令之間虛擬的依賴關係取出。
x86指令可變長度,而且是其中最糟糕的一種,確定一條指令有多少位元組,需要從指令第一個位元組逐個檢測。現有x86指令結構最長15個位元組,內部結構最多可劃分成七八個部分。前一個部分確定了,才能確定下一個部分,直至確定指令末尾。
這種複雜結構,對處理器指令解碼模組非常不好,需要很多數量電晶體實現解碼功能。
而MIPS結構指令長度固定的,32位,4個位元組。也就是說解碼無須瞭解指令內部特徵,就可以快速知道下一個指令的位置。指令地址+4就可以了。而且MIPS指令內部結構也非常簡單。同樣的解碼模組使用很少 的電晶體就可以是實現解碼了。
8086實現為了提供20位地址空間,1兆位元組的能力,設計了一個分段機制,因為16位通用暫存器只有16位地址訪問能力。所以專門設計了一組段暫存器。每次訪問記憶體時,都用段暫存器內的段基地址加上通用暫存器內的地址,得到一個20位地址。
到了32位時代,其實這種分段機制可以徹底去掉,因為32位通用暫存器就有32位地址訪問能力,4G位元組記憶體。但是x86依然保留了這種分段機制,而且結果比原來的段暫存器還更復雜了。可是實際的作業系統不管WINDOWS還是LINUX都沒有使用這種分段機制。這些作業系統透過對段暫存器以及相關結構透過合理設定,使得段基地址值為0。在軟體層面相當於沒有使用分段機制。但是處理器卻必須實現這個分段機制。每次指令訪問記憶體時,都需要段基地址加上通用暫存器內的地址,哪怕段基地址為0。實際上處理器上實現分段機制的模組完全多餘,但是x86必須實現該功能。
x86有很多種定址機制。有幾種定址方式極少使用,結構也非常複雜,對於處理器設計有非常不友好。為了實現定址機制,也需要大量的處理器設計。
x86中有很多為了減少程式中指令數量而設計的指令,就是將多條指令的功能合併到一條指令上。雖然在效果上它們是相等的。但是這種超級指令,也對處理器設計增加了負擔。
x86到目前為止指令總數非常大,處理器內對指令的解碼和執行指令的功能,相關的電晶體數量需要很大數量。其實x86中很多指令都可以拆解成多個功能更基本的指令。
雖然現在的x86內部採取了RISC精簡指令的設計思想,內部使用少量基本的指令表示。x86指令被解碼器處理後可能拆解成多個x86內部RISC指令,再做後續處理。但是這本身還是需要一定複雜的結構實現它的。
總之,指令結構複雜,增加了解碼模組的負擔。指令數量多,增加功能執行模組的負擔。