这是标新立异的风格,至少可以说,我从来没有见过任何人,之前写的,用于解决静态标签没有寄存器。
这可能是试图指示SIB字节(无基座或索引),而不是允许汇编使用较短的编码,只需ModRM字节。
(是的,这是可能的。32位寻址模式具有2点冗余的方式来编码[disp32]
绝对地址。X86-64重新定义了较小者做为RIP相对寻址参见rbp not allowed as SIB base?)
但是,目前的天然气忽略它,并对其进行编码一样只是var
。
因此,也许这是提醒你,这是内存操作,像往常一样在Intel的语法,而不是[var]
(这是英特尔的语法MASM风格的味道,如GNU mov var, al
有效的,但不是NASM)使用.intel_syntax
的尝试。
什么是这样的后缀一般语法?
或者,也许他们只是在做它总是使用存储器操作数的disp(basereg, idxreg, scale)
语法,省略未利用部分的一致性。
测试来源:
var: # this won't be in writeable memory, it will assemble but not run
movb $5, var
movb $5, var(,1)
movb $5, (var) # turns out this is valid, too!
#movb $5, var(%rip) # RIP-relative is x86-64 only, but it's recommended when available.
# movb $5, var() # Error: junk `()' after expression
# movb $5, (var,,1) # also invalid
# movb $5, (var,%ecx,1) # also invalid.
# movb $5, (var+%eax,%ecx,1) # also invalid.
as --version
打印GNU assembler (GNU Binutils) 2.31.1
我的系统上。
$ gcc -m32 -no-pie -nostdlib foo.s
/usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008049000
# I just wanted a linked binary with real addresses filled in, not to run it.
# entry = start of the .text section is fine.
$ objdump -drwC -Mintel a.out
08049000 <var>:
8049000: c6 05 00 90 04 08 05 mov BYTE PTR ds:0x8049000,0x5
8049007: c6 05 00 90 04 08 05 mov BYTE PTR ds:0x8049000,0x5
804900e: c6 05 00 90 04 08 05 mov BYTE PTR ds:0x8049000,0x5
锵7.0内置的汇编程序还接受所有3个变型气体确实,使得相同的二进制文件。 (至少我在拆卸.text
部分;在另一部分可能是一些差异的地方。)
因此,或许cmp $1, (var)
是使存储器操作数显式的好办法?但它不是很大,因为与英特尔的语法,你不能只是增加寄存器的是,你必须移动var
的括号内。