如果我正在爲8位計算機創建指令集,是否可能對某些指令使用2位操作碼和某些指令使用3位操作碼?當然,每個操作碼的值都會有所不同。彙編操作代碼問題
我有3種類型的指令,其操作碼爲00 我有3個i型指令,操作碼爲01,11和10 然後我可以用操作碼100做出指令嗎?
如果我正在爲8位計算機創建指令集,是否可能對某些指令使用2位操作碼和某些指令使用3位操作碼?當然,每個操作碼的值都會有所不同。彙編操作代碼問題
我有3種類型的指令,其操作碼爲00 我有3個i型指令,操作碼爲01,11和10 然後我可以用操作碼100做出指令嗎?
如果您希望您的操作碼具有不同的長度,那麼您必須確保沒有較短的操作碼是較長操作碼的子字符串。也就是說,如果您有兩位操作碼01
和一個三位操作碼010
,您的解碼器將如何區分?
我假設你正試圖將操作碼和操作數合併爲一個8位數量,並將其視爲一條記錄。因此,例如,您可能有指令01000111
,其中前兩位是操作碼,後三位是第一個操作數,後三位是第二個操作數。
如果您有兩個操作碼01
和010
,那麼您的解碼器如何在這兩種解釋之間做出決定?
01 000 111 - opcode 01, two three-bit arguments
010 00 111 - opcode 010, a two-bit argument, and a three-bit argument
如果您確實需要不同長度的操作碼,則需要爲較長的操作碼保留前綴字符串。因此,您可以使用兩位指令00
,01
和10
,並且所有更長的指令都以11
開頭。
因此,如果我有操作碼00,01和10,我可以有操作碼110嗎? – cjw
是的。然後是111或1110和1111或11100,11101,11110,11111等 –
看看手臂的拇指指令集,它們會顯示一個很好的操作碼地圖,它以某種方式與您所說的相關。或者在github尋找lsasim,在那裏我發明了自己的指令集,一些指令只需要4位操作碼就能找出指令需要的東西8.
我假設你問的是8位指令?正如湯姆說你控制水平,你控制垂直,你可以做任何你想做的事情。你不會得到太多出兩位opcides,也許你只有兩個支持這些操作碼,例如寄存器:
00riiiii store pc relative, r = 0 means register r0, r = 1 means register r1 iiiii is sign extended and added to the program counter for the store address
01riiiii load pc relative
在這一點上,雖然你已經完全消耗掉你的操作碼空間的一半,如果你限制自己一個固定的8位指令集。你沒有指定你在做什麼。與我的思想繼續所有0xxxxxxx操作碼目前被消耗,你必須用1
1000ssddd move rd to rs (assumes rs = r0 to r3 and rd = r0 to r7
1001ssddd move rs to rd
1010ssddd add rs=rs+rd
1011ssddd sub rs=rs-rd
一個等
可以製作任何你想要開始休息。關鍵是它要的東西你可以解碼,這將是有效的
100ss0dd some operation
100ss1dd another operation
但這並不:
100ss0dd some operation
100ss1dd another operation
10iiiiii branch to pc plus sign extended immediate
,因爲你不能唯一地從其他兩個,當你解碼第三指令看到10xxxxxx是它的一個分支嗎?如果第2位是0,並且第2位是1,那麼也不是。
在這方面,arm/thumb操作碼錶格非常精細,從頂部開始,操作碼位數更少,操作數位更少,您需要首先選擇這些指令,但要明白它們會佔用您的大部分操作碼空間。那麼您的操作數越少操作碼越長。
當然。其中一個2位指令將成爲第三位的轉義碼。壞消息是它無法在這個範圍內擴展你的操作碼範圍。在4位操作碼序列的順序上更有效,可以跳轉到8位或某些...
另一個權衡是在狀態寄存器中有一個模式位。你一次只有4條指令,但是你可以在內存中寫入一個MOV風格的指令(如8086系列)。請參閱65C816(ab?)使用許多模式。
如果你正在創建指令集,爲什麼它不可能?你控制水平,你控制垂直。 –
只要確保沒有歧義,例如你不能有兩位操作碼11和一個三位操作碼111(假設其餘的位全部用於指定操作數等)。 –
詳細闡述你想要做什麼。到目前爲止你的指令是什麼?指示有多大? – Bullets