2016-04-29 72 views
1

我正在嘗試編寫一個小的8086+彙編程序,可能只是實模式,並且可以解決大部分可能的指令。針對x86的更接近金屬的替代彙編語法?

x86指令很複雜,需要一個複雜的表格解決方案,這很好,但我希望更小/更簡單。

我的一個想法是先從操作碼開始,製作一套更接近實際機器指令的備選記憶/尋址模式/寄存器。

這樣做了嗎?我可以在哪裏閱讀?我的直覺告訴我們,這一定已經做到了,但我在網上找不到任何東西。

事情我已經看着:

  • AT & T語法:不解決這個問題,你還需要一個複雜的 表查找;最後它與Intel語法基本相同。

  • CRASM512.ASM:一個很酷的512字節技巧彙編器。非常令人印象深刻,但 不可用(並不意味着)。該語法仍然基於英特爾 。

  • 僅使用「均勻編碼」指令的子集。這是我目前正在嘗試的 ,並且使用比完整的x86彙編程序更小且更簡單的表 驅動的方法。

    問題是我仍然需要檢查無效指令,而且x86足夠複雜,我只能使表驅動方法變得簡單一點,而不是簡單。所以這個結果的10%是複雜度的90%,因爲它大部分是與真實交易相比變化的表。

+2

與大多數平臺(和其他語言)相比,8086彙編器很容易,所以您的目標是什麼?如果你只是想學習如何,那麼我建議構建一個8086彙編器的簡化子集,並繼續擴展它的功能,直到你有一個完整的8086彙編器。我能夠在大約1000行Python中編寫一個PIC16F彙編程序(大約在2008年),並且在大約2500行C中(大約在2001年)編寫80286彙編程序,因此這些彙編程序在任何時間段都不算大。你想在8086彙編器中實現這個嗎?即便如此,如果你組織好代碼,它應該相當簡單。 –

+0

是的,一個普通的x86彙編器很簡單(使用表驅動的方法),但已經完成。 我想讓我的體型更小,同時仍然可用/有用,所以我正在尋找任何切角。 無論如何,看x86指令與助記符,關於備用助記符集(等)的問題只是要問。 –

+1

好的,所以你希望比......彙編更接近金屬?你意識到它是裸機,對吧?它是數字指令編碼的一種表示形式,它儘可能地接近你的想法。也許你希望能夠代表的例子有助於澄清這一點? –

回答

4

是一個大大-過於簡化架構(for teaching purposes),但實現你的一個想法:不是有數不勝數的那些根本不同的事物有不同的形式的mov,它有三種不同的不同的助記符mov樣操作碼,它支持:

  • irmovl V, %rB:即時 - > REG
  • rmmovl %rA, D(%rB):REG - >存儲器(存儲)
  • mrmovl D(%rB), %rA:存儲器 - > REG(負載)

這是一個AT Y86的& T-語法的風味,其中目的地變爲第二。 T & T語法使用%$裝飾以避免註冊名稱和符號混淆。 IDK,如果這使解析器變得更小或更大。


將此想法應用於x86,可以針對不同形式的相同指令使用不同的助記符。

如果您關心的是比現有的asm語法更容易解析的人類可讀性和相似性,那麼您始終可以在mod/rm字節中按編碼順序列出操作數。例如

addbir al, 5 ; b = byte, i = immediate, r = register. opcode 80 /0 with al encoded in the mod/rm byte, imm8 
addbia al, 5 ; a = ax/al: opcode 04 imm8 

; w=word, m=memory 
addwrm cx, 0, bx, ; add cx, [0 + bx + (no index)] encoding: 03 mod/rm 
addwmr cx, 0, , si ; add [0 + (no base) + si], cx encoding: 01 mod/rm 

請注意最後兩行:第一個操作數始終是mod/rm字節中的「r」,而不是目標。它是指令編碼的文本表示,而不是人類可用的語法。我認爲這就是你想要的那種想法?

取決於你希望彙編程序有多聰明,你可以選擇imm8和imm16形式的立即指令。對於disp8,disp16或無位移存儲器編碼,可能更容易要求0而不是空的條目。


通常情況下每個人都希望的是挑選最適合你的編碼(例如,使用特定的EAX操作碼,不使用MOD/RM字節)智能彙編。 ESP。對於x86-64,在不需要時避免使用REX前綴,或將mov rax, 0x1234優化爲mov eax, 0x1234,這很好。

使用不同的助記符對mov-immediate肯定會有價值,因爲這是一個common source of confusion for asm beginners。 (尤其是因爲MASM和NASM語法在mov reg, symbol的含義上有所不同)。

+0

這正是我一直在想的,我不得不花費一些時間在指令編碼中找到模式,並找出巧妙的東西。 y86似乎是一個很好的資源,從來沒有聽說過它,謝謝! –

+0

@ JonathanJ.Bloggs:對於任何東西,y86都是過於簡化的,除了嬰兒步驟介紹到asm類的玩具例子。它甚至沒有乘法,除法,甚至移位指令(除了「向左移添加相同,相同」),很多事情都不可能有效地實現。它的一些版本有'cmov',[所以你至少可以模擬'setcc'](http://stackoverflow.com/questions/36585746/the-most-efficient-way-of-counting-positive-negative-and -Zero-數使用環/ 36587614#36587614)。它只有add,sub和,xor和無符號分支條件(只有簽名)。 –

+0

由於兩週過去了,我不知道我是否應該接受你的答案;你的回答雖然有用,但主要是陳述我已經想到的東西(以及在問題中暗示的東西)。所以這就是爲什麼我還沒有將您的答案標記爲「已接受」。不過謝謝!我只簡要地看了看y86文檔,現在我看到你是對的,它太基本了。 –