2016-09-21 147 views
-1

比方说,我们在组装这样一行:从32位到64位将在装配

.loop: 
     cmp %esi, %rcx 

我知道,一个寄存器用于32位,另一个是64位。但是是否可以将%rcx转换为32位,以便在尝试运行代码时不会出现错误?我知道我可以使用ecx,但我想看看是否有可能使用%rcx

+1

你要求做的事情是不可能的,没有意义。但是,您可以使用%rsi,即64位寄存器,其下半部分为%esi。编辑:要清楚,我建议你执行64位比较。否则,问题就变成了什么应该比较一个32位和一个64位值呢? 32位值是无符号还是带符号? – icecreamsword

+0

嗨, 32位值是无符号的。 – Andrew

+2

有2^64个唯一值可以用64位表示。只有2^32个唯一值可以用32位表示。因此,试图将一个64位值存储在一个32位变量中将会丢失数据。相反是不正确的。碰巧,只要你在AMD64上编写一个32位寄存器,它就会被零扩展到64位。如果您知道写入%esi的内容,则%rsi是64位,零扩展值。 – icecreamsword

回答

1

而不是使用32位的%ECX注册,你想要做的是使用64位%RSI寄存器:

.loop: 
    cmp %rsi, %rcx 

无论您使用什么尺寸,寄存器宽度必须匹配。 32位寄存器写操作始终为零扩展并写入AMD64的完整64位寄存器。如果您知道%esi是作为32位值计算或加载的,则%rsi是零扩展到64位的相同值。

+0

这正是我所期待的。现在它是有道理的,我担心这是不可能的,因为我没有将其他寄存器更改为64位等价物。 – Andrew