Go 汇编器是从Plan 9 汇编器派生的,几乎没有变化。Plan 9 汇编器的设计理念是它们应该在所有体系结构中具有通用的语法和命名约定。虽然在 Go 工具链的框架内使汇编代码更加一致,但对于更熟悉传统汇编程序的人来说,阅读这样的汇编代码有时会非常混乱。
至于有问题的指令CMOVLMI BX, DX
,具体来说;它展示了 Go 汇编器的一些特殊设计选择。助记符CMOVLMI
必须像 ARM 助记符一样阅读,其中CMOV
是操作,L
是操作数大小(长字,32 位),MI
是执行它的条件(减号,即符号标志集)。操作数大小遵循已建立的 DEC 约定,其中、B
、W
、L
和Q
分别代表O
字节、字、长字、四字和八字。条件代码遵循 M68k 约定;这是一个方便的翻译表:
Go syntax Intel syntax read
--------- ------------ ----
OS o Overflow Set
OC no Overflow Clear
CS, LO b, c, nae Carry Set / LOwer
CC, HS nb, nc, ae Carry Clear / Higher or Same
EQ e, z EQual
NE ne, nz Not Equal
LS be, na Lower or Same
HI nbe, a Higher
MI s MInus
PL ns PLus
PS p, pe Parity Set
PC np, po Parity Clear
LT l, nge Less Than
GE nl, ge Greater or Equal
LE le, ng Less or Equal
GT nle, g Greater Than
助记符LO
和HS
被交换为进位是借位的倒数的目标,例如 ARM。对于跳转指令,英特尔语法变体被认为是替代助记符以简化转换。然而,其他指令并非如此。
此外,Go 汇编器不会通过给不同的寄存器大小不同的名称来区分通用寄存器大小(除了AL
, BL
, CL
, 并且DL
支持与AH
, BH
,CH
和保持一致DH
)。寄存器BX
可以引用 、 、 和 中的任何一个bl
,bx
具体ebx
取决于rbx
指令的操作数大小。
最后,操作数排序遵循 AT&T 约定,即源,然后是目标。
因此,该指令对应于 Intel 指令
cmovs edx, ebx
为了比较不同的表示,objdump
Go 工具链附带的实用程序支持一个-gnu
标志。除了 Plan 9 语法之外,这还转储了 GNU 语法中的指令,便于比较两者。