2016-04-29 75 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文档,现在我看到你是对的,它太基本了。 –