Assembly 不带后缀的汇编mov指令
我有以下来自反汇编程序的mov指令(不带后缀)Assembly 不带后缀的汇编mov指令,assembly,x86,att,Assembly,X86,Att,我有以下来自反汇编程序的mov指令(不带后缀) mov %dx,(%eax) 指令后缀是什么?首先我认为目标寄存器决定后缀,但是根据我正在读的书,我猜它是由“最小”寄存器决定的。所以在这种情况下 movw %dx, (%eax) 因为%dx(16位字寄存器)是最小的。 我的推理正确吗?(有时CSAPP手册有点混乱,没有清楚地解释细节)。在您的示例中,目的地不是寄存器,而是源寄存器。因此操作数大小为16位,因此AT&T将使用movw 目标是内存中的2个字节,由32位寻址模式选择mov要求源和目
mov %dx,(%eax)
指令后缀是什么?首先我认为目标寄存器决定后缀,但是根据我正在读的书,我猜它是由“最小”寄存器决定的。所以在这种情况下
movw %dx, (%eax)
因为%dx(16位字寄存器)是最小的。
我的推理正确吗?(有时CSAPP手册有点混乱,没有清楚地解释细节)。在您的示例中,目的地不是寄存器,而是源寄存器。因此操作数大小为16位,因此AT&T将使用
movw
目标是内存中的2个字节,由32位寻址模式选择mov
要求源和目标的宽度相同。如果至少有一个操作数是寄存器,则唯一地确定操作数大小
像mov$123、(%eax)
这样的东西需要一个显式后缀,因为两个操作数都不是寄存器
你所谓的“最小的”完全是假的
movl%eax,(%bx)
是movl
,因为寄存器操作数是32位的,并且4字节目标由16位寻址模式选择
寻址模式中的一个或多个寄存器对操作数大小没有影响。地址大小和操作数大小是独立的,可以重写其中一个,但不能重写另一个。(这就是为什么操作数大小(
0x66
)和地址大小(0x67
)有单独的机器代码前缀字节。在您的示例中,目标不是寄存器,而是源寄存器。因此操作数大小为16位,因此AT&t将使用movw
)
目标为内存中的2个字节,由32位寻址模式选择。mov
要求源和目标的宽度相同。如果至少有一个操作数是寄存器,则唯一确定操作数大小
像mov$123、(%eax)
这样的东西需要一个显式后缀,因为两个操作数都不是寄存器
“最小”的想法完全是假的。
movl%eax,(%bx)
是movl
,因为寄存器操作数是32位的,4字节的目标由16位寻址模式选择
寻址模式中的一个或多个寄存器对操作数大小没有影响。地址大小和操作数大小是独立的,您可以重写其中一个,但不能重写另一个。(这就是为什么操作数大小(
0x66
)和地址大小(0x67
)有单独的机器码前缀字节的原因。).正确。我认为其他任何东西都没有多大意义。很好的解释。谢谢!正确。我认为其他任何东西都没有多大意义。很好的解释。谢谢!一般来说,如果要传输的值的大小可以通过操作数明确确定,则不需要后缀。如果无法确定(例如mov$123,(someaddrmode),其中$123可以是8位、16位、32位甚至64位),您必须添加后缀。%dx是一个16位寄存器,因此很明显您将传输16位。明白了!谢谢。通常,如果要传输的值的大小可以通过操作数明确确定,则不需要后缀。如果无法确定,则不需要后缀(例如mov$123,(someaddrmode),其中$123可以是8位、16位、32位甚至64位),您必须添加后缀。%dx是一个16位寄存器,因此很明显您将传输16位。明白了!谢谢。