相关疑难解决方法(0)

指令解码器如何在32位模式下区分EVEX前缀和BOUND操作码?

在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前缀中一样.

https://en.wikipedia.org/wiki/EVEX_prefix

那么他们如何能够干净地解码该指令?


我查看了英特尔手册,他们似乎只提到了VEX中的位反转,而不是EVEX.

OTOH表中的沙堆说,在这些EVEX RxB位也应该被反转.

哪一项是正确的?

x86 assembly opcode instructions

9
推荐指数
1
解决办法
358
查看次数

为什么MASM中的"DIV EDX"总是会产生处理器异常?

上个学期我在信息学的计算机体系结构考试中得到了这个问题: "为什么MASM中的'DIV EDX'总是会产生处理器异常?"
产生异常的机制是什么?

x86 assembly exception division

5
推荐指数
1
解决办法
1500
查看次数

DOSBox上的8086汇编:带有idiv指令的Bug?

我帮助我的一个朋友调试他的程序,我们把它缩小到一个甚至在这里发生的问题:

.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的指令,这对于一些原因,修改csip登记,并经过两次看似随意指令恢复它们指向idiv线,再次执行它循环往复.

有没有人对此有任何解释?

x86 assembly tasm dosbox x86-16

5
推荐指数
1
解决办法
809
查看次数

标签 统计

assembly ×3

x86 ×3

division ×1

dosbox ×1

exception ×1

instructions ×1

opcode ×1

tasm ×1

x86-16 ×1