【问题标题】:Would x86 still be fully programmable if it didn't have the Sign Flag (SF)?如果 x86 没有标志标志 (SF),它是否仍然是完全可编程的?
【发布时间】:2021-04-30 10:35:26
【问题描述】:

符号标志表示操作的结果是否定的。
现在,根据我的理解,当操作结果为负时,符号 标志已设置。但为什么它是必需的。因为如果操作返回负数 结果我们可以在目标寄存器中检查该值是负数还是正数。是否可以从 CPU 中删除这个标志标志寄存器并完成所有工作

【问题讨论】:

    标签: assembly x86 cpu-architecture masm turing-complete


    【解决方案1】:

    您甚至不需要任何标志,因为在 x86 MOV is already Turing-complete 中,有一个 compiler that can compile C code into an executable with only MOVs(或只有 XOR、SUB、ADD、XADD、ADC、SBB、AND/OR、PUSH/POP、1- 之一位移,或 CMPXCHG/XCHG)

    如果您有按位运算,则可以使用AND 或右移轻松获得符号位

    【讨论】:

    • 图灵完备,是的,但我认为其中大多数都需要 许多 指令来完成最常见的操作,不再将大多数 C 操作映射到一小块指令中的一个,对吧?就像将更宽的整数分解成多个位一样?所以是的,但我们可以做得比这更好,请参阅我的回答。
    • @PeterCordes 是的,显然它很慢。但是OP的问题是它是否可行,而不是性能。 Is it possible to remove this sign flag register from the CPU and get all work done答案是肯定的,速度取决于剩余多少指令和寄存器
    • 没错,但我认为有趣的是,失去 SF 不会对太多造成太大伤害,并且不需要一直回到那些方法。同意指出您可以在删除内容方面走多远并且仍然是图灵完备的(有限存储除外)也很有趣。
    【解决方案2】:

    是的,没有 SF,x86 仍然是图灵完备的,甚至可以相当高效地可编程。有符号整数比较(== / != 除外)会更慢,但仍然可行。因此,没有 SF 的 x86 仍然比仅使用 MOV(具有大量查找表和寻址模式)的单指令计算黑客更高效您仍然可以使用普通指令进行普通的加/减/乘,只需模拟涉及 SF 的有符号比较条件。

    例如,您可以使用两个临时寄存器来模拟cmp eax, ecx/jljl jumps if SF != OF。 (可能有更简单的方法来进行这种模拟,但这最直接地表明您可以将结果的 MSB 放入 SF 以外的标志中,因此可以在其他情况下进行模拟。)

    ; inputs: EAX and ECX
    ; clobbers: EDX and EAX
    ;;; jumps if EAX < ECX,  like cmp eax,ecx / jl
    
        mov  edx, eax
        sub  edx, ecx        ; sets OF, and would set SF it it existed
        bt   edx, 31         ; CF = MSB, other flags unmodified.
     ;; jump if CF != OF    , like jl = SF!=OF in normal x86
        pushf
        pop  eax
        and  eax, 0x0801     ; isolate CF and OF
        or   al, ah          ; combine both into the low byte, setting FLAGS
        jpo  eax_lower       ; jump if parity odd: CF != OF means only one bit is set
    

    (EFLAGS bit positions)

    注意PF,奇偶校验标志,只根据结果的低字节设置;在 AND 之后,它只能告诉你 CF,EFLAGS 的第 0 位。 OF 在 FLAGS 的低字节之外是一个不幸的设计决定,否则 lahf 可以替换 pushf/pop reg。

    这只是我想到的第一个想法,我相信它可以更有效地完成。 (但是很多代码会支持无符号数,因此比较可以完全有效。)

    如果您必须避免 386 BT 只设置 CF 而不会弄乱其他位,您当然可以只使用 shr dx, 15 将 MSB 降到底部,或 rol dx, 1。 (但这写的是 FLAGS,所以你会在 pushf/pop reg 之后这样做,也许你会选择你的 shift 或 rotate 计数来将它与 OF 对齐。)


    我认为一些 8 位 ISA 没有签署比较条件,人们仍然设法在它们上完成一些工作。 :P

    【讨论】:

      【解决方案3】:

      是的,事实上,这就是 MIPS 的工作方式。 MIPS 没有标志、没有符号标志、没有溢出标志、没有零标志等。它有指令可以测试寄存器的零/非零、 0。

      【讨论】:

      • 当然,但是 x86 没有用于签名条件的比较和分支指令,因此这并不能真正解决禁用/删除 SF 的纯 x86。 (不是一个设计为在没有 SF 的情况下高效的 ISA。)但是如果 OP 不知道这一点,那么是的,当然,值得一提。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      相关资源
      最近更新 更多