assembly BX是否与EBX在x86中具有相同的值?

tcbh2hod  于 4个月前  发布在  其他
关注(0)|答案(1)|浏览(91)

假设我们有下面的代码,其中val1,val2和sum是32位,BX是BX寄存器。

sum = (val1 + BX) - val2

字符串
在编写代码和使用BX寄存器时,我们可以直接使用EBX而不是使用movzx EBX, BX吗?

rkue9o1l

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。在这些指令之一之后,如果您知道并应用正确的有符号性,则BXEBX中的数值将是相同的数字。
如果你不知道BX的有符号性,那么这个问题是模糊的。
我们通常发现值的有符号性的方法是被告知-通常是由程序员通过使用C或其他语言中的数据类型的变量声明。变量的类型被编译器记住并翻译成适当的指令,如movsxmovzx,当需要扩展16位值以参与32位算术时。所以,程序员编写一个程序,它通知编译器要做什么。如果像你所展示的代码片段缺少信息(例如类型声明),编译器(或汇编程序员)会有完整和可编译的信息。
(You还必须考虑是否允许您修改EBX,我认为通常在代码片段的上下文中,答案是肯定的,因为BX已经有了感兴趣的值。但是,为了清楚起见,您可以将扩展值发送到另一个寄存器,例如movzx EAX, BX-不必将符号/零扩展到同一个寄存器。)

相关问题