如果 x86 没有符号标志 (SF),它是否仍然是完全可编程的?

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

iCMS 回答:如果 x86 没有符号标志 (SF),它是否仍然是完全可编程的?

您甚至不需要任何标志,因为在 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或右移获得

,

是的,如果没有 SF,x86 仍然是图灵完备的,甚至可以相当高效地编程。有符号整数比较(== / != 除外)会更慢,但仍然可行。因此,x86-without-SF 仍然比单指令计算技巧(例如仅使用 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 之后执行此操作,也许您会选择移位或旋转计数以将其与 OF 对齐。)


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

,

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

本文链接:https://www.f2er.com/494472.html

大家都在问