第四和处理器标志

时间:2016-04-26 14:24:41

标签: forth

为什么Forth不使用处理器标志进行条件执行?

而是将比较结果放在参数堆栈上。是因为内部解释器循环在转到下一条指令时可能会改变标志吗?或者仅仅是抽象条件逻辑?

E.g。在x86上,flags寄存器保存了一个比较结果,因为大多数处理器(如果不是全部的话)都有一个标志寄存器。

2 个答案:

答案 0 :(得分:2)

这取决于Forth和优化水平。

: tt 0 if ." true" else ." false" then ;

在SwiftForth(x86_64 GNU / Linux)中:

see tt
808376F   4 # EBP SUB                   83ED04
8083772   EBX 0 [EBP] MOV               895D00
8083775   0 # EBX MOV                   BB00000000
808377A   EBX EBX OR                    09DB
808377C   0 [EBP] EBX MOV               8B5D00
808377F   4 [EBP] EBP LEA               8D6D04
8083782   808379D JZ                    0F8415000000
8083788   804D06F ( (S") ) CALL         E8E298FCFF
808378D   "true"
8083793   804C5BF ( TYPE ) CALL         E8278EFCFF
8083798   80837AE JMP                   E911000000
808379D   804D06F ( (S") ) CALL         E8CD98FCFF
80837A2   "false"
80837A9   804C5BF ( TYPE ) CALL         E8118EFCFF
80837AE   RET                           C3 ok

在Gforth:

see tt
: tt
  0
  IF     .\" true"
  ELSE   .\" false"
  THEN ; ok

答案 1 :(得分:2)

由于Forth是基于堆栈的语言,为了定义语言内的操作,您必须定义结果以更改语言内的内容。标志寄存器不在语言中。显然,在优化编译器的情况下,任何给出相同最终结果的方法都是可以接受的。