Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86-64汇编:理解四字操作码'shlq`_Assembly_X86 64 - Fatal编程技术网

Assembly x86-64汇编:理解四字操作码'shlq`

Assembly x86-64汇编:理解四字操作码'shlq`,assembly,x86-64,Assembly,X86 64,我想确认我对这个特定操作码的理解 该行来自x-86-64机器(MBP 15“2017)的装配代码 我被这个指示弄糊涂了 shlq $5, %rsi 所以我知道的是: shl是一种逻辑移位 q这里是表示四字的后缀,在x86-64机器中是8字节或64位 但我不确定它总共会移位多少位 所以我做了一个广泛的研究,发现了一些最相关的东西。在第47页,它说: sal(或其同义词shl)左移(乘以)一个字节、字或 由立即数指定的计数的长值,并存储 该字节、字或长的乘积。第二个变量左>移位CL寄存器中指

我想确认我对这个特定操作码的理解

该行来自x-86-64机器(MBP 15“2017)的装配代码 我被这个指示弄糊涂了

shlq    $5, %rsi
所以我知道的是:

  • shl
    是一种逻辑移位
  • q
    这里是表示四字的后缀,在x86-64机器中是8字节或64位
  • 但我不确定它总共会移位多少位

    所以我做了一个广泛的研究,发现了一些最相关的东西。在第47页,它说:

    sal
    (或其同义词
    shl
    )左移(乘以)一个字节、字或 由立即数指定的计数的长值,并存储 该字节、字或长的乘积。第二个变量左>移位CL寄存器中指定的计数值。高阶位 被移入进位标志;低位被设置为0

    我不确定它们在这里的确切含义,尤其是“将产品存储在该字节、字或长”部分,但以下是我的理解:

    shlq$5,%rsi

    这将向左移动5次。这将使该值成为其原始值的2^5=32倍。然后,它将该值与相应的字大小乘积,在本例中为四字,因此为8字节或64位。换句话说,它将移动32*64=2048位或32*8字节=256字节。

    我说的对吗?

    上面的同一页下面有一个例子,但我无法理解

    范例

    左移位,由常量(253)指定的计数,32位内容 有效地址(由EDI寄存器加上偏移量寻址) 共4项):
    shll$253,4(%edi)

    谢谢你的帮助

    研究的文件:

    ……还有更多


    你的直觉是正确的,直到“然后,它会将该值与相应的单词大小进行乘积,在本例中为四字”部分。这部分没有发生。值只是乘以32,这就是它的全部。

    rsi中的实际值左移了5位。这在无符号数学中等于
    rsi=rsi*32
    ,因此2^5仅用于解释如何考虑左移,但
    shl
    本身将只需移动位。我还认为CF设置为将进入不存在的b64的位(即最初的b59,而不是最初的顶部位b63)文档中没有提到四字,只是很长,所以它不是64位的最新版本,但是
    rsi
    是64位寄存器,所以64位值被移位+处理。请记住
    rsi
    实际上是在芯片64位中,即64个单元的编码值为0或1,所以“移位”它们“是一种从一位到另一位的简单复制,一个接一个,按照
    shl
    的另一个参数指定的正确距离。CPU不关心乘法、乘积或二的幂,它只移动这些位并清除底部的位。SHL是逻辑左移,SAL是算术左移。不过,这两个指令的作用完全相同(与SHR和SAR不同)@MichaelPetch,谢谢。但我真的很好奇你是如何发现这种区别的。我看了文档,但它只说它们是同义词。还是我错过了什么?您可能希望在Felix Cloutier的网站上查看生成的信息:。那里的文档是直接从英特尔手册中摘录的。哦,不。。这实际上让我更加困惑。我现在会更新这个问题,然后让你知道。@Leonard:Intel的手册准确地记录了每一条指令的作用:。请注意移位计数是如何被屏蔽的,因此如果它大于31(或对于64位移位大于63),它将被屏蔽。@PeterCordes谢谢。你能指出文件中的位置吗?我确实遇到过这个文档,但我不理解这个文档,因此我无法识别哪个部分是相关的。@Leonard:“操作”部分是详细的伪代码,它准确地告诉您位发生了什么。“描述”部分也值得一读,以帮助理解它的英语。文档中的大部分复杂性是描述标志发生了什么;整数结果正是你在C中从
    x中得到的结果。如果你感到困惑,最好扔掉英特尔文档,阅读更容易理解的AMD文档:第301页。