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指令与助记符,关于备用助记符集(等)的问题只是要问。 –
好的,所以你希望比......汇编更接近金属?你意识到它是裸机,对吧?它是数字指令编码的一种表示形式,它尽可能地接近你的想法。也许你希望能够代表的例子有助于澄清这一点? –