大家好,我有一个关于 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 ...我的假设是否正确?如果我错了请纠正我欢迎任何建议谢谢
问问题
2697 次
2 回答
0
是的,用作操作数的寄存器解决了歧义。(但是请注意,这ax
是一个 16 位寄存器,而不是 8 位寄存器——分别是高字节ah
或al
低字节。)
如果您只指内存操作数,则需要使用BYTE PTR
,WORD PTR
或DWORD PTR
说明符来解决歧义,如下所示:
mov dword ptr [eax], 0
此示例将包含在地址中的 32 位数量(“双字”)设置eax
为 0。
于 2010-12-16T19:10:50.187 回答
0
无论操作数是 m8、m16 还是 m32,用于寻址内存位置的寄存器可以是 8、16 或 32 位 - 都是有效的 afaik。
要指定要从内存中读取多少位,您需要使用大小说明符之一
byte
,word
或者dword
在地址之前使用。例如:
idiv byte [bx] ; m8
idiv word [bx] ; m16
idiv dword [bx] ; m32
于 2010-12-16T19:22:42.297 回答