如何解决如果 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/jl
。 jl
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
注意,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 举报,一经查实,本站将立刻删除。