什么8086指令接受代表?
我在汇编程序中尝试了这段代码,设置为16位模式:16REPmov ds,ax0,没有抛出错误。这是有效的吗?rep不应该只处理字符串指令吗?写这篇文章是不是很别致?mov d
解答动态
[您可能需要添加更多的信息,比如您使用的是什么汇编程序,或者您希望出现什么类型的“错误”。从汇编程序?链接器?调试器?或者一些操作系统/运行时?否则很难给出任何明确的答案。]
在一般情况下,REP只是一个操作码,它可以像任何其他操作码一样出现在任何地方。它本身并不是无效的。现在,当谈到有用性时,在任何字符串操作之前,它可能更有意义。
因此,也许你自己会回答,为什么你希望被阻止使用它-以及被什么组件阻止?
底层问题可能更多地与所使用的汇编程序有关。一般来说,汇编程序意味着允许程序员生成任何他想要的代码——甚至是非法的。尽管人们可能希望得到一些警告,但这个案子在任何方面都不违法。此外,汇编程序无法猜测该指令是要执行的代码还是某些数据,例如用于在运行时合成指令。我会删除任何一个在他试图:)
所有的时候阻止我编程的汇编程序。但它只会对一些特定的操作产生影响。
原始8086没有未定义的操作码异常,因此每个操作码都必须执行某些操作,即使在形式上未定义的情况下也是如此;这包括在未记录的指令上使用rep(0xf3)前缀。对于它们中的大多数,前缀只是被忽略了,但情况并非总是如此;正如最近发现的那样,在乘法和除法指令上使用rep将反转结果的符号。
8086的后继者80186添加了#UD(非法操作码)异常,显然,它只针对未定义的指令触发,而不是其他定义的指令和前缀的未定义组合。后来对体系结构的修改将触发对锁前缀的未定义使用的UD,但不是rep。我不清楚英特尔当时的理由是什么,尽管有时这在以后的体系结构修订中会被证明是有用的:例如,由于奔腾4的编码与rep nop相同,因此可用的暂停指令意味着体系结构的早期版本将忽略它,允许操作系统立即使用它而不必担心向后兼容性。一个类似的例子是rep ret指令,用于解决某些AMD CPU中的性能缺陷。
尽管如此,前缀与指令的未记录组合仍然未定义,未定义行为的所有常见后果是:它们可能会在随后的版本或架构的替代实现中中断,他们的行为可能是不确定的,他们可能会引发奇怪的行为,甚至包括天真无邪的行为。(这曾经挫败了我自己为旧CPU创建SSE2软件仿真器库的尝试:一些SSE2指令是通过在有效的MMX指令上使用rep前缀来编码的。较旧的CPU会执行MMX指令并忽略前缀,而不会引发非法操作码异常。)您最好不要使用它们,除非您有很好的理由忽略此类问题。- End
免责声明:
本页内容仅代表作者本人意见,若因此产生任何纠纷由作者本人负责,概与琴岛网公司无关。本页内容仅供参考,请您根据自身实际情况谨慎操作。尤其涉及您或第三方利益等事项,请咨询专业人士处理。