Assembly SHLD和SHRD是如何真正工作的?

Assembly SHLD和SHRD是如何真正工作的?,assembly,Assembly,我读过英特尔的手册,但大部分都不懂。我试图通过使用两个32位寄存器将四字(64位)十进制转换为字符串 mov eax,dword[value+4] mov ecx,dword[value] shld eax,ecx,1 *;This translates to what?* ... value dq 45678910123457 我最后得到了什么?我可以用这种方式分隔数字(稍后转换为ASCII)吗?怎么做 编辑:好的,更具体地说-对于dword integer(以10为基数),我可以使用多个

我读过英特尔的手册,但大部分都不懂。我试图通过使用两个32位寄存器将四字(64位)十进制转换为字符串

mov eax,dword[value+4]
mov ecx,dword[value]
shld eax,ecx,1  *;This translates to what?*
...
value dq 45678910123457
我最后得到了什么?我可以用这种方式分隔数字(稍后转换为ASCII)吗?怎么做

编辑:好的,更具体地说-对于dword integer(以10为基数),我可以使用多个div分隔数字。但是对于四字数据,使用DIV是不可能的。我认为SHLD在某种程度上可以完成这项工作,但我不知道它是如何工作的

SHLD/SHRD - Double Precision Shift (386+)

        Usage:  SHLD    dest,src,count
                SHRD    dest,src,count
        Modifies flags: CF PF SF ZF (OF,AF undefined)

        SHLD shifts dest to the left count times and the bit positions
        opened are filled with the most significant bits of src.  SHRD
        shifts dest to the right count times and the bit positions
        opened are filled with the least significant bits of the second
        operand.  Only the 5 lower bits of count are used.
哇,一个简单的谷歌,答案非常清楚

就你所选的数字而言,它太大了,我的计算器无法将其转换为十六进制,所以我无法帮助你,但是如果你真的想知道,为什么不直接输入(剪切粘贴)代码并运行它并打印出答案呢?你试过的时候得到了什么

这些是针对二进制而不是十进制的,您可以使用它们来右移或左移(乘以或除以2的幂),以获得不适合单个寄存器的值


计算机不是以10为基数的。非常古老的以10为基数的指令(BCD)已经不再使用了,我们程序员已经几十年没有考虑过以10为基数的指令了。这些对10进制的任何东西都没有用。

你会得到
eax=21270
(我想)。和往常一样,按位运算的结果在十进制中看不太清楚。我不明白这和十进制(对吧?)数字有什么关系。我建议你用十六进制而不是十进制来更好地“看”二进制运算。谢谢harold。我从某个地方读到(我只是不记得在哪里),对于更大的数据,我可以使用SHLD将数字分隔成ASCII。我现在的问题是如何开始使用SHLD.IDIV接受64位的红利,存储在EDX:EAX中。SHLD是一把不会敲打任何钉子的锤子。@mOskit0-我已经完成了十六进制和二进制代码。没问题。翻译得很自然。现在唯一的问题是将四字数据的base-10转换为ascii。