ARM64中 smull指令问题

0x10065ee48 <+4256>: smull x8, w0, w27
(lldb) p/x $w0
(unsigned int) $3 = 0x14ced9f9
(lldb) p/x $w27
(unsigned int) $4 = 0x80010003
(lldb) p/x $x0*$x27 //自己测输出的
(unsigned long) $5 = 0x0a6781cb98658deb

执行后结果
(lldb) p/x $x8
(unsigned long) $6 = 0xf598a7d298658deb

有人知道smull这个指令的含义吗,为什么结果不是0x0a6781cb98658deb而是0xf598a7d298658deb

参考ARM SMULL对SMULL的解释该命令用于计算两个32位有符号数据的乘积,并将得到的64位的结果放到两个32位的寄存器中(高32位和低32位分别存入不同的寄存器)。

按照描述,该命令正确的使用格式是SMULL R4, R5, R3, R8,表示Signed (R5,R4) = R3 x R8,需要4个32位寄存器。而你这里的用法,少了一个寄存器,要么是错误用法,要么就是一种省略用法,省略了乘积的高32位,只把乘积的低32位保存到了x8,高32位没有保存丢弃了。而你把x8按照64位打印出来,其实高32位是内存随机数,应该是没有任何意义的。

温馨提示:答案为网友推荐,仅供参考