假设我们有下面的代码,其中val1,val2和sum是32位,BX是BX寄存器。
sum = (val1 + BX) - val2
字符串在编写代码和使用BX寄存器时,我们可以直接使用EBX而不是使用movzx EBX, BX吗?
EBX
movzx EBX, BX
rkue9o1l1#
简短的回答是不。BX是16位值,EBX是32位值。虽然它们可以表示相同的数字,但没有要求它们这样做。存储到BX中不会修改完整的EBX,所以如果你不知道BX是如何得到它的值的,你不能假设EBX持有相同的数字-我们只知道肯定的是,只有低16位是相同的。请注意,当混合数据大小时,您需要完全了解符号!例如,让我们以16位数字0xffff为例,如果这个数字被理解为有符号的,那么32位的等效数字是0xffff ffff而如果这个数字0xffff意味着被理解为无符号的,那么32位等价物是0x 0000 ffff(例如6553510)。指令movzx零扩展以假设原始BX值为无符号。而如果我们假设原始BX值是有符号的,则将使用指令movsx。在这些指令之一之后,如果您知道并应用正确的有符号性,则BX和EBX中的数值将是相同的数字。如果你不知道BX的有符号性,那么这个问题是模糊的。我们通常发现值的有符号性的方法是被告知-通常是由程序员通过使用C或其他语言中的数据类型的变量声明。变量的类型被编译器记住并翻译成适当的指令,如movsx和movzx,当需要扩展16位值以参与32位算术时。所以,程序员编写一个程序,它通知编译器要做什么。如果像你所展示的代码片段缺少信息(例如类型声明),编译器(或汇编程序员)会有完整和可编译的信息。(You还必须考虑是否允许您修改EBX,我认为通常在代码片段的上下文中,答案是肯定的,因为BX已经有了感兴趣的值。但是,为了清楚起见,您可以将扩展值发送到另一个寄存器,例如movzx EAX, BX-不必将符号/零扩展到同一个寄存器。)
BX
movzx
movsx
movzx EAX, BX
1条答案
按热度按时间rkue9o1l1#
简短的回答是不。
BX
是16位值,EBX
是32位值。虽然它们可以表示相同的数字,但没有要求它们这样做。存储到BX中不会修改完整的EBX
,所以如果你不知道BX
是如何得到它的值的,你不能假设EBX
持有相同的数字-我们只知道肯定的是,只有低16位是相同的。请注意,当混合数据大小时,您需要完全了解符号!例如,让我们以16位数字0xffff为例,如果这个数字被理解为有符号的,那么32位的等效数字是0xffff ffff而如果这个数字0xffff意味着被理解为无符号的,那么32位等价物是0x 0000 ffff(例如6553510)。
指令
movzx
零扩展以假设原始BX
值为无符号。而如果我们假设原始BX
值是有符号的,则将使用指令movsx
。在这些指令之一之后,如果您知道并应用正确的有符号性,则BX
和EBX
中的数值将是相同的数字。如果你不知道
BX
的有符号性,那么这个问题是模糊的。我们通常发现值的有符号性的方法是被告知-通常是由程序员通过使用C或其他语言中的数据类型的变量声明。变量的类型被编译器记住并翻译成适当的指令,如
movsx
和movzx
,当需要扩展16位值以参与32位算术时。所以,程序员编写一个程序,它通知编译器要做什么。如果像你所展示的代码片段缺少信息(例如类型声明),编译器(或汇编程序员)会有完整和可编译的信息。(You还必须考虑是否允许您修改
EBX
,我认为通常在代码片段的上下文中,答案是肯定的,因为BX
已经有了感兴趣的值。但是,为了清楚起见,您可以将扩展值发送到另一个寄存器,例如movzx EAX, BX
-不必将符号/零扩展到同一个寄存器。)