【发布时间】:2021-04-30 10:35:26
【问题描述】:
符号标志表示操作的结果是否定的。
现在,根据我的理解,当操作结果为负时,符号
标志已设置。但为什么它是必需的。因为如果操作返回负数
结果我们可以在目标寄存器中检查该值是负数还是正数。是否可以从 CPU 中删除这个标志标志寄存器并完成所有工作
【问题讨论】:
标签: assembly x86 cpu-architecture masm turing-complete
符号标志表示操作的结果是否定的。
现在,根据我的理解,当操作结果为负时,符号
标志已设置。但为什么它是必需的。因为如果操作返回负数
结果我们可以在目标寄存器中检查该值是负数还是正数。是否可以从 CPU 中删除这个标志标志寄存器并完成所有工作
【问题讨论】:
标签: assembly x86 cpu-architecture masm turing-complete
您甚至不需要任何标志,因为在 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 或右移轻松获得符号位
【讨论】:
Is it possible to remove this sign flag register from the CPU and get all work done答案是肯定的,速度取决于剩余多少指令和寄存器
是的,没有 SF,x86 仍然是图灵完备的,甚至可以相当高效地可编程。有符号整数比较(== / != 除外)会更慢,但仍然可行。因此,没有 SF 的 x86 仍然比仅使用 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 之后这样做,也许你会选择你的 shift 或 rotate 计数来将它与 OF 对齐。)
我认为一些 8 位 ISA 没有签署比较条件,人们仍然设法在它们上完成一些工作。 :P
【讨论】:
是的,事实上,这就是 MIPS 的工作方式。 MIPS 没有标志、没有符号标志、没有溢出标志、没有零标志等。它有指令可以测试寄存器的零/非零、 0。
【讨论】: