微软MASM运算符参考手册显示在Miscellaneous部分中有一个::
操作符。
该项目的链接打开了一个;;
操作符的页面。
我不确定这是表格中的错误名称还是项目上的错误链接。还有其他几个项目存在链接错误。
MASM是否有::
操作符?它是用来做什么的?
微软MASM运算符参考手册显示在Miscellaneous部分中有一个::
操作符。
该项目的链接打开了一个;;
操作符的页面。
我不确定这是表格中的错误名称还是项目上的错误链接。还有其他几个项目存在链接错误。
MASM是否有::
操作符?它是用来做什么的?
是的,确实如此。
我在一份旧版的TASM 4手册中找到了相关内容(印刷文件第124页,PDF文件第135页)。
它用于定义具有比其定义过程更广泛范围的标签。
考虑以下示例:
foo PROC
lbl:
ret
foo ENDP
bar PROC
jmp lbl ;Undefined symbol lbl
bar ENDP
这段代码在 MASM 中无法汇编,因为lbl
位于另一个过程中。
不过,以下代码可以:
foo PROC
lbl::
ret
foo ENDP
bar PROC
jmp lbl ;Fine
bar ENDP
据我所记,TASM / NASM中的标签行为不同,它们没有作用域(但可以让TASM模拟MASM)。
lbl:
具有文件范围。本地标签以.
开头(因此你会写.lbl:
),但它们实际上只是foo.lbl
的语法糖。因此,在bar:
之后,您仍然可以编写jmp foo.lbl
。(NASM没有任何PROC内容。如果要将“foo”标签导出到符号表中,只需编写global foo
即可。) - Peter Cordes1996年微软的MASM程序员指南6.1揭示了一些额外的语义。
双冒号::
可用于将由寄存器值生成的远指针作为过程调用中的参数传递。第157页描述如下:
您可以通过segment::offset对传递一个FAR指针,如下所示。请注意使用双冒号分隔寄存器对。
..
INVOKE SomeProc, ES::BX, arg1, arg2
::
运算符来“指示类成员”并不被 MASM 本身支持。 - Ross Ridge