2

大家好,我有一个关于 x86 的问题。在英特尔手册中,某些指令可能采用不同类型的内存操作数。例如。IDIV r/m8 或 IDIV r/m16 或 IDIV r/m32 或 IDIV r/m64 现在它们都是 IDIV 是否有可能知道操作数是 m8、m16、m32 还是 m64?我在想如果操作数是 m8 那么它是由一个 8 位寄存器寻址的,例如。ax if 32 then eax,esp ...我的假设是否正确?如果我错了请纠正我欢迎任何建议谢谢

4

2 回答 2

0

是的,用作操作数的寄存器解决了歧义。(但是请注意,这ax是一个 16 位寄存器,而不是 8 位寄存器——分别是高字节ahal低字节。)

如果您只指内存操作数,则需要使用BYTE PTR,WORD PTRDWORD PTR说明符来解决歧义,如下所示:

mov dword ptr [eax], 0

此示例将包含在地址中的 32 位数量(“双字”)设置eax为 0。

于 2010-12-16T19:10:50.187 回答
0
  1. 无论操作数是 m8、m16 还是 m32,用于寻址内存位置的寄存器可以是 8、16 或 32 位 - 都是有效的 afaik。

  2. 要指定要从内存中读取多少位,您需要使用大小说明符之一byteword或者dword在地址之前使用。例如:

idiv byte [bx] ; m8

idiv word [bx] ; m16

idiv dword [bx] ; m32

于 2010-12-16T19:22:42.297 回答