在32位模式下,英特尔通过反转寄存器扩展的高位来解决VEX前缀与LDS/LES冲突,因为ModRM字节的mod字段不能为11b
VEX前缀的初始字节值C4h和C5h与LDS和LES指令的操作码相同.64位模式不支持这些指令.为了在32位模式下解决模糊性,VEX的规范利用了合法的LDS或LES的ModRM字节不能是11xxxxxx(它将指定寄存器操作数)的事实.VEX前缀的第二个字节中的各个位字段被反转,以确保该字节在32位模式下始终为此形式.
https://en.wikipedia.org/wiki/VEX_prefix#Technical_description
但是在EVEX中,R和X位不反转,导致mod = 00b,这也表示BOUND指令中的内存操作数
来自REX前缀的四位R,X,B和W. W将操作数大小扩展为64位或作为附加操作码,R扩展reg,B扩展r/m或reg,X和B扩展索引和SIB字节中的基址.与VEX前缀相比,RXB以非反转形式提供,就像在REX前缀中一样.
那么他们如何能够干净地解码该指令?
我查看了英特尔手册,他们似乎只提到了VEX中的位反转,而不是EVEX.
OTOH表中的沙堆说,在这些EVEX RxB位也应该被反转.
哪一项是正确的?
上个学期我在信息学的计算机体系结构考试中得到了这个问题:
"为什么MASM中的'DIV EDX'总是会产生处理器异常?"
产生异常的机制是什么?
我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:
.MODEL small
.STACK 16
.CODE
start:
mov ax, 044c0h
mov bl, 85
idiv bl
exit:
mov ax, 4c00h
int 21h
end start
Run Code Online (Sandbox Code Playgroud)
用tasm 4.1组装它,然后在DOSBox 0.74上运行它,它进入一个无限循环.当涡轮调试器检查它人们可以看到它之后发生idiv的指令,这对于一些原因,修改cs和ip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.
有没有人对此有任何解释?