传统上,汇编器使用#
表示立即数。至少从DEC PDP-11汇编程序开始,这是正确的。可能更长。
这是来自Kermit-11(https://gitlab.com/Rhialto/kermit11/blob/master/k11cvt.mac)
10$: tst r1 ; current state is zero?
beq 20$ ; yes, exit then
clr r3 ; get the next ch please
bisb (r2)+ ,r3 ; simple
bic #^c<177>,r3 ; ensure in range 0..127
dec r1 ; use previous state to get the
mul #10 ,r1 ; index into the state table line
movb chtype(r3),r0 ; /BBS/ column
add r0 ,r1 ; add in the character class line+col
movb ptable(r1),r1 ; and get the new state of system
beq 20$ ; all done if new state is zero
bmi 30$ ; error exit if < 0
clr r0 ; now mask off the action index from
div #10. ,r0 ; the new state
asl r0 ; word indexing to action routine
jsr pc ,@paction(r0) ; simple
br 10$ ; next please
但是,GNU汇编程序似乎使用$
:
main:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movl %edi, -4(%rbp)
movq %rsi, -16(%rbp)
movl $0, %eax
popq %rbp
ret
即使$通常用于表示十六进制常量。至少从6502和68000汇编程序开始就是如此。 http://6502.org/source/games/uchess/uchess.htm中的随机示例:
; 6551 I/O Port Addresses
;
ACIADat = $7F70
ACIASta = $7F71
ACIACmd = $7F72
ACIACtl = $7F73
8x86指令通常(首先是目标操作数,第二是源操作数)(这让我非常烦恼,因为我习惯了另一种方式)。但是用于x86 / x86_64代码的GNU汇编器交换操作数顺序。请参阅movl $0, %eax
,否则将没有任何意义。
另外(例如,请参见* in front of instruction operand, GNU assembly, AMD64),GNU汇编器使用*
而不是@
来指示第二级间接访问(比较PDP-11 jsr pc,@paction(r0)
)
为什么GNU汇编器违反所有这些标准?