y86是一個大大-過於簡化架構(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
的含義上有所不同)。
與大多數平臺(和其他語言)相比,8086彙編器很容易,所以您的目標是什麼?如果你只是想學習如何,那麼我建議構建一個8086彙編器的簡化子集,並繼續擴展它的功能,直到你有一個完整的8086彙編器。我能夠在大約1000行Python中編寫一個PIC16F彙編程序(大約在2008年),並且在大約2500行C中(大約在2001年)編寫80286彙編程序,因此這些彙編程序在任何時間段都不算大。你想在8086彙編器中實現這個嗎?即便如此,如果你組織好代碼,它應該相當簡單。 –
是的,一個普通的x86彙編器很簡單(使用表驅動的方法),但已經完成。 我想讓我的體型更小,同時仍然可用/有用,所以我正在尋找任何切角。 無論如何,看x86指令與助記符,關於備用助記符集(等)的問題只是要問。 –
好的,所以你希望比......彙編更接近金屬?你意識到它是裸機,對吧?它是數字指令編碼的一種表示形式,它儘可能地接近你的想法。也許你希望能夠代表的例子有助於澄清這一點? –