我在程序集“已定义”中使用两种语法看到“变量”,第一种看起来像标签,第二种看起来像变量名。两者可以互换使用,还是每个使用的具体原因是什么?
例如:
msg db "Hello World",0x0a
看起来有点像C / C ++中的变量名,而
msg: db "Hello World",0x0a
看起来有点像asm或C / C ++中的标签。
是否有理由使用一种或另一种语法?
他们之间有什么区别?
如果我msg: db "Text",0x0a
,我可以mov rax, [msg]
还是需要mov rax, [msg:]
?
答案 0 :(得分:3)
来自NASM documentation:The colon after a label is also optional.
我想这意味着这两段代码都会创建一个名为msg
的标签。
代码风格,可读性和&一致性浮现在脑海中作为使用其中一种的原因。但是看到语义是一样的,我想这是唯一的原因。
鉴于x: db 0
和x db 0
,两者都会创建一个名为x
的标签。
我会说你会做mov rax, [msg]
。这是因为在NASM中,当您创建标签时,末尾的分号不包含在名称中,而是提示汇编程序已达到标签名称的末尾。