微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

解决方法

您甚至不需要任何标志,因为在 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 的指令。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?