gpt4 book ai didi

go - Go,x64汇编和CMOVLMI : Where is this opcode described?

转载 作者:行者123 更新时间:2023-12-03 10:08:42 25 4
gpt4 key购买 nike

我正在阅读Go源代码,就像读过一样,当我阅读fastrand()函数时(对于我的机器,该函数位于asm_amd64.s文件中),我遇到了以下片段:

    XORL    $0x88888eef, DX
CMOVLMI BX, DX
MOVL DX, m_fastrand(AX)

对于我的一生,我无法弄清楚 CMOVLMI应该做什么。搜索它表明,只有Go似乎对它一无所知。我可以在AMD X86_64引用中找到许多定义的 CMOVxx操作码,并且 Wikipedia Page有很长的条件移动指令历史,但是在列表中没有出现。

CMOVLMI在哪里定义?它是Go的内部汇编程序独有的吗?

最佳答案

Go assemblers来自Plan 9 assemblers,几乎没有变化。 Plan 9汇编程序的设计概念是,它们应该在所有体系结构中具有通用的语法和命名约定。在使汇编代码在Go工具链的框架内更加一致的同时,有时对于那些更熟悉常规汇编程序的人来说,阅读这样的汇编代码可能会非常困惑。
至于相关的指令CMOVLMI BX, DX,特别是;它展示了Go汇编器的一些特殊设计选择。助记符CMOVLMI必须像ARM助记符一样读取,其中CMOV是操作码,L是操作数大小(长字,32位),MI是执行它的条件( mi nus,即标志集) 。操作数的大小遵循已建立的DEC约定,其中BWLQO分别代表 b yte, w ord, l ongt单词,和单词。条件代码遵循M68k约定;这是一个方便的翻译表:

Go syntax Intel syntax
--------- ------------
OS o
OC no
CS, LO b, c, nae
CC, HS nb, nc, ae
EQ e, z
NE ne, nz
LS be, na
HI nbe, a
MI s
PL ns
PS p, pe
PC np, po
LT l, nge
GE nl, ge
LE le, ng
GT nle, g
助记符LOHS交换为进位与借位成反比的目标,例如ARM。对于跳转指令,英特尔语法变体被视为替代助记符,以简化过渡过程。但是,其他指令则不是这种情况。
此外,Go汇编器不会通过给不同的寄存器大小指定不同的名称来区分通用寄存器的大小(除了ALBLCLDL,与AHBHCHDH保持一致)。取决于指令的操作数大小,寄存器BX可以引用blbxebxrbx中的任何一个。
最后,操作数排序遵循AT&T约定,即源,然后是目的地。
因此,该指令对应于英特尔指令
cmovs edx, ebx
为了比较不同的表示形式,Go工具链附带的objdump实用程序支持-gnu标志。除了Plan 9语法外,它还以GNU语法转储指令,从而使两者之间的比较变得容易。

关于go - Go,x64汇编和CMOVLMI : Where is this opcode described?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41066226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com